<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-28329697</id><updated>2012-02-16T10:40:31.372-05:00</updated><title type='text'>MBC Computer Solutions Ltd.</title><subtitle type='html'>MBC is an IT Service Management Company in the Toronto area.  We install, support, implement and provide consulting and internet services for small businesses in the GTA.  We also specialize in ecommerce and estore applications and solutions for high transaction online stores.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>83</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28329697.post-3557322110141645842</id><published>2012-02-03T11:40:00.001-05:00</published><updated>2012-02-03T11:40:13.740-05:00</updated><title type='text'>An Experiment with Google Services &amp; Page Speed</title><content type='html'>&lt;p&gt;When building eCommerce sites, we deal a lot with performance.&amp;#160; Not just ensuring that our sites respond quickly, but also working with customers to explain what makes up the overall performance characteristics of a site, and what might be impacting theirs.&amp;#160; Unfortunately, performance tends to be misunderstood among both technical and non-technical persons.&amp;#160; Frequently we receive reports about “slow sites” with customers assuming the problem lies within our services and obviously looking for a solution.&amp;#160; In most cases, the slow-downs on the sites actually tend to come from external factors like 3rd party scripts, yet it seems like every service out there wants you to drop one of their tracking scripts on your page.&lt;/p&gt;  &lt;p&gt;There are now a number of tools on the market which aim to give a single score metric indicating the performance of your site, the most commonly used one seems to be Google Page Speed.&amp;#160; &lt;/p&gt;  &lt;p&gt;I decided to run a little experiment to see how adding Google services to a page affected both performance and Page Speed scores.&lt;/p&gt;  &lt;p&gt;First, my setup:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Firefox 10.0 with Firebug 1.8.4 &lt;/li&gt;    &lt;li&gt;Files hosted at same datacenter facility as our eCommerce sites (not locally) &lt;/li&gt;    &lt;li&gt;100mbit internet connection at testing location &lt;/li&gt;    &lt;li&gt;CPU is a Xeon X5550, 18GB RAM, 2x SAS 15K drives in RAID-0 (workstation performance definitely isn’t going to be the bottleneck here!) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To start, I created a plain-old XHTML 1.0 Transitional page with 10 paragraphs of Lorem Ipsum text. I then added Google Services to the page one at a time, starting with Google Analytics (the most commonly included script I could think of).&amp;#160; For each page, I reloaded it with CTRL-F5 in order to ensure I did not use any cached resources.&amp;#160; GZIP was disabled on the server hosting the HTML pages to ensure the compression times did not affect time-to-first-byte (TTFB).&lt;/p&gt;  &lt;p&gt;The pages I tested with can be found at the following links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Test 1: Plain-old HTML: &lt;a title="http://www.berkovitz.org/googlepagespeedexperiment_1.html" href="http://www.berkovitz.org/googlepagespeedexperiment_1.html"&gt;http://www.berkovitz.org/googlepagespeedexperiment_1.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Test 2: Added Google Analytics: &lt;a title="http://www.berkovitz.org/googlepagespeedexperiment_2.html" href="http://www.berkovitz.org/googlepagespeedexperiment_2.html"&gt;http://www.berkovitz.org/googlepagespeedexperiment_2.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Test 3: Added AdWords Conversion Tracking: &lt;a title="http://www.berkovitz.org/googlepagespeedexperiment_3.html" href="http://www.berkovitz.org/googlepagespeedexperiment_3.html"&gt;http://www.berkovitz.org/googlepagespeedexperiment_3.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Test 4: Added Google Plus Button: &lt;a title="http://www.berkovitz.org/googlepagespeedexperiment_4.html" href="http://www.berkovitz.org/googlepagespeedexperiment_4.html"&gt;http://www.berkovitz.org/googlepagespeedexperiment_4.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Test 5: Added Google Maps IFRAME: &lt;a title="http://www.berkovitz.org/googlepagespeedexperiment_5.html" href="http://www.berkovitz.org/googlepagespeedexperiment_5.html"&gt;http://www.berkovitz.org/googlepagespeedexperiment_5.html&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The results are interesting to say the least:&lt;/p&gt;  &lt;table style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; width: 100%; border-collapse: collapse; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid" cellspacing="0" cellpadding="3"&gt;&lt;tbody&gt;     &lt;tr style="background-color: #3399ff; color: #ffffff; font-weight: bold"&gt;       &lt;td&gt;Test&lt;/td&gt;        &lt;td&gt;Description&lt;/td&gt;        &lt;td&gt;On-Load Time (ms)&lt;/td&gt;        &lt;td&gt;Size (KB)&lt;/td&gt;        &lt;td&gt;# Requests&lt;/td&gt;        &lt;td&gt;Page Speed Score&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;1&lt;/td&gt;        &lt;td&gt;Plain-old HTML&lt;/td&gt;        &lt;td&gt;82&lt;/td&gt;        &lt;td&gt;7.2&lt;/td&gt;        &lt;td&gt;1&lt;/td&gt;        &lt;td&gt;92&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;2&lt;/td&gt;        &lt;td&gt;Added Google Analytics&lt;/td&gt;        &lt;td&gt;287&lt;/td&gt;        &lt;td&gt;20.8&lt;/td&gt;        &lt;td&gt;3&lt;/td&gt;        &lt;td&gt;93&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;3&lt;/td&gt;        &lt;td&gt;Added AdWords Conversion Tracking&lt;/td&gt;        &lt;td&gt;366&lt;/td&gt;        &lt;td&gt;23.7&lt;/td&gt;        &lt;td&gt;6&lt;/td&gt;        &lt;td&gt;92&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;4&lt;/td&gt;        &lt;td&gt;Added Google Plus button&lt;/td&gt;        &lt;td&gt;830&lt;/td&gt;        &lt;td&gt;126.2&lt;/td&gt;        &lt;td&gt;12&lt;/td&gt;        &lt;td&gt;94&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;5&lt;/td&gt;        &lt;td&gt;Added embedded Google Maps&lt;/td&gt;        &lt;td&gt;6130&lt;/td&gt;        &lt;td&gt;414.9&lt;/td&gt;        &lt;td&gt;35&lt;/td&gt;        &lt;td&gt;94&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The most interesting part was that the more services I added and the slower the site performed, the better the Page Speed score got!&amp;#160; In fact, the end result was a page with a load time 75x slower than the original, 57x larger and with 35x the number of requests yet the Page Speed Score increased by 2 over the original. &lt;/p&gt;  &lt;p&gt;It just goes to show that you cannot base your analysis of a site solely on a single tool.&amp;#160; Your site might have a Page Speed score of 94, but an on-load time of 6.1sec is obviously going to be perceived as very slow to users.&amp;#160;&amp;#160; And don’t even get me started about Google Webmaster Tools!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3557322110141645842?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3557322110141645842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3557322110141645842' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3557322110141645842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3557322110141645842'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2012/02/experiment-with-google-services-page.html' title='An Experiment with Google Services &amp;amp; Page Speed'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4046294850565356630</id><published>2010-04-23T17:46:00.001-04:00</published><updated>2010-04-23T17:46:57.631-04:00</updated><title type='text'>ScottGu’s Color Scheme for Visual Studio 2010</title><content type='html'>&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/"&gt;ScottGu&lt;/a&gt; was nice enough to &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/04/02/unit-testing-with-silverlight.aspx#6065439"&gt;provide the world&lt;/a&gt; with his awesome Visual Studio 2008 color scheme.&amp;#160; I’ve been using this for many years now and I highly recommend it – after years of working on a dark background, I find a white coding background to be harsh and straining.&lt;/p&gt;  &lt;p&gt;Visual Studio 2010 introduces some new syntax coloring options, and when importing a VS2008 settings file, will resort to defaults for these values.&amp;#160; The result is a pretty ugly editor when used with this color scheme.&lt;/p&gt;  &lt;p&gt;Lucky for you, I’ve taken the time to update the file.&amp;#160; &lt;a href="http://www.mbccs.com/blogfiles/ScottGuVS2010.zip"&gt;Download the VS2010 ScottGu Color Scheme&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4046294850565356630?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4046294850565356630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4046294850565356630' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4046294850565356630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4046294850565356630'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2010/04/scottgus-color-scheme-for-visual-studio.html' title='ScottGu’s Color Scheme for Visual Studio 2010'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-3801379541919362441</id><published>2009-12-07T12:42:00.001-05:00</published><updated>2009-12-07T12:42:00.345-05:00</updated><title type='text'>Moving the C:\WINDOWS\INSTALLER Directory</title><content type='html'>&lt;p&gt;Often servers or workstations will run low of disk space on the system partition.&amp;#160; This is especially true I’ve found with older Dell servers that shipped with a 12GB system partition.&lt;/p&gt;  &lt;p&gt;The c:\windows\installer directory often occupies several gigabytes of storage.&lt;/p&gt;  &lt;p&gt;While Windows does not provide a mechanism to re-point this directory via the registry, you can use NTFS junctions/reparse points to re-point the directory to a different local volume.&amp;#160; Re-pointing to UNC paths is not supported.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Obtain junction.exe from &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx"&gt;http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;I found it handy to add the executable to c:\windows\system32 for easy access      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Create the destination Installer folder on the new volume (ie: D:\Installer)      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Move all content from c:\windows\installer to your new directory      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Make sure to close any explorer windows with these folders opened.&amp;#160; Junction.exe requires that there are no open file handles to these directories      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Create the junction     &lt;br /&gt;      &lt;br /&gt;&lt;font face="Courier New"&gt;junction.exe c:\windows\installer d:\installer&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3801379541919362441?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3801379541919362441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3801379541919362441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3801379541919362441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3801379541919362441'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/12/moving-cwindowsinstaller-directory.html' title='Moving the C:\WINDOWS\INSTALLER Directory'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6004484395800301435</id><published>2009-11-30T17:35:00.001-05:00</published><updated>2009-11-30T17:35:50.493-05:00</updated><title type='text'>Blackberry Enterprise Server - “The personal redirection folders are unavailable”</title><content type='html'>&lt;p&gt;After upgrading our corporate Blackberry Enterprise Server (BES) from 5.0 to 5.0SP1, all of our users started complaining that most if not all of their contacts were now missing.&lt;/p&gt;  &lt;p&gt;From the Web Desktop Manager, and choosing the “Redirection Folders” section (where you configure which folders are redirected), the following error message was displayed at the top.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;The personal redirection folders are unavailable. Contact your system administrator.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Great, they want me to contact myself.&amp;#160; Typical.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;The Desktop Manager did not show any errors but also would not allow me to select any folders or my default private contact folder.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;A glance through some of the BES logs showed messages like:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.SQLGrammarException: could not insert: [com.rim.bes.basplugin.synchronization.entity.SyncFolderListEntity]&lt;/p&gt;  &lt;p&gt;[org.hibernate.util.JDBCExceptionReporter] [ERROR] Cannot insert duplicate key row in object 'dbo.SyncFolderList' with unique index 'IX_SyncFolderList_GUIDLoc'.&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;I happen to be a DBA, so I decided to dig right in.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#000000"&gt;First and foremost, before you perform any type of manual database manipulation against your BESMgmt database, TAKE A FULL BACKUP.&amp;#160; Did I mention you should take a FULL BACKUP?&amp;#160;&amp;#160; Did you take a FULL backup? Ok good.&amp;#160; Also, if you are not familiar with SQL or simply don’t want to risk&amp;#160; bringing down your environment, I recommend you contact RIM support.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;There are two database tables that control the bulk of this.&amp;#160; [dbo].[SyncFolderUserList] and [dbo].[SyncFolderList].&amp;#160; The [dbo].[UserConfig] table also contains all of the users, and you will need to reference it for this operation.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;First, I looked up my user id from the UserConfig table.     &lt;br /&gt;SELECT *&amp;#160; FROM [dbo].[UserConfig].&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;I’m ID 47.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;I then looked up my folder list from the SyncFolderUserList table.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;SELECT * FROM [dbo].[SyncFolderUserList]   &lt;br /&gt;WHERE [UserConfigId] = 47&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;This yielded two records for me.&amp;#160; Note the data in the SyncFolderListId table.&amp;#160; For my scenario, I had two records, one with ID 60 and the other 147.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;I then queried the SyncFolderList table for those rows.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;SELECT *&amp;#160; FROM [dbo].[SyncFolderList]   &lt;br /&gt;WHERE [Id] IN (60, 147)&lt;/p&gt;  &lt;p&gt;While I was expecting two entries, to my surprise there was only one entry. &lt;strong&gt;&amp;#160; Bingo, a rogue entry!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Seeing how it was only two folders, rather than deleting the rogue one and seeing if it worked, I opted to delete all of my data from both the SyncFolderList and the SyncFolderUserList tables.&amp;#160; &lt;/p&gt;  &lt;p&gt;To my expectation, I was now able to select the folders again from either Web Desktop Manager or the Desktop Manager.&lt;/p&gt;  &lt;p&gt;As a number of other users in our environment were experiencing the same issue, I decided to delete these tables all together.&amp;#160; All users reported they were now able to select folders to sync, and upon selecting them, their devices properly synchronized.&lt;/p&gt;  &lt;p&gt;Drop a comment if this helped you!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6004484395800301435?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6004484395800301435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6004484395800301435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6004484395800301435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6004484395800301435'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/11/blackberry-enterprise-server-personal.html' title='Blackberry Enterprise Server - “The personal redirection folders are unavailable”'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-5300988080582537918</id><published>2009-10-09T22:30:00.001-04:00</published><updated>2009-10-10T00:40:15.668-04:00</updated><title type='text'>What’s in your BBIM Barcode?</title><content type='html'>&lt;p&gt;New with Blackberry Instant Messenger (BBIM) 5.0 is the ability to add contacts by scanning a barcode which BBIM can emit through the “my profile” feature.&lt;/p&gt;  &lt;p&gt;It’s a cool feature, but I was obviously curious what was being sent.&lt;/p&gt;  &lt;p&gt;The barcode is a QR Barcode, a two dimension barcode and ISO standard.&amp;#160; You can read all about them online.&lt;/p&gt;  &lt;p&gt;Using the &lt;a href="http://www.barcodelib.com/net_barcode_reader/main.html#quickDownload"&gt;Barcode Reader for .NET&lt;/a&gt; library, I scanned mine in.&amp;#160; Here’s what I found&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;bbm:&lt;font color="#ff0000"&gt;x07x8cce&lt;/font&gt;7b313673&lt;font color="#0000a0"&gt;Steven Berkovitz&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;First, we’ve got a BBIM&amp;#160; identifier, “bbm”.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Followed by my PIN,”&lt;font color="#ff0000"&gt;x07x8cce&lt;/font&gt;” (I’ve replaced a few characters).&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;The third set, “7b313673” I have not yet identified but it does differ between barcodes.&amp;#160; &lt;em&gt;I’ll update this post when I find out.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;At the end is my display name (not your name, I’ve verified this with some other barcodes), “&lt;font color="#0000a0"&gt;Steven Berkovitz&lt;/font&gt;”&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-5300988080582537918?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/5300988080582537918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=5300988080582537918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5300988080582537918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5300988080582537918'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/10/whats-in-your-bbim-barcode.html' title='What’s in your BBIM Barcode?'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2923310995966747985</id><published>2009-07-13T14:17:00.001-04:00</published><updated>2009-07-13T14:38:55.355-04:00</updated><title type='text'>C# – Converting IP’s to Numbers and Numbers to IP’s in 2 lines of code</title><content type='html'>&lt;p&gt;I don’t know why everywhere I searched had such complex implementation of this, but converting from a dotted IP to a number (integer) and back is quite straight forward with the help of the IPAddress and BitConverter classes.&lt;/p&gt;  &lt;p&gt;Also, keep in mind that IP addresses are 32 bit integers; I’m not sure why people feel it’s necessary to use a decimal or double for this when a uint will work just fine!&lt;/p&gt;  &lt;pre&gt;/// &lt;summary&gt;&lt;br /&gt;/// Converts the IP address to an integer.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="ipAddress" /&gt;The IP address in dotted form.&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;public static uint ConvertIpToInteger(string ipAddress) {&lt;br /&gt;	return BitConverter.ToUInt32(IPAddress.Parse(ipAddress).GetAddressBytes().Reverse().ToArray(), 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Converts the integer to an IP address.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="ipAddress" /&gt;The IP address in integer form.&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;public static string ConvertIntegerToIp(uint ipAddress) {&lt;br /&gt;	return new IPAddress(BitConverter.GetBytes(ipAddress).Reverse().ToArray()).ToString();&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/28329697-2923310995966747985?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2923310995966747985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2923310995966747985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2923310995966747985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2923310995966747985'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/07/c-converting-ips-to-numbers-and-numbers.html' title='C# – Converting IP’s to Numbers and Numbers to IP’s in 2 lines of code'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8530904340186367988</id><published>2009-04-23T15:35:00.001-04:00</published><updated>2009-04-23T15:35:38.298-04:00</updated><title type='text'>Using SQL PIVOT with non-aggregate column</title><content type='html'>&lt;p&gt;I was banging my head on my desk for a while over this one, hopefully this will save you the pain…&lt;/p&gt;  &lt;p&gt;I wanted to use SQL 2005’s PIVOT function except the data I was trying to PIVOT was a text column, not an aggregate of a column.&amp;#160; However, the business rule for this table was a 1:1 rule so there’d never be anything to aggregate anyways (even when the data is numeric).&lt;/p&gt;  &lt;p&gt;What got me at first was the “Incorrect syntax near the keyword 'FOR'.” error message which didn’t make a whole lot of sense until I realized that added a SUM(1) resolved the problem (hence, the requirement for an aggregate column).&lt;/p&gt;  &lt;p&gt;So how, might you ask, do you work around this?&amp;#160; Well, you don’t – the PIVOT function only takes an aggregate value after all.&amp;#160; That being said, our friend MAX and MIN don’t require a numeric value to be passed to them – they are perfectly happy accepting a varchar or nvarchar value.&lt;/p&gt;  &lt;p&gt;So instead of trying &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;PIVOT(&lt;font color="#ff0000"&gt;[MyTextColumn]&lt;/font&gt; FOR [MyHeader] IN ([List],[Of],[Columns]))&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Use&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;PIVOT(&lt;strong&gt;&lt;font color="#ff0000"&gt;MAX([MyTextColumn])&lt;/font&gt;&lt;/strong&gt; FOR [MyHeader] IN ([List],[Of],[Columns]))&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8530904340186367988?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8530904340186367988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8530904340186367988' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8530904340186367988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8530904340186367988'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/04/using-sql-pivot-with-non-aggregate.html' title='Using SQL PIVOT with non-aggregate column'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2516753071315193580</id><published>2009-04-07T22:18:00.001-04:00</published><updated>2009-04-07T22:19:24.362-04:00</updated><title type='text'>Roomba Surgery: Replace the Bumper Articulating Arm Optical Sensor Set</title><content type='html'>&lt;p&gt;A few weeks ago my &lt;a href="http://store.irobot.com/category/index.jsp?categoryId=3334619&amp;amp;cp=2804605&amp;amp;ab=CMS_RobotSuper_Roomba_031709"&gt;iRobot Roomba&lt;/a&gt; started spinning in circles and failing with a 9-beep error.&amp;#160; This error is related to the two bumper sensors located at 10 and 2 o’clock.&amp;#160; In some cases there might simply be debris behind the bumper interfering with the sensors.&amp;#160; I ruled this out with a disassembly and clean.&lt;/p&gt;  &lt;p&gt;If your unit is under warranty you would likely be sent a replacement unit for this case, but that being said, mine was not.&amp;#160; Plus I was secretly looking forward to a full disassembly.&lt;/p&gt;  &lt;p&gt;I followed a combination of instructions I found on the net to diagnose and replace the faulty part.&lt;/p&gt;  &lt;p&gt;The problem is caused by one or two faulty “Bumper Articulating Arm Optical Sensors” in your robot.&amp;#160; These sensors consist of a plastic arm that swings between two IR sensors.&amp;#160; My readings on the working sensor showed a range of 0-5 volts.&lt;/p&gt;  &lt;p&gt;The first sensor I tested functioned correctly switching between&amp;#160; 0 and 5 volts.&amp;#160; The second sensor was fixed at 0v.&amp;#160; I had read about shorting out the IR to half blind your Roomba but I was not in the mood to solder fragile wires.&amp;#160; With that said, I managed to find a replacement &lt;a href="http://www.protechrobotics.com/proddetail.php?prod=245435775"&gt;part&lt;/a&gt; from Protech Robots.&amp;#160; &lt;/p&gt;  &lt;p&gt;A week and a bit later (the item was shipped USPS ground) my part arrived and it was time to put Roomba back together again.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJQE3ewKI/AAAAAAAAADk/f_lR5eubq4I/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20002%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 002" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 002" src="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJRKV-scI/AAAAAAAAADo/BO-uX9Yco-k/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20002_thumb%5B2%5D.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Remove the face plate&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJRiL5tGI/AAAAAAAAADs/JY8i4F3P20c/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20004%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 004" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 004" src="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJSKcXibI/AAAAAAAAADw/UT2BwYUZrHI/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20004_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Remove the side brush, bottom plate, battery and the bumper (after removing the plate that holds the bumper on, the bumper gently lifts off.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJS5TizvI/AAAAAAAAAD0/Qf_pkyl8Faw/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20006%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 006" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 006" src="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJTeHE2uI/AAAAAAAAAD4/AiRuuxGGBgQ/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20006_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_TSl02_X8Pfw/SdwJUK5UhcI/AAAAAAAAAD8/NzY76ADxmt8/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20007%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 007" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 007" src="http://lh5.ggpht.com/_TSl02_X8Pfw/SdwJU1xhxCI/AAAAAAAAAEA/2bQq89Dr90o/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20007_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;This is one of the Articulating Arm Optical Sensors &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJV_FoAKI/AAAAAAAAAEE/cKhOVy5S2n4/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20009%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 009" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 009" src="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJWYedA-I/AAAAAAAAAEI/Vc5QJWF3Za0/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20009_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Remove the top of the robot (don’t remove the screws for the handle)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJXI0XpqI/AAAAAAAAAEM/X_etv-hnmyU/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20011%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 011" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 011" src="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJXpJzGaI/AAAAAAAAAEQ/-ncrbi34ZQc/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20011_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Disassemble and remove the display &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJYKx-VnI/AAAAAAAAAEU/blE2BP9LzHo/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20012%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 012" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 012" src="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJY7ynUUI/AAAAAAAAAEY/LGlo3zZRb8o/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20012_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Gently remove the plastic sheet on top of the PCB&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_TSl02_X8Pfw/SdwJZYmjRxI/AAAAAAAAAEc/54bl_9rafJ0/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20013%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 013" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 013" src="http://lh5.ggpht.com/_TSl02_X8Pfw/SdwJZ7gB76I/AAAAAAAAAEg/kHg0LjtHTGE/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20013_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;     &lt;br /&gt;Disconnect all of the connections from the top of the PCB and remove the screws securing it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJapLrKUI/AAAAAAAAAEk/0QI39eBVSwU/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20016%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 016" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 016" src="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJbMkC2II/AAAAAAAAAEo/SvevTM679lo/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20016_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Gently lift up the PCB towards you (the front of the robot) exposing the bottom connections.&amp;#160; Gently disconnect all of the connections including the bumper.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJbxCmp7I/AAAAAAAAAEs/PQhujS6OuNk/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20020%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 020" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 020" src="http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJcakB61I/AAAAAAAAAEw/UDifSgab4j4/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20020_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJc3o8IbI/AAAAAAAAAE0/nSBlvDR1hVI/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20021%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 021" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 021" src="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJdrJxZFI/AAAAAAAAAE4/cl3icQoW_Jc/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20021_thumb.jpg?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt;    &lt;br /&gt;Gently lift out the IR sensor array&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJeJN1ONI/AAAAAAAAAE8/xqnYzCKDLms/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20024%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 024" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 024" src="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJeonT2xI/AAAAAAAAAFA/Ju7kpl-RAhc/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20024_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Remove the 2 screws securing each articulating arm sensor and remove the sensors from the robot.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_TSl02_X8Pfw/SdwJfQTrQ7I/AAAAAAAAAFE/WFUow6nu_oY/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20027%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 027" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 027" src="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJgNyPawI/AAAAAAAAAFI/LafkUdqlXLI/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20027_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJgnuj2JI/AAAAAAAAAFM/bmmmOwISoFg/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20029%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 029" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 029" src="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJhGBnomI/AAAAAAAAAFQ/hf_zlL-cF-M/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20029_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;    &lt;br /&gt;Here comes the trickiest of the parts.&amp;#160; You need to follow all of the wires from the sensors to the connector located in the bottom right of this photo, ignoring the white wire that connects the two sensors together.&amp;#160; Carefully remove any material securing the cables together.&amp;#160; I highly suggest you draw a visual of the connector and keep track of the individual wires as you remove them.&amp;#160; To remove the individual wires from the connector you need to gently lift up the plastic the secures the wire, and pull at the same time.&amp;#160; I used a small paper clip to lift the plastic.&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SdwJhwy0s9I/AAAAAAAAAFU/dJYARJK7p5A/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20034%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 034" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 034" src="http://lh5.ggpht.com/_TSl02_X8Pfw/SdwJiV1_s4I/AAAAAAAAAFY/mqz81Tb83Ww/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20034_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once the connector is reassembled the rest of the steps are just the re-assembly of the robot and testing.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJiwMaeNI/AAAAAAAAAFc/rIojVcUoDP4/s1600-h/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20046%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 046" border="0" alt="2009-04-07 Roomba Articulating Arm Optical Sesnsor Set Replacement 046" src="http://lh6.ggpht.com/_TSl02_X8Pfw/SdwJjsJ7szI/AAAAAAAAAFg/_SLMLdEx6oQ/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20046_thumb.jpg?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt;    &lt;br /&gt;It works! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2516753071315193580?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2516753071315193580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2516753071315193580' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2516753071315193580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2516753071315193580'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/04/roomba-surgery-replace-bumper.html' title='Roomba Surgery: Replace the Bumper Articulating Arm Optical Sensor Set'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_TSl02_X8Pfw/SdwJRKV-scI/AAAAAAAAADo/BO-uX9Yco-k/s72-c/2009-04-07%20Roomba%20Articulating%20Arm%20Optical%20Sesnsor%20Set%20Replacement%20002_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2987014763098032424</id><published>2009-02-10T15:22:00.001-05:00</published><updated>2009-02-10T15:22:49.137-05:00</updated><title type='text'>How to query your BES database for a list of users</title><content type='html'>&lt;p&gt;I was asked to generate a list of all our BES users, including their name, phone number, PIN, IMEI and device number.&amp;#160; Sure, I could have copied/pasted this data out of the BES management utility, but what fun is that?&lt;/p&gt;  &lt;p&gt;It turns out that it’s really easy to query the BESMGMT database for this list.&lt;/p&gt;  &lt;pre&gt;SELECT&lt;br /&gt;      uc.[DisplayName],&lt;br /&gt;      sdms.[PhoneNumber],&lt;br /&gt;      uc.[PIN],&lt;br /&gt;      sdms.[IMEI],&lt;br /&gt;      sdms.[ModelName]  &lt;br /&gt;FROM&lt;br /&gt;      [dbo].[SyncDeviceMgmtSummary] sdms&lt;br /&gt;INNER JOIN&lt;br /&gt;      [dbo].[UserConfig] uc on sdms.[UserConfigId] = uc.[Id]&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2987014763098032424?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2987014763098032424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2987014763098032424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2987014763098032424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2987014763098032424'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2009/02/how-to-query-your-bes-database-for-list.html' title='How to query your BES database for a list of users'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2903995945719333471</id><published>2008-11-18T22:06:00.001-05:00</published><updated>2008-11-18T22:06:42.430-05:00</updated><title type='text'>MBC is Hiring – ASP.NET Web Developer Position available in Toronto, Ontario</title><content type='html'>&lt;p&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;If you enjoy working on a variety of cutting edge web applications ranging from eCommerce apps to Social Networking sites then this position might be for you! MBC is seeking to hire a talented and passionate developer with a deep understanding of ASP.NET and the .NET framework but who also likely knows their way around windbg.&amp;#160; Experience with standards-based XHTML, CSS, JavaScript and AJAX is a must.&amp;#160; The position is based out of Richmond Hill, Ontario (just outside of Toronto).&amp;#160; Office environment is young and casual.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Experience&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Degree or certificate in Computer Science, Computer Engineering or college level application development program. Some experience developing production applications required.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Responsibilities&lt;/b&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Design and coding of features and bug fixes in a variety of .NET applications authored in C# (primarily ASP.NET)&lt;/li&gt;    &lt;li&gt;Occasionally working on VB6, PHP, ASP applications&lt;/li&gt;    &lt;li&gt;Communication with clients regarding progress, feature requests, answering general questions, support&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Strong object oriented design and programming using C# and ASP.NET 3.5&lt;/li&gt;    &lt;li&gt;Strong knowledge of Microsoft SQL Server 2000/2005 (programming with T-SQL)&lt;/li&gt;    &lt;li&gt;A desire to take part in the full development processing starting with design of features through implementation&lt;/li&gt;    &lt;li&gt;Job experience working with C#, ASP.NET, .NET framework, JavaScript, AJAX&lt;/li&gt;    &lt;li&gt;Experience working in a team environment&lt;/li&gt;    &lt;li&gt;Excellent verbal and written communication skills&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Additional Assets&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Knowledge of COM+, Active Directory, Exchange, IIS, MSMQ&lt;/li&gt;    &lt;li&gt;Team Foundation Server&lt;/li&gt;    &lt;li&gt;PHP, ColdFusion, ASP&lt;/li&gt;    &lt;li&gt;MySQL&lt;/li&gt;    &lt;li&gt;Basic use of graphic design tools such as Adobe Photoshop&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Salary &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Commensurate with experience.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;To apply for the job&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Candidates will be required to provide sample source code that demonstrates strong knowledge of C# and ASP.NET. An application implementing an n-tier design is highly recommended. Additional consideration will be given to candidates who provide sample code using .NET 3.0/3.5 technologies such as LINQ, WCF, WPF.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2903995945719333471?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2903995945719333471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2903995945719333471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2903995945719333471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2903995945719333471'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/11/mbc-is-hiring-aspnet-web-developer.html' title='MBC is Hiring – ASP.NET Web Developer Position available in Toronto, Ontario'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6576281062982274374</id><published>2008-11-15T12:38:00.001-05:00</published><updated>2008-11-15T12:38:58.493-05:00</updated><title type='text'>XHTML Strict not supported by ASP.NET</title><content type='html'>&lt;p&gt;Back in October I opened up a &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=371804" target="_blank"&gt;MS Connect feedback item&lt;/a&gt; about a validation error I was receiving with a XHTML Strict site that used a ScriptManager with history support.&amp;#160; The site would fail W3C validation because the ScriptManager emits an IFRAME (when history is enabled) , and an IFRAME is not part of the XHTML Strict spec.&amp;#160; I just thought I’d provide the official word from Microsoft on this issue: XHTML Strict is not supported by ASP.NET!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;XHTML strict is not supported by ASP.NET. Only transitional doctypes are supported, which enables iframes. Furthermore, the history feature can't be made compatible with IE 6 and 7 without using an iframe.&lt;/p&gt;    &lt;p&gt;&lt;img src="http://connect.microsoft.com/Images/arrow1.gif" /&gt; Posted by &lt;strong&gt;Microsoft&lt;/strong&gt; on 11/12/2008 at 12:34 PM&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6576281062982274374?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6576281062982274374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6576281062982274374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6576281062982274374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6576281062982274374'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/11/xhtml-strict-not-supported-by-aspnet.html' title='XHTML Strict not supported by ASP.NET'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6551036208397445845</id><published>2008-11-10T23:12:00.001-05:00</published><updated>2008-11-10T23:12:04.802-05:00</updated><title type='text'>Don’t forget about the defer attribute for non-essential external scripts</title><content type='html'>&lt;p&gt;I was recently reviewing a customers eCommerce site and I noticed that the “Please Wait” page that occurs after completing an order but before you view the order was taking a long time to load.&amp;#160; Using Firebug I traced the issue down to an external script that was taking it’s sweet time to download; it was for affiliate tracking on a 3rd party site. &lt;/p&gt;  &lt;p&gt;I’m all for tracking, but not at the expense of performance.&amp;#160; Though I haven’t seen an affiliate/ad partner use the defer attribute on their script tags before, there is good reason for you to add it.&amp;#160; Consider the following example:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_TSl02_X8Pfw/SRkGCOtDXkI/AAAAAAAAACc/HHT_M8xkWpk/s1600-h/Default%5B7%5D.jpg"&gt;&lt;img title="Default" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="403" alt="Default" src="http://lh6.ggpht.com/_TSl02_X8Pfw/SRkGCarPe2I/AAAAAAAAACg/PpaTixAtcFA/Default_thumb%5B4%5D.jpg?imgmax=800" width="1047" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;SlowRequest.aspx is just an ASP.NET page that after a 2 second delay, returns some JavaScript (not my finest code I might add)&lt;/p&gt;  &lt;p align="left"&gt;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SRkGCkCKaVI/AAAAAAAAACk/mPMctj87sqw/s1600-h/SlowRequest%5B4%5D.jpg"&gt;&lt;img title="SlowRequest" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="264" alt="SlowRequest" src="http://lh3.ggpht.com/_TSl02_X8Pfw/SRkGDJlB2LI/AAAAAAAAACo/Btm6epxdK38/SlowRequest_thumb%5B2%5D.jpg?imgmax=800" width="543" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Sure enough, for the first two seconds, all you see is&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SRkGDULRznI/AAAAAAAAACs/_gDSam161Zg/s1600-h/Waiting%5B5%5D.jpg"&gt;&lt;img title="Waiting" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="143" alt="Waiting" src="http://lh4.ggpht.com/_TSl02_X8Pfw/SRkGD5ZnonI/AAAAAAAAACw/roVEpx5HfwY/Waiting_thumb%5B1%5D.jpg?imgmax=800" width="285" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And finally (2 seconds later)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_TSl02_X8Pfw/SRkGENXSdHI/AAAAAAAAAC0/QbKMrfQGkpU/s1600-h/Done%5B2%5D.jpg"&gt;&lt;img title="Done" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="149" alt="Done" src="http://lh5.ggpht.com/_TSl02_X8Pfw/SRkGEYKaTmI/AAAAAAAAAC4/NMUS2D9Nfeg/Done_thumb.jpg?imgmax=800" width="225" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Luckily for this example, this information isn’t overly pertinent – but if it were my order status, it would be.&amp;#160; Luckily a quick defer=”defer” attribute on your script tag and the wait is gone; the external script is loaded after the DOM is ready:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_TSl02_X8Pfw/SRkGEUbXXRI/AAAAAAAAAC8/bYl5Lm0Ihuc/s1600-h/Defer%5B5%5D.jpg"&gt;&lt;img title="Defer" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="374" alt="Defer" src="http://lh4.ggpht.com/_TSl02_X8Pfw/SRkGE8WXz6I/AAAAAAAAADA/aQQUGJcW0V4/Defer_thumb%5B3%5D.jpg?imgmax=800" width="1001" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6551036208397445845?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6551036208397445845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6551036208397445845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6551036208397445845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6551036208397445845'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/11/dont-forget-about-defer-attribute-for.html' title='Don’t forget about the defer attribute for non-essential external scripts'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_TSl02_X8Pfw/SRkGCarPe2I/AAAAAAAAACg/PpaTixAtcFA/s72-c/Default_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8493903176528945735</id><published>2008-10-23T13:13:00.001-04:00</published><updated>2008-10-23T13:13:05.885-04:00</updated><title type='text'>Is it really going to take that long?</title><content type='html'>&lt;p&gt;You have to love Microsoft dialogs sometimes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/stevenberkovitz/SQCwoN3-nSI/AAAAAAAAACU/iU2dO0-KPbA/s1600-h/capture%5B3%5D.jpg"&gt;&lt;img title="capture" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="239" alt="capture" src="http://lh4.ggpht.com/stevenberkovitz/SQCwodSi4zI/AAAAAAAAACY/LjMUuipN5tQ/capture_thumb%5B1%5D.jpg?imgmax=800" width="457" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I really hope that’s not an accurate number! This was invoked by removing the Encrypted attribute on a folder of about 1GB.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8493903176528945735?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8493903176528945735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8493903176528945735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8493903176528945735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8493903176528945735'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/10/is-it-really-going-to-take-that-long.html' title='Is it really going to take that long?'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/stevenberkovitz/SQCwodSi4zI/AAAAAAAAACY/LjMUuipN5tQ/s72-c/capture_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-7320131644067685590</id><published>2008-10-21T12:00:00.000-04:00</published><updated>2008-10-21T12:04:37.846-04:00</updated><title type='text'>OrderDynamics Launches New Website</title><content type='html'>&lt;p&gt;&lt;em&gt;October 27, 2008&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;TORONTO - OrderDynamics Corporation, an on-demand eCommerce solution provider, is pleased to announce its new website.&lt;/p&gt;  &lt;p&gt;Since 2006, OrderDynamics has had a website that focused more on the technical details of their solution. The new website, and company logo and colors, is designed to provide visitors with a view to the entire OrderDynamics solution, not simply technical details. &lt;/p&gt;  &lt;p&gt;&amp;quot;Our success comes from our overall approach, and we wanted this reflected in our brand and website going forward.&amp;quot; Michael Benadiba, CEO and founder of OrderDynamics Corporation. The new website contains new content areas that describe all major aspects of the eCommerce solution. The design itself is significantly less busy, more simplistic, and easier for potential Clients to find what they need -all underlying themes meant to support the company philosophy. &amp;quot;The format of the website is exciting for us. Shortly, we will be providing specific content to explain to potential Client’s how we solve real problems for online merchants.&amp;quot; Benadiba says. &lt;/p&gt;  &lt;h3&gt;About OrderDynamics Corporation&lt;/h3&gt;  &lt;p&gt;OrderDynamics Corporation is a privately owned company that provides turn-key eCommerce solutions to businesses looking to grow their online sales. The success of OrderDynamics is highly attributed to its response to real Client requirements and Dynamic Merchandising concepts which provide superior control and help drive revenue. The OrderDynamics solution is designed for online merchants and services different business such as retail, manufacturing, business-to-business, complex online retail, and more. OrderDynamics officially launched its solution in 2006 after 2 years of research and development.&lt;/p&gt;  &lt;h3&gt;For more information, please contact:&lt;/h3&gt;  &lt;p&gt;Michael Benadiba   &lt;br /&gt;Chief Executive Officer    &lt;br /&gt;OrderDynamics Corporation    &lt;br /&gt;1+ (866) 559-8123    &lt;br /&gt;&lt;a href="mailto:news@orderdynamics.com"&gt;news@orderdynamics.com&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-7320131644067685590?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/7320131644067685590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=7320131644067685590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/7320131644067685590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/7320131644067685590'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/10/orderdynamics-launches-new-website_21.html' title='OrderDynamics Launches New Website'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2850472292093880198</id><published>2008-09-03T14:30:00.001-04:00</published><updated>2008-09-03T14:30:08.664-04:00</updated><title type='text'>Serving up the MS AJAX Runtime as a CompositeScript</title><content type='html'>&lt;p&gt;ASP.NET 3.5 SP1 introduces script combining to the ScriptManager.&amp;#160; To take advantage of this feature with your own scripts, you simply wrap&amp;#160; you &amp;lt;Scripts&amp;gt;...&amp;lt;/Scripts&amp;gt; block with a &amp;lt;CompositeScript&amp;gt;...&amp;lt;/CompositeScript&amp;gt; block.&amp;#160; This is great, but if you've spent any time analyzing your site with a HTTP tracing tool like Firebug, Web Development&amp;#160; Helper or Fiddler, you'll notice that the MS AJAX Runtimes (MicrosoftAjax.js, MicrosoftAjaxWebForms.js) is still served up separately.&amp;#160; It turns out that getting these to be served as part of the combined script is relatively straight forward and entails manually including the scripts within your &amp;lt;CompositeScript&amp;gt; block.&amp;#160; Since the names are unique, the ScriptManager will not re-add the runtime libraries.&amp;#160; The final result looks like:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;asp:ScriptManager runat=&amp;quot;server&amp;quot; ID=&amp;quot;scriptManager&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;CompositeScript&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Scripts&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:ScriptReference Name=&amp;quot;MicrosoftAjax.js&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:ScriptReference Name=&amp;quot;MicrosoftAjaxWebForms.js&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;asp:ScriptReference Path=&amp;quot;~/scripts/YourScript.js&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Scripts&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/CompositeScript&amp;gt;      &lt;br /&gt;&amp;lt;/asp:ScriptManager&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2850472292093880198?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2850472292093880198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2850472292093880198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2850472292093880198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2850472292093880198'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/09/serving-up-ms-ajax-runtime-as.html' title='Serving up the MS AJAX Runtime as a CompositeScript'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4166199067414180101</id><published>2008-08-19T11:14:00.001-04:00</published><updated>2008-08-19T11:14:35.578-04:00</updated><title type='text'>Watch out for maxAllowedContentLength - its in bytes!</title><content type='html'>&lt;p&gt;I was just troubleshooting a &lt;i&gt;HTTP Error 404.13 - Not Found&lt;/i&gt; error in one of applications that handles some large file uploads.&amp;#160; I had set my maxAllowedContentLength to 2097151 (which is the max allowed value for the httpRuntime maxRequestLength parameter, in KB).&amp;#160; Oddly, it wasn't working and I was still receiving the 404.13.&lt;/p&gt;  &lt;p&gt;Some time later, after actually reading the MSDN documentation, it clicked to me that maxAllowedContentLength is in bytes, not kilobytes! Doh!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4166199067414180101?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4166199067414180101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4166199067414180101' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4166199067414180101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4166199067414180101'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/08/watch-out-for-maxallowedcontentlength.html' title='Watch out for maxAllowedContentLength - its in bytes!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6371657149425095206</id><published>2008-07-22T16:59:00.001-04:00</published><updated>2008-07-22T16:59:35.126-04:00</updated><title type='text'>Popup Window Manager</title><content type='html'>&lt;p&gt;I was just reading a post by &lt;a href="http://west-wind.com/weblog/posts/428973.aspx" target="_blank"&gt;Rick Strahl&lt;/a&gt; about managing popup windows in the browser.&amp;#160; I actually authored a mini popup window manager a while back that tracks windows, allows you to easily close them, and most importantly (for my app I suppose), can prevent the same window from being opened twice, and if encountered, will simply focus that window.&lt;/p&gt;  &lt;p&gt;The code is for MS AJAX but could easily be adopted for other platforms.&lt;/p&gt;  &lt;p&gt;To use it, you need to register it globally via the pages Load event:&lt;/p&gt;  &lt;p&gt;Sys.Application.add_load(function(sender, args) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; window.popupWindowManager = new Mbccs.Psp.Web.Manager.PopupWindowManager();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;  &lt;p&gt;And to open a window (using the default height and width):&lt;/p&gt;  &lt;p&gt;window.popupWindowManager.openWindow('myPage.aspx', false);&lt;/p&gt;  &lt;p&gt;If you want to override the width/height:&lt;/p&gt;  &lt;p&gt;window.popupWindowManager.openWindow('mypage.aspx', false, 800, 800)&lt;/p&gt;  &lt;p&gt;The code looks like:&lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.PopupWindow = function Mbccs$Psp$Web$Manager$PopupWindow(url, handle, allowDuplicates) {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._url = url || null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._handle = handle || null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._allowDuplicates = allowDuplicates;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.PopupWindow.prototype = {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; get_url : function Mbccs$Psp$Web$Manager$PopupWindow$get_url() {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this._url;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; get_handle : function Mbccs$Psp$Web$Manager$PopupWindow$get_handle() {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this._handle;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; get_allowDuplicates : function Mbccs$Psp$Web$Manager$PopupWindow$get_allowDuplicates() {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this._allowDuplicates;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}    &lt;br /&gt;Mbccs.Psp.Web.Manager.PopupWindow.registerClass('Mbccs.Psp.Web.Manager.PopupWindow'); &lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.PopupWindowManager = function Mbccs$Psp$Web$Manager$PopupWindowManager() {&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._windows = [];&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.PopupWindowManager.prototype = {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; openWindow : function Mbccs$Psp$Web$Manager$PopupWindowManager$openWindow(url, allowDuplicates, width, height) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var allowOpen = true;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var previousWindow = null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var previousWindowIndex = -1;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var windows = this._windows;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Check for existing    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for(i = 0; i &amp;lt; windows.length; i++) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(windows[i].get_url() == url) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; allowOpen = windows[i].get_allowDuplicates();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousWindow = windows[i];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousWindowIndex = i;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(!allowOpen) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(previousWindow.get_handle().closed) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Array.removeAt(this._windows, previousWindowIndex);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; allowOpen = true;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(allowOpen) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var _width = width || 750;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var _height = height || 700;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var winName = 'win' + Math.floor(Math.random() * 100 + 1);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var curWin = window.open(url, winName, 'width=' + _width + ',height=' + _height + ',resizable=yes,scrollbars=yes');&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var win = new Mbccs.Psp.Web.Manager.PopupWindow(url, curWin, allowDuplicates);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._windows.push(win);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return win;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousWindow.get_handle().focus();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return previousWindow;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; closeAll : function Mbccs$Psp$Web$Manager$PopupWindowManager$closeAll() {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var curWin = this._windows.pop();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(curWin != null) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; curWin.get_handle().close();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; curWin = this._windows.pop();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;}&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6371657149425095206?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6371657149425095206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6371657149425095206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6371657149425095206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6371657149425095206'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/07/popup-window-manager.html' title='Popup Window Manager'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6514702787314896818</id><published>2008-07-07T19:13:00.001-04:00</published><updated>2008-07-07T19:13:13.310-04:00</updated><title type='text'>Using Virtual Machine Manager 2008 to manage Virtual Server 2005</title><content type='html'>&lt;p&gt;I was trying to add a Virtual Server 2005 host to a Virtual Machine Manager 2008 Beta and I kept receiving the following error:&lt;/p&gt;  &lt;p&gt;Error (421)   &lt;br /&gt;Agent installation failed on MBC02.mbccs.internal because of a WS-Management configuration error.&amp;#160; &lt;/p&gt;  &lt;p&gt;Recommended Action   &lt;br /&gt;See the Virtual Machine Manager Help for information about configuring WS-Management.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Of course, being a beta product, that help section didn't exist and a search for &amp;quot;WS-Management&amp;quot; didn't yield anything.&amp;#160; WS-Management is installed by adding &amp;quot;Hardware Management&amp;quot; from Windows Components &amp;gt; Management and Monitoring tools (WinRM service), and this was installed on my server so I was pretty confused as to why I was receiving this message.&lt;/p&gt;  &lt;p&gt;It turns out that you need to install WS-Management v1.1 which is provided as a hotfix from Microsoft.&amp;#160; You can download it from &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=845289ca-16cc-4c73-8934-dd46b5ed1d33&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=845289ca-16cc-4c73-8934-dd46b5ed1d33&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=845289ca-16cc-4c73-8934-dd46b5ed1d33&amp;amp;displaylang=en&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6514702787314896818?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6514702787314896818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6514702787314896818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6514702787314896818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6514702787314896818'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/07/using-virtual-machine-manager-2008-to.html' title='Using Virtual Machine Manager 2008 to manage Virtual Server 2005'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-3499163279264122028</id><published>2008-06-25T19:46:00.001-04:00</published><updated>2008-06-25T19:46:12.878-04:00</updated><title type='text'>Decent online monitor calibration tool</title><content type='html'>&lt;p&gt;While I don't doubt that an external calibration tool is better for calibrating your monitor, I came across one online that yielded good results for my Dell 2009W 20&amp;quot; Wide Screen LCD's:&amp;#160; &lt;a title="http://www.lagom.nl/lcd-test/" href="http://www.lagom.nl/lcd-test/"&gt;http://www.lagom.nl/lcd-test/&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3499163279264122028?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3499163279264122028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3499163279264122028' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3499163279264122028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3499163279264122028'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/06/decent-online-monitor-calibration-tool.html' title='Decent online monitor calibration tool'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4725325587437211136</id><published>2008-06-25T16:21:00.001-04:00</published><updated>2008-06-25T16:21:57.263-04:00</updated><title type='text'>Another MacBook hard drive bites the dust</title><content type='html'>&lt;p&gt;I've had my MacBook 2.16GHz for just under two years now, and I've just had to replace the hard drive for a second time (mind you, this time not under Apple's warrantee).&lt;/p&gt;  &lt;p&gt;With most laptops, this would not be much of a surprise to me - after all, most laptops tend to take a beating, and this type of failure is somewhat normal.&amp;#160; The thing is, this laptop is used almost exclusively for testing; it sits on my desk 340 days of the year without moving - the power cord is tie wrapped to my desk even.&lt;/p&gt;  &lt;p&gt;If my friends are reading this, they're probably thinking&amp;#160; &amp;quot;Steven is on one of his anti-Apple rants again,&amp;quot; and while that might be partially true, the point I'm trying to make (or the myths I'm trying to dispel rather) is simple: MacBooks are not more reliable than Dell, HP, or Lenovo laptops.&amp;#160;&amp;#160; They all use almost identical drives, mother boards, video cards and RAM (the RAM I pulled out of this recently was Samsung). &lt;/p&gt;  &lt;p&gt;That being said, my experience with this particular MacBook is that it is actually significantly less reliable than other laptops I've owned.&amp;#160; My general feeling is that it suffers from a heat dissipation problem.&amp;#160; The vents on this unit are few and small, and under most of my use, the fan has to run at what seems to be full blast. When I compare this to similar Dell laptops that I've owned/used, they seem to have way better ventilation, and as a result, the fans seem to run less frequently.&lt;/p&gt;  &lt;p&gt;Good thing new drives are cheap!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4725325587437211136?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4725325587437211136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4725325587437211136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4725325587437211136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4725325587437211136'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/06/another-macbook-hard-drive-bites-dust.html' title='Another MacBook hard drive bites the dust'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-7144424596370070990</id><published>2008-06-24T20:36:00.001-04:00</published><updated>2008-06-24T20:36:50.659-04:00</updated><title type='text'>Dell 2009W's Finally Arrive</title><content type='html'>&lt;p&gt;I had &lt;a href="http://blogs.mbccs.com/~r/MbcComputerSolutions/~3/285509489/monitor-disappointment-dell-2208wfp-22.html" target="_blank"&gt;previously&lt;/a&gt;&amp;#160;&lt;a href="http://blogs.mbccs.com/~r/MbcComputerSolutions/~3/300064370/follow-up-monitor-disappointment-dell.html" target="_blank"&gt;written&lt;/a&gt; about the new Dell 2208WFP 22&amp;quot; Wide Screen LCD's that I had purchased and immediately sent back due to their blinding brightness and poor colour quality.&amp;#160; After nearly a month of waiting, I finally received my 2 Dell 2009W 20&amp;quot; Wide Screen LCD's.&amp;#160; My Dell rep informed me that the delay was due to a warehouse changeover in the USA (whether I believe that or not is unimportant).&lt;/p&gt;  &lt;p&gt;Now that I have my new panels, I thought I'd share a few thoughts about them.&lt;/p&gt;  &lt;p&gt;First are foremost, they are a significant improvement over the 2208WFP's.&amp;#160; That being said, I don't feel that the colour quality is as good as the Dell 2007WFP's that I have at my office. Also, the colour noticeably changes with the viewing angle, and they look slightly washed out even dead on.&amp;#160; My overall opinion is that Dell is cranking the brightness of their panels to increase the advertised contrast ratio, with colour quality suffering as a result.&amp;#160; But for the price, you can't go too wrong, and the quality is still higher then a lot of panels on the market.&lt;/p&gt;  &lt;p&gt;My biggest complaint so far is that the stands don't seem to go high enough.&amp;#160; At my office I have an &lt;a href="http://www.ergotron.com/Products/MultiMonitorMounts/tabid/159/ctl/Product/mid/545/PRDID/195/language/en-US/default.aspx" target="_blank"&gt;Ergontron DS100 Dual Monitor Desk Stand&lt;/a&gt; that holds the monitors noticeably higher then the highest setting on the height adjustable stands they ship with.&amp;#160; I'm going to need to offset this with a screen platform (aka: phone book).&lt;/p&gt;  &lt;p&gt;Overall rating: 3/5&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-7144424596370070990?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/7144424596370070990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=7144424596370070990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/7144424596370070990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/7144424596370070990'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/06/dell-2009w-finally-arrive.html' title='Dell 2009W&amp;#39;s Finally Arrive'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-3768770675888906036</id><published>2008-06-22T17:29:00.001-04:00</published><updated>2008-06-22T17:29:58.175-04:00</updated><title type='text'>How to change the temperature scale on a Honeywell T6575 Thermostat</title><content type='html'>&lt;p&gt;[The complete documentation can be found at &lt;a title="http://customer.honeywell.ca/techlit/pdf/95c-00000s/95c-10897.pdf" href="http://customer.honeywell.ca/techlit/pdf/95c-00000s/95c-10897.pdf"&gt;http://customer.honeywell.ca/techlit/pdf/95c-00000s/95c-10897.pdf&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This was bugging me for a while - the thermostat in my condo was configured to display in Fahrenheit.&amp;#160; I had removed the device figuring there would be a jumper or dipswitch on the back, but I had assumed incorrectly.&amp;#160; It turns out this device contains an EEPROM for storing configuration data.&amp;#160; Getting into the setup is relatively straight forward.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/stevenberkovitz/SF7EVJxbA-I/AAAAAAAAAB0/jOU5Pdh5s-g/s1600-h/T6575B1003%5B2%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="T6575B1003" src="http://lh5.ggpht.com/stevenberkovitz/SF7EVfpNeaI/AAAAAAAAAB4/easgqK8xEaU/T6575B1003_thumb.jpg?imgmax=800" width="184" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Change the temperature set point to 10C or 50F.&amp;#160; If it will not go this low then the minimum set point has been modified - you can access setup by selecting the lowest your device will go.&lt;/li&gt;    &lt;li&gt;Wait about 3 seconds until the room temperature is displayed&lt;/li&gt;    &lt;li&gt;Press and hold the UP and DOWN buttons until &lt;font face="Courier New"&gt;&lt;strong&gt;tS&lt;/strong&gt;&lt;/font&gt; is displayed&lt;/li&gt;    &lt;li&gt;Press&amp;#160; UP once to show the current setting, press UP again so that it changes to Celcius.&lt;/li&gt;    &lt;li&gt;Press DOWN to commit your change.&lt;/li&gt;    &lt;li&gt;Continue pressing DOWN as you cycle through the available options (db, OP, uC, uH, CO, CL, HL, ES, rt) until you reach &lt;strong&gt;&lt;font face="Courier New"&gt;rT.&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="tre"&gt;Press DOWN once more and the unit should return to the current room temperature display, this time in the scale of your choice!&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3768770675888906036?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3768770675888906036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3768770675888906036' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3768770675888906036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3768770675888906036'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/06/how-to-change-temperature-scale-on.html' title='How to change the temperature scale on a Honeywell T6575 Thermostat'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/stevenberkovitz/SF7EVfpNeaI/AAAAAAAAAB4/easgqK8xEaU/s72-c/T6575B1003_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6228202470734041783</id><published>2008-06-12T15:42:00.001-04:00</published><updated>2008-06-12T15:42:20.606-04:00</updated><title type='text'>Mac OSX 10.5.2 Freezing Intermittently</title><content type='html'>&lt;p&gt;I've been having an issue with my MacBook (you know, that computer I hide under my desk most of the time) where intermittently, the UI will freeze up for a period of a minute or so and then return to normal.&lt;/p&gt;  &lt;p&gt;I came across an article detailing how to &lt;a href="http://support.apple.com/kb/HT1379" target="_blank"&gt;reset the PRAM and NVRAM&lt;/a&gt; that seems to have resolved the issue.&lt;/p&gt;  &lt;h6&gt;Resetting PRAM and NVRAM&lt;/h6&gt;  &lt;ol&gt;   &lt;li&gt;Shut down the computer. &lt;/li&gt;    &lt;li&gt;Locate the following keys on the keyboard: Command, Option, P, and R. You will need to hold these keys down simultaneously in step 4. &lt;/li&gt;    &lt;li&gt;Turn on the computer. &lt;/li&gt;    &lt;li&gt;Press and hold the Command-Option-P-R keys. You must press this key combination before the gray screen appears. &lt;/li&gt;    &lt;li&gt;Hold the keys down until the computer restarts and you hear the startup sound for the second time. &lt;/li&gt;    &lt;li&gt;Release the keys. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6228202470734041783?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6228202470734041783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6228202470734041783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6228202470734041783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6228202470734041783'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/06/mac-osx-1052-freezing-intermittently.html' title='Mac OSX 10.5.2 Freezing Intermittently'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-3407119143702701553</id><published>2008-06-03T20:56:00.001-04:00</published><updated>2008-06-03T20:56:49.823-04:00</updated><title type='text'>Windows Search 4.0 Released .....and searching finally works!</title><content type='html'>&lt;p&gt;I've been dealing with Outlook 2007's search problems since installing it way back then.&amp;#160; Most frequently, I'd search a keyword; the search pane would fill with information, and then disappear leaving me with &amp;quot;No results found.&amp;quot; I can replicate this problem on every workstation in office, as well as my home workstation.&lt;/p&gt;  &lt;p&gt;Well, Microsoft has &lt;a href="http://windowsvistablog.com/blogs/windowsexperience/archive/2008/06/03/windows-search-4-0-released-to-web.aspx" target="_blank"&gt;announced&lt;/a&gt; the RTW of Windows Search 4.0 as of Tuesday June 3, 2008 and my preliminary tests look promising.&amp;#160; So far, all of my keyword and &amp;quot;from:&amp;quot; searches have worked as expected with no clearing of results.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Downloads&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=55C18CB3-C916-4298-ABA3-5B98904F7CDA&amp;amp;displaylang=en" target="_blank"&gt;Windows Search 4.0 for Windows XP (x86)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2720F870-F910-412A-8C41-D04BD93890F9&amp;amp;displaylang=en" target="_blank"&gt;Windows Search 4.0 for Windows XP (x64)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=BC28ED7F-C51B-49CD-B505-95B91B453284&amp;amp;displaylang=en" target="_blank"&gt;Windows Search 4.0 for Windows Vista (x86)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=D45E9B5E-B52A-489C-A935-172F0002C492&amp;amp;displaylang=en" target="_blank"&gt;Windows Search 4.0 for Windows Vista (x64)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=070B6969-6205-4A03-82BE-8AF7320A663D&amp;amp;displaylang=en" target="_blank"&gt;Windows Search 4.0 for Windows 2003 (x86)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=206DF1B0-05AD-4563-8EB9-B0620420471C&amp;amp;displaylang=en" target="_blank"&gt;Windows Search 4.0 for Windows 2003 (x64)&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3407119143702701553?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3407119143702701553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3407119143702701553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3407119143702701553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3407119143702701553'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/06/windows-search-40-released-and.html' title='Windows Search 4.0 Released .....and searching finally works!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2871591057208310520</id><published>2008-05-28T15:55:00.001-04:00</published><updated>2008-05-28T15:55:22.157-04:00</updated><title type='text'>Follow-up: Monitor Disappointment: Dell 2208WFP 22" Wide Screen LCD</title><content type='html'>&lt;p&gt;&lt;a href="http://mbccs.blogspot.com/2008/05/monitor-disappointment-dell-2208wfp-22.html"&gt;I previously wrote&lt;/a&gt; about how displeased I was with a pair of Dell 2208WFP 22&amp;quot; Wide Screen LCD's and I just thought I'd provide a quick follow-up on what happened and what I settled with.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mbccs.com/" target="_blank"&gt;MBC&lt;/a&gt; is a Dell VAR; we order hardware from Dell non-stop, and lots of it, so I was really surprised and disappointed in the experience we had trying to return these, especially when my rep told me that we were one of his bigger accounts.&amp;#160; Apparently Dell does not like to return peripherals because they end up loosing money on them in shipping alone.&amp;#160; Not that I really care - after all, how they ship their product isn't my problem, and I was even willing to pay a restocking fee (which, by the way, we didn't end up paying).&amp;#160; After more then I would have expected back and forth between myself and our Dell rep, Dell finally agreed to return the monitors.&amp;#160; But after about a week of &amp;quot;you will receive the return instructions via email shortly,&amp;quot; I began to get even more annoyed, thinking the return would never actually happen.&amp;#160; Finally, the issue was escalated to my reps manager and we did actually receive the return instructions, and off the monitors went.&lt;/p&gt;  &lt;p&gt;I decided to settle on a pair of Dell 2009W 20&amp;quot; Wide Screen LCD's that should be arriving any day now.&amp;#160; I certainly hope these are as good, if not better then my current Dell 2007WFP's (also 20&amp;quot;).&lt;/p&gt;  &lt;p&gt;I will be sure to write about them once I start using them, but I did want to provide a quick overview of my return headaches.&amp;#160; Dell &amp;quot;lesson of the day&amp;quot;: be persistent and they'll eventually give in.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2871591057208310520?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2871591057208310520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2871591057208310520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2871591057208310520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2871591057208310520'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/05/follow-up-monitor-disappointment-dell.html' title='Follow-up: Monitor Disappointment: Dell 2208WFP 22&amp;quot; Wide Screen LCD'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-1907782164608215803</id><published>2008-05-28T15:43:00.001-04:00</published><updated>2008-05-29T00:15:30.493-04:00</updated><title type='text'>How to determine if the clients browser accepts GZIP compression</title><content type='html'>&lt;p&gt;A quick way to determine if the clients web browser accepts GZIP compression:&lt;/p&gt;  &lt;pre style="font-family: courier new"&gt;string AcceptEncoding = Request.Headers[&amp;quot;Accept-Encoding&amp;quot;];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: courier new"&gt;bool gZipSupported = (!string.IsNullOrEmpty(AcceptEncoding) &amp;amp;&amp;amp; &lt;br /&gt;   AcceptEncoding.IndexOf(&amp;quot;gzip&amp;quot;, StringComparison.InvariantCultureIgnoreCase) &amp;gt; -1);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Thats it!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-1907782164608215803?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/1907782164608215803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=1907782164608215803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1907782164608215803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1907782164608215803'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/05/how-to-determine-if-clients-browser.html' title='How to determine if the clients browser accepts GZIP compression'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-5116100115878263874</id><published>2008-05-14T22:09:00.001-04:00</published><updated>2008-05-14T22:09:44.648-04:00</updated><title type='text'>Setting Default Values on Automatic Properties</title><content type='html'>&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;code{&lt;br /&gt;font-family: "Courier New";&lt;br /&gt;color: #990000;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pre {&lt;br /&gt;background-color: #fbedbb;&lt;br /&gt;font-family: "Courier New";&lt;br /&gt;}&lt;/style&gt;  &lt;ul class="download"&gt;   &lt;li&gt;&lt;a href="http://www.codeproject.com/KB/dotnet/AutoPropsDefaultValues/Article_src.zip"&gt;Download source - 4 Kb&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;C# 3.0 introduces a great new feature called Automatic Properties, and if you haven&amp;#8217;t already read about them, I would encourage you to read &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/03/08/new-c-orcas-language-features-automatic-properties-object-initializers-and-collection-initializers.aspx"&gt;Scott Guthrie's introductory post&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As great as they are and as much time as they save, Automatic Properties have a serious drawback &amp;#8211; you can&amp;#8217;t set the default value of the property. Instead, the compiler will initialize value properties to 0, reference properties to null, and enum&amp;#8217;s to the first member, and while this might work for some applications, it wasn&amp;#8217;t working for mine.&lt;/p&gt;  &lt;h2&gt;Background&lt;/h2&gt;  &lt;p&gt;When I thought about the implementation, two options became apparent. One, I could create a base object class and have all of my classes inherit from this base class. This however isn&amp;#8217;t a great solution because a number of my classes inherit from other classes outside of my control, and since .NET does not support multiple inheritances, it was clear this wasn&amp;#8217;t going to work. To my rescue was the also new C# 3.0 feature, Extension Methods. If you haven&amp;#8217;t already heard about Extension Methods I&amp;#8217;d recommend reading another one of &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/03/08/new-c-orcas-language-features-automatic-properties-object-initializers-and-collection-initializers.aspx"&gt;Scott Guthrie's blog posts&lt;/a&gt; about them.&lt;/p&gt;  &lt;h2&gt;Using the Code&lt;/h2&gt;  &lt;p&gt;Using the code requires that you decorate your properties with an attribute already available in the &lt;code&gt;System.ComponentModel&lt;/code&gt; namespace &amp;#8211; if you haven&amp;#8217;t already guessed it, it&amp;#8217;s the aptly named &lt;code&gt;DefaultValueAttribute&lt;/code&gt; attribute. As well, it requires a quick call to the &lt;code&gt;InitDefaults()&lt;/code&gt; extension method from the constructor which I will discuss a bit later.&lt;/p&gt;  &lt;p&gt;The attached code supplies a demo implementation of the &lt;code&gt;TestObject&lt;/code&gt; and &lt;code&gt;TestObjectInherited&lt;/code&gt; classes:&lt;/p&gt;  &lt;pre lang="c#"&gt;public class TestObject&lt;br /&gt;    {&lt;br /&gt;        public TestObject()&lt;br /&gt;        {&lt;br /&gt;            this.InitDefaults();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DefaultValue(-45)]&lt;br /&gt;        public int DefaultInt&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DefaultValue(10.23)]&lt;br /&gt;        public double DefaultDouble&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DefaultValue(true)]&lt;br /&gt;        public bool DefaultBool&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DefaultValue(TestEnum.Value2)]&lt;br /&gt;        public TestEnum DefaultEnum&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DefaultValue(&amp;quot;DefaultString!&amp;quot;)]&lt;br /&gt;        public string DefaultString&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string StringWithoutDefault&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string ValueOfPrivateProperty&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return PrivateProperty;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [DefaultValue(&amp;quot;This is a private property!&amp;quot;)]&lt;br /&gt;        protected string PrivateProperty&lt;br /&gt;        {&lt;br /&gt;            get;&lt;br /&gt;            set;        &lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The magical &lt;code&gt;InitDefaults()&lt;/code&gt; method is implemented as an extension method which uses reflection to set the value of the properties to the default value:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre lang="c#"&gt;public static void InitDefaults(this object o)&lt;br /&gt;        {&lt;br /&gt;            PropertyInfo[] props = o.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);&lt;br /&gt;&lt;br /&gt;            for (int i = 0; i &amp;lt; props.Length; i++)&lt;br /&gt;            {&lt;br /&gt;                PropertyInfo prop = props[i];                &lt;br /&gt;&lt;br /&gt;                if (prop.GetCustomAttributes(true).Length &amp;gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    object[] defaultValueAttribute = prop.GetCustomAttributes(typeof(DefaultValueAttribute), true);&lt;br /&gt;&lt;br /&gt;                    if (defaultValueAttribute != null)                    &lt;br /&gt;                    {&lt;br /&gt;                        DefaultValueAttribute dva = defaultValueAttribute[0] as DefaultValueAttribute;&lt;br /&gt;                        &lt;br /&gt;                        if(dva != null)&lt;br /&gt;                            prop.SetValue(o, dva.Value, null);                                &lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Points of Interest&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I decided to support initializing the default value of properties in inherited classes, but if you don&amp;#8217;t want this behaviour you can simply pass &lt;code&gt;false&lt;/code&gt; to &lt;code&gt;GetCustomAttributes()&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre lang="c#"&gt;if (prop.GetCustomAttributes(false).Length &amp;gt; 0)&lt;br /&gt;                {&lt;br /&gt;                    object[] defaultValueAttribute = prop.GetCustomAttributes(typeof(DefaultValueAttribute), false);&lt;br /&gt;&lt;br /&gt;                    if (defaultValueAttribute != null)                    &lt;br /&gt;                    {&lt;br /&gt;                        DefaultValueAttribute dva = defaultValueAttribute[0] as DefaultValueAttribute;&lt;br /&gt;                        &lt;br /&gt;                        if(dva != null)&lt;br /&gt;                            prop.SetValue(o, dva.Value, null);                                &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/28329697-5116100115878263874?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/5116100115878263874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=5116100115878263874' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5116100115878263874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5116100115878263874'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/05/setting-default-values-on-automatic.html' title='Setting Default Values on Automatic Properties'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-1964146875853837627</id><published>2008-05-07T13:20:00.001-04:00</published><updated>2008-05-14T09:07:53.273-04:00</updated><title type='text'>Monitor Disappointment: Dell 2208WFP 22" Wide Screen LCD</title><content type='html'>&lt;p&gt;I've owned a number of Dell LCD monitors over the years, and with every new monitor I've used, my satisfaction with them increased, that is until yesterday when I received two new Dell 2208WFP's.&lt;/p&gt;  &lt;p&gt;The short of it is that they are back in the box, being returned to Dell for another set of 2008WFP's to replace my home monitors (17&amp;quot;).&lt;/p&gt;  &lt;p&gt;I've read that the 22&amp;quot; LCD's are the &amp;quot;odd panels out&amp;quot; in that 22&amp;quot; is between 20&amp;quot; and 24&amp;quot; where the resolutions increase.&amp;#160; Still, I didn't think they'd be a downgrade from my current 20&amp;quot; panels.&lt;/p&gt;  &lt;p&gt;First impression was BRIGHT - man were they bright - I was nearly blinded.&amp;#160; Usually some simple adjustments to brightness, contrast and sometimes gamma will resolve these types of issue, but to my disappointment, once I got the brightness to a reasonable level, all of the colors appeared washed out. I also noticed a red tint to the panel, and gray text appeared blurry.&amp;#160; No matter how I tried, I just couldn't get the color to look good at any reasonable brightness level.&amp;#160; It was either too bright, or washed out.&lt;/p&gt;  &lt;p&gt;I'd love to get a pair or 24&amp;quot; wide screen monitors but the truth is that I don't think I have room on my desk for them - the 22&amp;quot; monitors were pushing it already.&lt;/p&gt;  &lt;p&gt;So there you have it - stay away from the Dell 2208WFP.&amp;#160; I should add that the rest of Dell's monitor line up is spectacular so definitely don't let this discourage you from buying them!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-1964146875853837627?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/1964146875853837627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=1964146875853837627' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1964146875853837627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1964146875853837627'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/05/monitor-disappointment-dell-2208wfp-22.html' title='Monitor Disappointment: Dell 2208WFP 22&amp;quot; Wide Screen LCD'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6360472316324455932</id><published>2008-04-28T14:37:00.001-04:00</published><updated>2008-04-28T14:37:50.019-04:00</updated><title type='text'>Toggling display property on TD element in Firefox has unexpected results</title><content type='html'>&lt;p&gt;I just encountered a really odd behavior in Firefox.&amp;#160; Basically I was toggling the display property between none and block on a TD element via script:&lt;/p&gt;  &lt;p&gt;el.style.display = 'none';   &lt;br /&gt;el.style.display = 'block';&lt;/p&gt;  &lt;p&gt;The element defaulted to style=&amp;quot;display:none&amp;quot;.&amp;#160; The first round worked as expected, but after showing and hiding it over and over the results were either that the height kept growing, or the TD element was moving to the right and causing the table to exceed its boundaries.&lt;/p&gt;  &lt;p&gt;The solution ended up being to just toggle it between &amp;quot;none&amp;quot; and &amp;quot;&amp;quot;:&lt;/p&gt;  &lt;p&gt;By default:&lt;/p&gt;  &lt;p&gt;&amp;lt;td style=&amp;quot;display:none&amp;quot; id=&amp;quot;el&amp;quot;&amp;gt;&lt;/p&gt;  &lt;p&gt;To show it:&lt;/p&gt;  &lt;p&gt;$get('el').style.display = '';&lt;/p&gt;  &lt;p&gt;To hide it:&lt;/p&gt;  &lt;p&gt;$get('el').style.display = 'none';&lt;/p&gt;  &lt;p&gt;I'm still not sure what the exact problem was, but maybe this will help someone else out in a jam...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6360472316324455932?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6360472316324455932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6360472316324455932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6360472316324455932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6360472316324455932'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/04/toggling-display-property-on-td-element.html' title='Toggling display property on TD element in Firefox has unexpected results'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2148451206317936478</id><published>2008-03-17T20:03:00.001-04:00</published><updated>2008-03-17T20:09:10.214-04:00</updated><title type='text'>Dell, Broadcom &amp; Scalable Networking Pack - Relief is in sight!</title><content type='html'>&lt;p&gt;I've &lt;a href="http://mbccs.blogspot.com/2008/01/dell-poweredge-broadcom-issues.html" target="_blank"&gt;written&lt;/a&gt; &lt;a href="http://mbccs.blogspot.com/2008/01/vista-hangs-at-login-with-is-waiting.html" target="_blank"&gt;before&lt;/a&gt; about features of the Scalable Networking Pack, specifically TCP Chimney Offloading / TOE, and the problems it has caused me with a number of Dell Servers and workstations equipped with Broadcom network adapters.&amp;#160; I thought I was the only one having this problem, surely Dell's claims to have never heard about the problem didn't help, but it seems enough users were bickering that Microsoft has released a hotfix for the issue.&lt;/p&gt;  &lt;p&gt;The full article can be found at &lt;a title="http://support.microsoft.com/kb/948496" href="http://support.microsoft.com/kb/948496"&gt;http://support.microsoft.com/kb/948496&lt;/a&gt; and as for downloads:&lt;/p&gt;  &lt;p&gt;x86: &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=062E954C-FDEC-45AF-A09C-5A05B8F010A5" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=062E954C-FDEC-45AF-A09C-5A05B8F010A5"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=062E954C-FDEC-45AF-A09C-5A05B8F010A5&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;x64: &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=38E66572-5D47-4219-82D7-DB0C57478950" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=38E66572-5D47-4219-82D7-DB0C57478950"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=38E66572-5D47-4219-82D7-DB0C57478950&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Itanium: &lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=A4D3905C-DD7D-4B3B-96DF-38B7256C26D2" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A4D3905C-DD7D-4B3B-96DF-38B7256C26D2"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=A4D3905C-DD7D-4B3B-96DF-38B7256C26D2&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The quick and dirty summary: &amp;quot;This update turns off default SNP features.&amp;quot; &lt;/p&gt;  &lt;p&gt;There are also a number of other symptoms listed that can be caused by SNP:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; When you try to connect to the server by using a VPN connection, you receive the following error message:      &lt;br /&gt;      &lt;br /&gt;Error 800: Unable to establish connection.      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;You cannot create a Remote Desktop Protocol (RDP) connection to the server.&lt;/li&gt;    &lt;li&gt;You cannot connect to shares on the server from a computer on the local area network. &lt;/li&gt;    &lt;li&gt;You cannot join a client computer to the domain.&lt;/li&gt;    &lt;li&gt;You cannot connect to the Exchange server from a computer that is running Microsoft Outlook.&lt;/li&gt;    &lt;li&gt;Inactive Outlook connections to the Exchange server may not be cleaned up.&lt;/li&gt;    &lt;li&gt;You experience slow network performance. &lt;/li&gt;    &lt;li&gt;You may experience slow network performance when you communicate with a Windows Vista-based computer.&lt;/li&gt;    &lt;li&gt;You cannot create an outgoing FTP connection from the server.&lt;/li&gt;    &lt;li&gt;The Dynamic Host Configuration Protocol (DHCP) server service crashes.&lt;/li&gt;    &lt;li&gt;You experience slow performance when you log on to the domain.&lt;/li&gt;    &lt;li&gt;Network Address Translation (NAT) clients that are located behind Windows Small Business Server 2003 or Internet Security and Acceleration (ISA) Server experience intermittent connection failures. &lt;/li&gt;    &lt;li&gt;You experience intermittent RPC communications failures.&lt;/li&gt;    &lt;li&gt;The server stops responding.&lt;/li&gt;    &lt;li&gt;The server runs low on nonpaged pool memory&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Whether or not this update will make it down to Windows Update remains unknown, but I can tell you for sure, I will be applying this fix liberally - and yes, I will &amp;quot;opt-in&amp;quot; when needed!   &lt;br /&gt;&lt;strong&gt;Correction - It is on Windows Update, as a high-priority update!&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2148451206317936478?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2148451206317936478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2148451206317936478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2148451206317936478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2148451206317936478'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/03/dell-broadcom-scalable-networking-pack.html' title='Dell, Broadcom &amp;amp; Scalable Networking Pack - Relief is in sight!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4555409375842071657</id><published>2008-03-17T16:49:00.001-04:00</published><updated>2008-03-17T16:49:48.541-04:00</updated><title type='text'>Handling long strings with CLR SQL Stored Procedures</title><content type='html'>&lt;p&gt;I've been banging my head on this one for a while now, though only now did I finally sit down to figure out to solve it.&amp;#160; I have (inherited from another dev) a CRL SQL Stored Procedure which outputs a long string.&amp;#160; The signature looks like:&lt;/p&gt;  &lt;p&gt;public static void DoSomething(SqlString input,out SqlString output)&lt;/p&gt;  &lt;p&gt;When &lt;strong&gt;output&lt;/strong&gt; was long, an exception would be thrown similar to:&lt;/p&gt;  &lt;p&gt;System.Data.SqlServer.TruncationException: Trying to convert return value or output parameter of size 28726 bytes to a T-SQL type with a smaller size limit of 8000 bytes.&lt;/p&gt;  &lt;p&gt;Now you'd think that SqlString would map to varchar(max), if possible, but this is not the case. (I should also mention that the output is limited to 4000 bytes when using nvarchar).&lt;/p&gt;  &lt;p&gt;The solution is to use SqlChars instead of SqlString - somewhere behind the scenes, this will get translated back to nvarchar, so the following will work:&lt;/p&gt;  &lt;p&gt;DECLARE @output varchar(max)   &lt;br /&gt;EXEC DoSomething 'Loren Ipsum Dolar', @output output    &lt;br /&gt;SELECT @output&lt;/p&gt;  &lt;p&gt;Of course you will have to convert your string to the SqlChars type before returning:&lt;/p&gt;  &lt;p&gt;char[] chars = &amp;quot;Some String&amp;quot;.ToCharArray();   &lt;br /&gt;output = new SqlChars(chars);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4555409375842071657?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4555409375842071657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4555409375842071657' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4555409375842071657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4555409375842071657'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/03/handling-long-strings-with-clr-sql.html' title='Handling long strings with CLR SQL Stored Procedures'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8657461021020101094</id><published>2008-03-05T20:38:00.001-05:00</published><updated>2008-03-05T20:38:14.479-05:00</updated><title type='text'>Internet Explorer "Operation Aborted" - No more in Internet Explorer 8</title><content type='html'>&lt;p&gt;If you do any amount of DHTML scripting you have most likely come across the dreaded &amp;quot;Operation Aborted&amp;quot; error that plagued Internet Explorer 5, 6 and 7. Sure, in some simple situations it's easy to resolve, but with complex controls tracing the problem can be next to impossible.&amp;#160; I caught up with Chris Wilson, Platform Architect of the Internet Explorer Platform team at Microsoft to ask him about this behavior and see if anything had been done in Internet Explorer 8.&amp;#160; I was pleasantly surprised to hear that as of IE8 Beta 1, IE will now show a standard script error complete with line number instead of wiping out the page and showing the &amp;quot;Operation Aborted Error&amp;quot;.&amp;#160; As he explained, the when the parser encountered this particular problem it would completely abort parsing and throw up the error.&amp;#160; Now you'll get the same behavior as any other script error - a completely rendered page (albeit maybe incorrectly).&lt;/p&gt;  &lt;p&gt;I'm quite excited to try out IE8, now if only the Internet connection at the Venetian didn't suck so badly... &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8657461021020101094?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8657461021020101094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8657461021020101094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8657461021020101094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8657461021020101094'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/03/internet-explorer-aborted-no-more-in.html' title='Internet Explorer &amp;quot;Operation Aborted&amp;quot; - No more in Internet Explorer 8'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6418584038680523113</id><published>2008-03-04T22:27:00.001-05:00</published><updated>2008-03-04T22:27:33.781-05:00</updated><title type='text'>Microsoft Surface at MIX08</title><content type='html'>&lt;p&gt;As you may or may not know, I'm out at MIX08 (if you're here and are looking for something to do, drop me a line: &lt;a href="mailto:steven@mbccs.com"&gt;steven@mbccs.com&lt;/a&gt;) and something that I was surprised to stumble upon was a Microsoft Surface. I spent about 20 minutes playing with it and drilling the presenter and I have one word to describe it: COOL!.&lt;/p&gt;  &lt;p&gt;What's actually amazing is the photo downloading via bluetooth/wireless that Microsoft has shown off in some promotional videos is real, and it does work.&amp;#160; Snap a picture, put the device (complete with a surface-like barcode on it) on the table and wala - picture on Surface, ready to be manipulated.&lt;/p&gt;  &lt;p&gt;I did inquire about public availability and I was told that they won't be commercially available for about 3-4 years.&amp;#160; Right now, they are limited to some &amp;quot;select&amp;quot; partners. Also, the cost of the units right now is anywhere from $5,000 to $10,000&lt;/p&gt;  &lt;p&gt;Something that might not be well known is that Surface in its present form recognizes devices and objects via a bar-code like sticker on the device that is made up of large white dots on a black background - this allows Surface's IR sensors to pick up the signature and identify the device.&amp;#160; They say that RFID identification will likely be available by the time the device is mainstream.&lt;/p&gt;  &lt;p&gt;Anyway's, they are indeed very cool and if you get a chance to interact with one I highly recommend you give it a try! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6418584038680523113?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6418584038680523113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6418584038680523113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6418584038680523113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6418584038680523113'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/03/microsoft-surface-at-mix08.html' title='Microsoft Surface at MIX08'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2779499862679741573</id><published>2008-02-27T16:13:00.001-05:00</published><updated>2008-02-27T16:13:54.801-05:00</updated><title type='text'>IIS 7 FTP Availability</title><content type='html'>&lt;p&gt;When I first installed Windows 2008, the first thing I did was install IIS, but I was stumped when I first launched it.&amp;#160; All of the FTP features I was hoping for (like a GUI to control AD isolation Mode) and integration with the IIS 7 manager were missing, and instead I had to result back to the II6 manager and FTP release.&amp;#160; As it turns out, IIS7 FTP is being delivered out-of-band (this is the topic of another discussion all together), and I was even more disappointed to hear that it wouldn't be available until the official Win2k8 launch!&lt;/p&gt;  &lt;p&gt;Well now that it has officially launched, the IIS team has held up to their promise and IIS7 FTP (FTP7) is indeed available.&lt;/p&gt;  &lt;p&gt;x86: &lt;a href="http://www.iis.net/go/1619"&gt;http://www.iis.net/go/1619&lt;/a&gt;    &lt;br /&gt;x64: &lt;a href="http://www.iis.net/go/1620"&gt;http://www.iis.net/go/1620&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2779499862679741573?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2779499862679741573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2779499862679741573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2779499862679741573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2779499862679741573'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/iis-7-ftp-availability.html' title='IIS 7 FTP Availability'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8071289484948531237</id><published>2008-02-20T23:34:00.001-05:00</published><updated>2008-02-20T23:34:03.267-05:00</updated><title type='text'>MS-DOS Editor still present in Vista</title><content type='html'>&lt;p&gt;Don't ask why I was trying this, but I found it slightly odd that Microsoft was still shipping edit from the MS-DOS days - in fact, as you can see, the copyright is for 1995.&amp;#160; And yes, it is a 16-bit app being hosted by ntvdm.exe (Windows 16-bit virtual machine).&amp;#160; Weird!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/stevenberkovitz/R7z_N09NKkI/AAAAAAAAABY/PA6lHXQNkVs/Capture%5B4%5D"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="382" alt="Capture" src="http://lh4.google.com/stevenberkovitz/R7z_Ok9NKlI/AAAAAAAAABk/hQ83S-PUi1g/Capture_thumb%5B2%5D" width="699" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8071289484948531237?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8071289484948531237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8071289484948531237' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8071289484948531237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8071289484948531237'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/ms-dos-editor-still-present-in-vista.html' title='MS-DOS Editor still present in Vista'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2118955659109118332</id><published>2008-02-20T22:03:00.001-05:00</published><updated>2008-02-20T22:03:59.720-05:00</updated><title type='text'>Examining HTTP responses in kernel-mode cache</title><content type='html'>&lt;p&gt;I came across an &lt;a href="http://blogs.iis.net/thomad/archive/2008/02/20/integrated-pipeline-and-the-kernel-mode-cache.aspx" target="_blank"&gt;interesting post&lt;/a&gt; relating to a problem with a HttpModule caused by kernel-mode cache. The author points out a handy netsh command to view the contents of the kernel-mode cache.&lt;/p&gt;  &lt;p&gt;You will need to have some requests before you will see anything - refreshing &lt;a title="http://localhost/welcome.png" href="http://localhost/welcome.png"&gt;http://localhost/welcome.png&lt;/a&gt; a few times seems to do the trick.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;netsh http show cache &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Snapshot of HTTP response cache:   &lt;br /&gt;-------------------------------- &lt;/p&gt;  &lt;p&gt;URL: &lt;a href="http://localhost:80/welcome.png"&gt;http://localhost:80/welcome.png&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Status code: 200    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; HTTP verb: GET    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Cache policy type: User invalidates    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Creation time: 2007.12.10:5.22.23:0    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Request queue name: DefaultAppPool    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Headers length: 186    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Content length: 184946    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Hit count: 15    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Force disconnect after serving: FALSE&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2118955659109118332?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2118955659109118332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2118955659109118332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2118955659109118332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2118955659109118332'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/examining-http-responses-in-kernel-mode.html' title='Examining HTTP responses in kernel-mode cache'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-3911627414604760159</id><published>2008-02-16T17:02:00.001-05:00</published><updated>2008-02-20T22:06:59.476-05:00</updated><title type='text'>Vista SP1 Installation Results</title><content type='html'>&lt;p&gt;I thought it might be worthwhile to keep track of my Vista SP1 installs and any particular issues I run into.&lt;/p&gt;  &lt;p&gt;Updated: February 20th, 2008&lt;/p&gt;  &lt;h3&gt;First Install: Dell Precision 380, Vista x86&lt;/h3&gt;  &lt;p&gt;Installed without any problems, but about 18 hours later I was prompted to re-active Windows.&amp;#160; Reactivation was successful using online method.&lt;/p&gt;  &lt;h3&gt;Second Install: MacBook with Boot Camp 2.0, Vista x86&lt;/h3&gt;  &lt;p&gt;Installed without any problems but during installation the computer rebooted and booted OS X (default selection) - I suppose this is my fault and easily rectifiable, but something to watch out for&lt;/p&gt;  &lt;h3&gt;Third Install: Dell Latitude D620, Vista x86&lt;/h3&gt;  &lt;p&gt;I first tried to execute the service pack from a network share.&amp;#160; Windows prompted me to run the program, which I did, but after several minutes of waiting I checked Task Manager only to find it was not executing. For the next attempt I copied the file to a local drive and ran it - installation was successful.&lt;/p&gt;  &lt;h3&gt;4) Dell Optiplex 745&lt;/h3&gt;  &lt;p&gt;Installed without problems.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3911627414604760159?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3911627414604760159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3911627414604760159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3911627414604760159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3911627414604760159'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/vista-sp1-installation-results.html' title='Vista SP1 Installation Results'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6171885039380789250</id><published>2008-02-16T16:36:00.001-05:00</published><updated>2008-02-16T16:36:27.512-05:00</updated><title type='text'>Checking the state of TCP Auto-tuning and Chimney (TOE)</title><content type='html'>&lt;p&gt;I previous wrote about &lt;a href="http://blogs.mbccs.com/~r/MbcComputerSolutions/~3/219082934/dell-poweredge-broadcom-issues.html" target="_blank"&gt;disabling TCP chimney&lt;/a&gt; and &lt;a href="http://blogs.mbccs.com/~r/MbcComputerSolutions/~3/219082933/vista-hangs-at-login-with-is-waiting.html" target="_blank"&gt;disabling auto-tuning&lt;/a&gt; - but what if you just want to see the status of these services?&amp;#160; In Widows 2008 and Windows Vista, netsh provides a status summary of these. You can view this information by running the following command:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;netsh int tcp show global&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This yields the following output:&lt;/p&gt;  &lt;p&gt;Querying active state... &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;TCP Global Parameters     &lt;br /&gt;----------------------------------------------      &lt;br /&gt;Receive-Side Scaling State&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : enabled      &lt;br /&gt;&lt;strong&gt;Chimney Offload State&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : disabled       &lt;br /&gt;Receive Window Auto-Tuning Level&amp;#160;&amp;#160;&amp;#160; : disabled        &lt;br /&gt;&lt;/strong&gt;Add-On Congestion Control Provider&amp;#160; : none      &lt;br /&gt;ECN Capability&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : disabled      &lt;br /&gt;RFC 1323 Timestamps&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : disabled&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The second and third line show the chimney status and receive window auto-tuning level respectively.&amp;#160; Auto-tuning is only available on Windows Server 2008 and Windows Vista whereas chimney is available as of Windows 2003 SP2 or SP1 with the SNP (Scalable Networking Pack) installed.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6171885039380789250?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6171885039380789250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6171885039380789250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6171885039380789250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6171885039380789250'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/checking-state-of-tcp-auto-tuning-and.html' title='Checking the state of TCP Auto-tuning and Chimney (TOE)'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-734077154793976824</id><published>2008-02-12T16:53:00.001-05:00</published><updated>2008-02-12T16:53:26.468-05:00</updated><title type='text'>Catching JavaScript errors and masking over the alert() method</title><content type='html'>&lt;p&gt;OK, I didn't think this would be such an amazing concept, but &lt;a href="http://www.componentart.com/forums/ShowPost.aspx?PostID=35957" target="_blank"&gt;apparently someone did&lt;/a&gt;.&amp;#160; JavaScript actually allows you to override the default alert() behaviour; you can use this to display a fancy dialog in place of the standard modal alerts, or just alter the alert:&lt;/p&gt;  &lt;p&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;    &lt;br /&gt;// &amp;lt;![CDATA[     &lt;br /&gt;&amp;#160;&amp;#160; var originalAlert = window.alert;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; window.alert = function(msg) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; originalAlert('Altered Message: ' + msg);     &lt;br /&gt;&amp;#160;&amp;#160; }     &lt;br /&gt;// ]]&amp;gt;    &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;  &lt;p&gt;Furthermore, you can apply the same principal to override the error behaviour:&lt;/p&gt;  &lt;p&gt;window.onerror = function() {    &lt;br /&gt;&amp;#160;&amp;#160; alert('An error occured');     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;The result of an error on the page is a popup &amp;quot;Altered Message: An error occurred&amp;quot;.&lt;/p&gt;  &lt;p&gt;You can test this out by adding another function and method&lt;/p&gt; function throwError(e) {  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; throw 'Exception';   &lt;br /&gt;}  &lt;p&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Click Me&amp;quot; onclick=&amp;quot;throwError();&amp;quot; /&amp;gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-734077154793976824?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/734077154793976824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=734077154793976824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/734077154793976824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/734077154793976824'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/catching-javascript-errors-and-masking.html' title='Catching JavaScript errors and masking over the alert() method'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4107312267645429376</id><published>2008-02-05T17:52:00.001-05:00</published><updated>2008-02-05T17:52:07.620-05:00</updated><title type='text'>It's the simple things that save you...</title><content type='html'>&lt;p&gt;If you work on any type of web farm or cluster, they'll come a time when you have to figure out what web server you are actually hitting.&amp;#160; Sure you could enable tracing, but this comes with consequences (like an application restart).&amp;#160; Something I've gotten into the habit of on every site I work on is including the server name and last date/time refreshed in comments at the bottom of the page.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font face="Courier New" size="1"&gt;&amp;lt;!-- Connected To: &amp;lt;%= HttpContext.Current.Server.MachineName.ToString().ToUpper() %&amp;gt; --&amp;gt;     &lt;br /&gt;&amp;lt;!-- Last Refreshed: &amp;lt;%= DateTime.Now.ToShortDateString() + &amp;quot; &amp;quot; + DateTime.Now.ToLongTimeString() %&amp;gt; --&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Time after time again, I thank myself for doing this..&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4107312267645429376?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4107312267645429376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4107312267645429376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4107312267645429376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4107312267645429376'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/02/it-simple-things-that-save-you.html' title='It&amp;#39;s the simple things that save you...'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-287527159939974421</id><published>2008-01-23T22:11:00.001-05:00</published><updated>2008-01-23T22:11:12.038-05:00</updated><title type='text'>HTML 5 Draft</title><content type='html'>&lt;p&gt;There seems to be a lot of chatter about the HTML 5 draft recently so I thought I'd make the links readily available:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.w3.org/TR/2008/WD-html5-20080122/" target="_blank"&gt;HTML 5 Draft&lt;/a&gt; (long and boring!)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.w3.org/TR/html5-diff/" target="_blank"&gt;HTML 5 differences from HTML 4 Draft&lt;/a&gt; (short and sweet)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I'll be mulling over the documents for the next few days. More on it then!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-287527159939974421?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/287527159939974421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=287527159939974421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/287527159939974421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/287527159939974421'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/01/html-5-draft.html' title='HTML 5 Draft'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6556527968031455110</id><published>2008-01-18T16:44:00.001-05:00</published><updated>2008-01-18T16:44:17.364-05:00</updated><title type='text'>A client-side component for managing window resize events</title><content type='html'>&lt;p&gt;I wrote a while back about &lt;a href="http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html"&gt;fixing IE's window resize event&lt;/a&gt;, and while this implementation works well, it was difficult for other components to hook into and use without re-writing the same code.&lt;/p&gt;  &lt;p&gt;I decided to write a client-side component that handles the window resize event and fires off its own event when the resize has actually completed.&lt;/p&gt;  &lt;p&gt;The code is pretty much the same as my original post, except its encapsulated in a MS AJAX component and exposes a new event.&lt;/p&gt;  &lt;p&gt;The JavaScript looks like:&lt;/p&gt;  &lt;p&gt;/// &amp;lt;reference name=&amp;quot;MicrosoftAjax.js&amp;quot; /&amp;gt;&lt;/p&gt;  &lt;p&gt;Type.registerNamespace('Mbccs.Psp.Web.Manager');&lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.WindowHelper = function() {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Mbccs.Psp.Web.Manager.WindowHelper.initializeBase(this);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._resizeTimeoutHandle = null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._resizeEventDelegate = null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this._resizeHandlerDelegate = null;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.WindowHelper.prototype = {&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; initialize : function() {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Mbccs.Psp.Web.Manager.WindowHelper.callBaseMethod(this, 'initialize');    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(this._resizeEventDelegate === null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._resizeEventDelegate = Function.createDelegate(this, this._resizeHandler);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(this._resizeHandlerDelegate === null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._resizeHandlerDelegate = Function.createDelegate(this, this._resizedHandler);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $addHandler(window, 'resize', this._resizeEventDelegate);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }, &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; dispose : function() {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(this._resizeEventDelegate) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $removeHandler(window, 'resize', this._resizeEventDelegate);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delete this._resizeDelegate;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(this._resizeHandlerDelegate)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delete this._resizeHandlerDelegate;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Mbccs.Psp.Web.Manager.WindowHelper.callBaseMethod(this, 'dispose');    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _resizeHandler : function(e) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; window.clearTimeout(this._resizeTimeoutHandle);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._resizeTimeoutHandle = window.setTimeout(this._resizeHandlerDelegate, 100);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _resizedHandler : function(e) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._onWindowResized(Sys.EventArgs.Empty);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Events    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; add_windowResized : function(handler) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.get_events().addHandler('windowResized', handler);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; remove_windowResized : function(handler) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.get_events().removeHandler('windowResized', handler);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; _onWindowResized : function(e) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var h = this.get_events().getHandler('windowResized');    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(h) h(this, e);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Mbccs.Psp.Web.Manager.WindowHelper.registerClass('Mbccs.Psp.Web.Manager.WindowHelper', Sys.Component);&lt;/p&gt;  &lt;p&gt;An example of using it on your site:&lt;/p&gt;  &lt;p&gt;Sys.Application.add_init(function() {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; window.windowManager = $create(Mbccs.Psp.Web.Manager.WindowHelper, null, {windowResized : page_windowResized}, null, null);    &lt;br /&gt;});&lt;/p&gt;  &lt;p&gt;function page_windowResized(sender, args) {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; alert('Window has been resized!')    &lt;br /&gt;}&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6556527968031455110?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6556527968031455110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6556527968031455110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6556527968031455110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6556527968031455110'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/01/client-side-component-for-managing.html' title='A client-side component for managing window resize events'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-1168166772980348224</id><published>2008-01-18T16:37:00.001-05:00</published><updated>2008-01-18T16:37:26.942-05:00</updated><title type='text'>Vista hangs at login with "Windows is waiting for the user profile service"</title><content type='html'>&lt;p&gt;Along with a change to TCP offloading on our server, a staff member on a Vista machine started encountering a problem when logging in; her computer would hang with &amp;quot;Windows is waiting for the user profile service&amp;quot; on the screen.&amp;#160; Checking the service status from a remote computer showed this service as &amp;quot;Starting...&amp;quot;&lt;/p&gt;  &lt;p&gt;Although I really wanted to remotely debug this issue (grab a stack trace with a debugger attached), the user was anxious to get back to work which means I had to work quickly.&lt;/p&gt;  &lt;p&gt;I stumbled upon a feature named TCP auto-tuning or TCP window scaling.&amp;#160; It turns out, this feature also ties into TCP offloading, which we just disabled on our server due to a &lt;a href="http://mbccs.blogspot.com/2008/01/dell-poweredge-broadcom-issues.html"&gt;Broadcom issue&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;You can turn off auto tuning from the command prompt by running&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;netsh interface tcp set global autotuninglevel=disable &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Sure enough, after running this (from safe mode), the user was able to login again.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-1168166772980348224?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/1168166772980348224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=1168166772980348224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1168166772980348224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1168166772980348224'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/01/vista-hangs-at-login-with-is-waiting.html' title='Vista hangs at login with &amp;quot;Windows is waiting for the user profile service&amp;quot;'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6517736871900485377</id><published>2008-01-18T16:31:00.001-05:00</published><updated>2008-01-18T16:31:58.801-05:00</updated><title type='text'>Dell PowerEdge &amp; Broadcom Issues</title><content type='html'>&lt;p&gt;For some time now we've been experiencing a problem across the board with Dell PowerEdge 2900/2950 servers equipped with Broadcom Gigabit ethernet cards.&amp;#160; The symptoms usually manifest themselves in the form of slow upload speeds between certain endpoints.&amp;#160; Dell Server to Dell Workstation transfers seem unaffected, however when using non Intel/Broadcome cards (Realtek, for example), upload speeds over a gigabit network come in around 100kbytes/second.&amp;#160; We've also had this problem out to the internet when paired with both Cisco and Dell switches.&lt;/p&gt;  &lt;p&gt;Dell Support has been pretty hush on this issue, failing to even admit it is a widespread problem (indeed if you Google about it you'll find lots of complaints).&lt;/p&gt;  &lt;p&gt;TOE seems to be to blame and some posters have gone as far to recommend removing the TOE key (the hardware key that enabled the feature) and reinstalling the OS.&lt;/p&gt;  &lt;p&gt;Indeed it does appear to be a problem with TOE and Broadcom drivers (among the other issues we have with them, but that's another story).&lt;/p&gt;  &lt;p&gt;The good news is that there is a pretty simple fix for this, assuming you are running Windows 2003 SP2 with the Scalable Networking Pack (SNP):&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Netsh int ip set chimney DISABLED&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This disables TOE offloading, known as &amp;quot;TCP Chimney offload&amp;quot; in Windows.&lt;/p&gt;  &lt;p&gt;We've run this on a number of servers now, and in all cases, it has resolved the slow transit issues.&lt;/p&gt;  &lt;p&gt;Now only if Broadcom would fix their drivers.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6517736871900485377?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6517736871900485377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6517736871900485377' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6517736871900485377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6517736871900485377'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/01/dell-poweredge-broadcom-issues.html' title='Dell PowerEdge &amp;amp; Broadcom Issues'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-9169538922643526490</id><published>2008-01-11T15:08:00.001-05:00</published><updated>2008-01-11T15:08:28.067-05:00</updated><title type='text'>Go away vwd.webinfo</title><content type='html'>&lt;p&gt;It seems that every time I go to check in some changes to TFS I have about 10 vwd.webinfo's pending.&lt;/p&gt;  &lt;p&gt;Some research shows that this file is used to determine what services have to start when running the web application.&amp;#160; You can get rid of it by manually editing the project files to remove the reference, but man that's a lot of work!&lt;/p&gt;  &lt;p&gt;It seems to be particularly bad in VS2008.&amp;#160; Some info from Microsoft would be nice!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-9169538922643526490?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/9169538922643526490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=9169538922643526490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/9169538922643526490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/9169538922643526490'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2008/01/go-away-vwdwebinfo.html' title='Go away vwd.webinfo'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-572256134366307782</id><published>2007-12-11T20:52:00.000-05:00</published><updated>2007-12-11T20:54:02.234-05:00</updated><title type='text'>Visual Studio 2008 Setup Hangs @ .NET Framework 3.5</title><content type='html'>On two seperate Vista boxes (the most recent being a fresh install of Vista), the Visual Studio 2008 installation hangs during the "Microsoft .NET Framework v3.5" component.&lt;br /&gt;&lt;br /&gt;In both cases, I was able to install the component by removing the following updates:&lt;br /&gt;- Hotfix for Microsoft Windows (KB110806)&lt;br /&gt;- Hotfix for Microsoft Windows (KB930264)&lt;br /&gt;- Hotfix for Microsoft Windows (KB929300)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-572256134366307782?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/572256134366307782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=572256134366307782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/572256134366307782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/572256134366307782'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/12/visual-studio-2008-setup-hangs-net.html' title='Visual Studio 2008 Setup Hangs @ .NET Framework 3.5'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6936247999867317018</id><published>2007-11-30T15:41:00.001-05:00</published><updated>2007-11-30T15:41:24.036-05:00</updated><title type='text'>Fixing the window resize event in IE</title><content type='html'>&lt;p&gt;Anyone who has hooked into the resize event of the window object in Internet Explorer knows the pain - the event is fired twice for every single movement (once for horizontal and once for vertical).&amp;#160; To make matters worse, if you drag the window size it doesn't get fried twice at the end, it gets fired numerous times throughout the resize.&amp;#160; The result of this is that if you are hooked into the event and are resizing some other elements (and probably re-rendering them too), performance suffers and the page seems unresponsive.&lt;/p&gt;  &lt;p&gt;Luckily there is a relatively straight-forward resolution to this:&lt;/p&gt;  &lt;p&gt;Sys.Application.add_load(function(sender, args) {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $addHandler(window, 'resize', window_resize);    &lt;br /&gt;});&lt;/p&gt;  &lt;p&gt;var resizeTimeoutId;&lt;/p&gt;  &lt;p&gt;function window_resize(e) {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; window.clearTimeout(resizeTimeoutId);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resizeTimeoutId = window.setTimeout('doResizeCode();', 10);    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Essentially you queue up the resize handling code, and then if the window resize occurs again, you cancel it, and re-queue it.&amp;#160; This keeps happening until the resize is complete, at which point, your doResizeCode() function is actually executed.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6936247999867317018?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6936247999867317018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6936247999867317018' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6936247999867317018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6936247999867317018'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html' title='Fixing the window resize event in IE'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8405068177493533646</id><published>2007-11-30T14:15:00.001-05:00</published><updated>2007-11-30T14:15:15.698-05:00</updated><title type='text'>Recursively finding controls - where to start?</title><content type='html'>&lt;p&gt;I love hearing about bugs and problems in components I have authored.&amp;#160; Most people hate hearing about bugs (I assume because they like to think they are perfect), but I like it because it lets me know that people are actually using components I have written, which is always rewarding to know.&lt;/p&gt;  &lt;p&gt;I had a report on the CodeProject in response to the article I authored, &lt;a href="http://www.codeproject.com/useritems/AJAXPersistScrollPosition.asp"&gt;Persisting the Scroll Position of child DIV's using MS AJAX&lt;/a&gt; about a client-side InvalidOperationException during page initialization.&amp;#160;&amp;#160; The particular user was embedding my control in a user-control placing two of the controls on the page.&amp;#160; Because my control is an &amp;quot;extender&amp;quot;-type control, one of its properties is the control ID of the other control.&amp;#160; I then use a recursive FindControl method to locate the desired control:&lt;/p&gt;  &lt;p&gt;protected virtual Control FindControlRecursive(Control root, string id)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(root.ID == id)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return root;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach(Control c in root.Controls)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Control t = FindControlRecursive(c, id);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(t != null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return t;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The call to FindControlRecursive looks like:&lt;/p&gt;  &lt;p&gt;protected internal Control Control   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(_control == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Page page = Page;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(page == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(&amp;quot;Page cannot be null&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _control = (Control)FindControlRecursive(Page, ControlToPersist);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(_control == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(&amp;quot;Could not located the specified control&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return _control;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;Both DIV's in the user-control were named &amp;quot;div1&amp;quot; - can you spot the problem?&lt;/p&gt;  &lt;p&gt;_control = (Control)FindControlRecursive(&lt;strong&gt;Page&lt;/strong&gt;, ControlToPersist);    &lt;br /&gt;    &lt;br /&gt;How about now? The problem was I was starting to scan from the Page and all of its children controls - since both DIV's were named &amp;quot;div1&amp;quot;, it was always picking up the first control! To resolve this issue I changed Page to Parent:&lt;/p&gt;  &lt;p&gt;_control = (Control)FindControlRecursive(&lt;strong&gt;Parent&lt;/strong&gt;, ControlToPersist);&lt;/p&gt;  &lt;p&gt;In this case, the Parent is the web-control (or page) hosting the extender control. Lesson Learned: Always start scanning controls from your parent control, not anything higher up in the chain.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8405068177493533646?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8405068177493533646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8405068177493533646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8405068177493533646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8405068177493533646'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/recursively-finding-controls-where-to.html' title='Recursively finding controls - where to start?'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4575369439693385302</id><published>2007-11-26T22:14:00.001-05:00</published><updated>2007-11-26T22:14:53.933-05:00</updated><title type='text'>Don't store request variables in the ViewState!</title><content type='html'>&lt;p&gt;I've been mucking around with (D)LINQ all week (this will probably be its own series of posts if I get around to it) and as a part of this, I've been reading &lt;em&gt;a lot&lt;/em&gt; of blogs (no-thanks to Microsoft's lack of implementation demos).&amp;#160; Something I've noticed in a few entries is storing a variable available in the Requests body in the pages ViewState. &lt;/p&gt;  &lt;p&gt;public partial class _Default : System.Web.UI.Page    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected void Page_Load(object sender, EventArgs e)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!Page.IsPostBack)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!string.IsNullOrEmpty(Request[&amp;quot;id&amp;quot;]))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id = Convert.ToInt32(Request[&amp;quot;Id&amp;quot;]);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; protected void Button1_Click(object sender, EventArgs e)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Controls.Add(new LiteralControl(string.Format(&amp;quot;Id is {0}&amp;quot;, Id)));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; protected int Id   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object o = ViewState[&amp;quot;Id&amp;quot;]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (o == null ? -1 : (int)o);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { ViewState[&amp;quot;Id&amp;quot;] = value; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;I can think of a few reasons why this is unnecessary:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;During any ASP.NET client-server interaction on this page, the exact URL will be used hence the data will always be available in the HttpRequest object&lt;/li&gt;    &lt;li&gt;Adds to viewstate (obviously) = increased transit size and time-to-serve&lt;/li&gt;    &lt;li&gt;Serialization/deserialization on every hit&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Since it's available on every request, don't bother yourself with the viewstate, save a few lines of code and just grab it from the Request during the pages Load event:&lt;/p&gt;  &lt;p&gt;public partial class _Default : System.Web.UI.Page    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int Id; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; protected void Page_Load(object sender, EventArgs e)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!string.IsNullOrEmpty(Request[&amp;quot;id&amp;quot;]))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id = Convert.ToInt32(Request[&amp;quot;Id&amp;quot;]); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!Page.IsPostBack)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Do stuff...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; protected void Button1_Click(object sender, EventArgs e)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Controls.Add(new LiteralControl(string.Format(&amp;quot;Id is {0}&amp;quot;, Id)));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;As an added bonus, the HttpRequest is available much earlier in the page lifecycle (before the viewstate) permitting initial events access to this (you would of course need to parse it much earlier too).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4575369439693385302?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4575369439693385302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4575369439693385302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4575369439693385302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4575369439693385302'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/don-store-request-variables-in.html' title='Don&amp;#39;t store request variables in the ViewState!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-1917042842938458135</id><published>2007-11-19T17:13:00.001-05:00</published><updated>2007-11-19T17:13:32.419-05:00</updated><title type='text'>Apple Warranty's aren't so  hot</title><content type='html'>&lt;p&gt;I feel like every time I open my mouth about Apple something negative comes out. I try to be positive, I really do, but the reality is that experience after experience, I just don't have anything good today.&lt;/p&gt;  &lt;p&gt;I came into my office today to find my MacBook revving its fan's at high speed displaying a folder with a question mark.&amp;#160; Rebooting only yielded a &amp;quot;click-click-click,&amp;quot; classic HD failure symptom. Luckily nothing is important on this machine.&amp;#160; This raises the first myth I'd like to dispel: &amp;quot;Apple hardware is of higher quality than others.&amp;quot;&amp;#160; FALSE! The truth is, Apple, Dell, HP, Lenovo, etc., all use pretty much the same hardware.&amp;#160; At the end of the day, they all have Intel processors, ATI/NVidia/Intel video cards, and Maxtor/Segate/WD hard drives, and they all share the same failure rates.&lt;/p&gt;  &lt;p&gt;I was actually somewhat excited about this failure as it'd let me test Apple's support first hand.&lt;/p&gt;  &lt;p&gt;My initial call was answered by a routing agent within a few rings, but upon routing, I waited on hold for 20 minutes.&amp;#160; I rarely wait more then 5 minutes with Dell.&amp;#160; Upon reaching a tech, I was asked for my first name, phone number, and serial number.&amp;#160; I was advised that I have a 1yr hardware warranty and that my 90 phone support warrantee had expired. &amp;quot;It's definitely a hardware issue,&amp;quot; I said.&amp;#160; The Apple rep kindly replied &amp;quot;OK, well what I can do then is start a support incident [requiring your credit card], and if it turns out to be hardware, we'll refund your money.&amp;quot;&amp;#160; I then asked what the next step would be and it turned out that for MacBooks, Apple does &lt;strong&gt;not&lt;/strong&gt; offer advanced replacements or on-site technicians, rather you have to take it to an authorized depot.&amp;#160; This regardless of warranty type.&lt;/p&gt;  &lt;p&gt;My experience at the depot (MIAD) wasn't much better - A tech came to take my computer, but upon trying to enter in the information into his system, he was unable to do so because of a system problem.&amp;#160; I waited for 20 minutes only to be told that &amp;quot;we'll enter it in later and send you the info.&amp;quot;&amp;#160; Not wanted to leave my laptop without any type of receipt, I had the tech write down all his info on a business card. I'm told I they will have a part within 24-72 hours, and fixed within 48 hours after that, depending on their volume (ie: it could be longer).&lt;/p&gt;  &lt;p&gt;So all in all, I'm not overly impressed.&amp;#160; Just for the sake of it, let's take a look at a &amp;quot;standard&amp;quot; warranty on a MacBook Pro versus a Dell Latitude:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="130"&gt;&lt;strong&gt;Standard Features&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="102"&gt;&lt;strong&gt;Dell Latitude&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="166"&gt;&lt;strong&gt;Apple MacBook Pro&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="129"&gt;&lt;strong&gt;Phone Support &lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="102"&gt;Lifetime&lt;/td&gt;        &lt;td valign="top" width="166"&gt;90 days&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;&lt;strong&gt;Hardware Warranty &lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="102"&gt;3yrs&lt;/td&gt;        &lt;td valign="top" width="166"&gt;1yr&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;&lt;strong&gt;Hardware Replacement&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="102"&gt;Next Business Day advanced swap, 4hr and 2yr available&lt;/td&gt;        &lt;td valign="top" width="166"&gt;24-72 hours for parts + 24-72 hours for replacement, return to depot, no advanced swap available&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;&lt;strong&gt;Onsite Technician&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="102"&gt;For parts deemed not &amp;quot;customer replaceable units&amp;quot; (CRU)&lt;/td&gt;        &lt;td valign="top" width="166"&gt;Not offered&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-1917042842938458135?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/1917042842938458135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=1917042842938458135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1917042842938458135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1917042842938458135'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/apple-warranty-aren-so-hot.html' title='Apple Warranty&amp;#39;s aren&amp;#39;t so  hot'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2553981735207574581</id><published>2007-11-14T15:07:00.001-05:00</published><updated>2007-11-14T15:07:39.177-05:00</updated><title type='text'>MS AJAX Sys.UI.DomEvent documentation missing keyCode property</title><content type='html'>&lt;p&gt;If you've ever reviewed the JavaScript source code for some MS AJAX-based components like the AJAX Control Toolkit, you might have noticed the use of the Sys.UI.DomEvent.keyCode property in a number of places to handle keyboard input in controls.&amp;#160; I had recalled that there was also a charCode property on the same class, so interested in what the difference was, I headed over to &lt;a title="http://asp.net/AJAX/Documentation/Live/ClientReference/Sys.UI/DomEventClass/default.aspx" href="http://asp.net/AJAX/Documentation/Live/ClientReference/Sys.UI/DomEventClass/default.aspx"&gt;http://asp.net/AJAX/Documentation/Live/ClientReference/Sys.UI/DomEventClass/default.aspx&lt;/a&gt; to take a look at the official documentation, but to my surprise, there was no keyCode property listed.&lt;/p&gt;  &lt;p&gt;My initial reaction was that this was either an internal field or something that had been deprecated in the RTM, yet there are references to it in the target property too.&amp;#160; What I ultimately discovered is that this is a simple omission in the documentation.&lt;/p&gt;  &lt;p&gt;Now back to why I was looking it up in the first place - what exactly is the difference between charCode and keyCode? Patrick Long has a blog entry at &lt;a title="http://blogs.charteris.com/blogs/patl/archive/2007/07/04/keycodes-charcodes-and-asp-net-ajax.aspx" href="http://blogs.charteris.com/blogs/patl/archive/2007/07/04/keycodes-charcodes-and-asp-net-ajax.aspx"&gt;http://blogs.charteris.com/blogs/patl/archive/2007/07/04/keycodes-charcodes-and-asp-net-ajax.aspx&lt;/a&gt; that sums it all up nicely; charCode will return a value related to the character being pressed whereas keyCode is related to the key being pressed.&amp;#160; For example, 7 on the number pad and 7 on the QWERTY pad will return different keyCode values but the same charCode values.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2553981735207574581?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2553981735207574581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2553981735207574581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2553981735207574581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2553981735207574581'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/ms-ajax-sysuidomevent-documentation.html' title='MS AJAX Sys.UI.DomEvent documentation missing keyCode property'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6474302734607956580</id><published>2007-11-13T14:51:00.001-05:00</published><updated>2007-11-13T14:51:54.221-05:00</updated><title type='text'>Widescreen resolutions &amp; DVI</title><content type='html'>&lt;p&gt;One of our helpdesk reps reported an odd problem trying to setup a local workstation with 2 widescreens - when running in DVI, he couldn't get the horizontal resolution any higher then 1280 even though the monitor is optimized for 1400x900.&lt;/p&gt;  &lt;p&gt;We're all used to fiddling with video card drivers to resolve these types of issues, but this one was a bit different because it required a monitor driver (when was the last time you had to install one of those?).&amp;#160; Slight side note, but generally speaking you should install the monitor driver because it usually ships with an color profile for the monitor which helps with replicating color consistently.&lt;/p&gt;  &lt;p&gt;Before I attempted to install the driver for our Acer 1916W's, I figured I'd take a look at the drivers INF file to see if there was anything of interest to help resolve this issue, and sure enough, there was.&lt;/p&gt;  &lt;p&gt;[DEL_CURRENT_REG]   &lt;br /&gt;HKR,MODES    &lt;br /&gt;HKR,,MaxResolution&lt;/p&gt;  &lt;p&gt;[1280]   &lt;br /&gt;HKR,,MaxResolution,,&amp;quot;1440,900&amp;quot;    &lt;br /&gt;    &lt;br /&gt;[AL1916W.AddReg]    &lt;br /&gt;HKR,&amp;quot;MODES\1440,900&amp;quot;,Mode1,,&amp;quot;30.0-82.0,56.0-76.0,+,+&amp;quot;&lt;/p&gt;  &lt;p&gt;The interesting line of course is the one proceeding [AL1916W.AddReg].&amp;#160; HKR is an identifier for &amp;quot;relative root&amp;quot;, which in the case of the Acer driver is HKLM\System\CurrentControlSet\Control\Class\{4D36E96E-E325-11CE-BFC1-08002BE10318}\XXXX\MODES (the GUID is found at the ClassGuid property of the INF file).&amp;#160; You can see that the INF is adding in the supported resolution to the Modes key, allowing us to choose the correct resolution now!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6474302734607956580?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6474302734607956580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6474302734607956580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6474302734607956580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6474302734607956580'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/widescreen-resolutions-dvi.html' title='Widescreen resolutions &amp;amp; DVI'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2575518199422457400</id><published>2007-11-06T22:04:00.001-05:00</published><updated>2007-11-06T22:04:47.359-05:00</updated><title type='text'>Windows Live Writer is Here!</title><content type='html'>&lt;p&gt;Finally, a Microsoft Blog publishing tool that works!&lt;/p&gt;  &lt;p&gt;I have been trying to get Microsoft Word 2007 to talk with Blogger for some time now to no avail and to further frustrate matters, the beta versions of Windows Live Writer would not install on x64, but that has all changed now.&lt;/p&gt;  &lt;p&gt;Microsoft has just released Windows Live Writer, and keeping up with everything else coming out of the Live BU lately, it seems just great!&lt;/p&gt;  &lt;p&gt;If you're interested in trying Windows Live Writer, along with the rest of the Live software packages (Messenger, Photo Gallery, etc), you can grab them at &lt;a title="http://www.windowslive.com/" href="http://www.windowslive.com/"&gt;http://www.windowslive.com/&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2575518199422457400?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2575518199422457400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2575518199422457400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2575518199422457400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2575518199422457400'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/windows-live-writer-is-here.html' title='Windows Live Writer is Here!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6421817437823518342</id><published>2007-11-05T20:10:00.000-05:00</published><updated>2007-11-05T20:11:27.743-05:00</updated><title type='text'>Paul Thurrott's "Inside Windows Server 2008"</title><content type='html'>Paul Thurrott has an interesting article on how Windows Server 2008 was developed - a short but recommended read: &lt;a href="http://www.winsupersite.com/showcase/win2008_inside.asp"&gt;http://www.winsupersite.com/showcase/win2008_inside.asp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6421817437823518342?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6421817437823518342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6421817437823518342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6421817437823518342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6421817437823518342'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/paul-thurrotts-inside-windows-server.html' title='Paul Thurrott&apos;s &quot;Inside Windows Server 2008&quot;'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2301955138843304844</id><published>2007-11-01T11:32:00.001-04:00</published><updated>2007-11-01T11:32:52.587-04:00</updated><title type='text'>Mac Trojan In the Wild</title><content type='html'>&lt;a href="http://www.boingboing.net/2007/10/31/mac-trojan-in-the-wi.html"&gt;http://www.boingboing.net/2007/10/31/mac-trojan-in-the-wi.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe the guy in the Mac commercial shouldn't be so smug next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2301955138843304844?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2301955138843304844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2301955138843304844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2301955138843304844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2301955138843304844'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/11/mac-trojan-in-wild.html' title='Mac Trojan In the Wild'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-44754733913151464</id><published>2007-10-23T16:52:00.000-04:00</published><updated>2007-10-23T16:59:06.216-04:00</updated><title type='text'>My favorite Apple Leopard Features</title><content type='html'>Ahh it wouldn't be a good day if I didn't get to poke a bit of fun at Apple.  Just going through the list of features gives me tons of reasons to upgrade &lt;g&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Boot Camp&lt;/strong&gt;&lt;br /&gt;Can't I download this for free as-is?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;br /&gt;"Enjoy an elegant, distinctive new look across the entire system. The semitransparent menu bar and reflective Dock frame your desktop picture. The active application window stands out with a deeper drop shadow and a distinctive toolbar color. One look at Leopard and you’ll know you’re in for something special."&lt;br /&gt;&lt;br /&gt;Or I could just run Vista...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DVD Player&lt;/strong&gt;&lt;br /&gt;"Enjoy DVD Player’s dramatic new full-screen interface, which puts all your DVD’s features right at your fingertips. Mouse over the top or bottom regions to access onscreen semitransparent displays for a wealth of controls and settings."&lt;br /&gt;&lt;br /&gt;Yes, truly groundbreaking...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Firewall&lt;/strong&gt;&lt;br /&gt;"Gain more control over the built-in firewall. Specify the behavior of specific applications to either allow or block incoming connections."&lt;br /&gt;&lt;br /&gt;Ya thats original&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Library Randomization&lt;/strong&gt;&lt;br /&gt;"Defend against attackers with no effort at all. One of the most common security breaches occurs when a hacker’s code calls a known memory address to have a system function execute malicious code. Leopard frustrates this plan by relocating system libraries to one of several thousand possible randomly assigned addresses."&lt;br /&gt;&lt;br /&gt;Apple: "We invented it first, then MS copied it!"&lt;br /&gt;&lt;br /&gt;"Stronger Encryption for Disk Images&lt;br /&gt;Give your data even more security. Disk Utility now allows you to create encrypted disk images using 256-bit AES encryption."&lt;br /&gt;&lt;br /&gt;Can anyone say Windows 2000?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;System&lt;/strong&gt;&lt;br /&gt;"Empty Trash Button&lt;br /&gt;Empty the Trash from the Trash itself with the Empty Trash button."&lt;br /&gt;&lt;br /&gt;My life will never be the same&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Time Machine&lt;/strong&gt;&lt;br /&gt;Good thing Windows users haven't been enjoying this since Windows 2003.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Unix&lt;/strong&gt;&lt;br /&gt;"64-Bit Applications&lt;br /&gt;Make use of all your existing devices. Leopard is the first mainstream operating system to completely and seamlessly support both 32-bit and 64-bit applications on the same platform."&lt;br /&gt;&lt;br /&gt;Yes Apple, you are the first system to seamlessly support both 32-bit and 64-bit.  Wait, then what I have I been running on my Windows machine for the last 2 years?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Xcode3&lt;/strong&gt;&lt;br /&gt;"Easily visualize your code's structure as you type with a unique highlighting effect, or use your mouse to select a code block to fold out of the way"&lt;br /&gt;&lt;br /&gt;Once again Apple, you have raised the bar.....to Visual Studio 2003.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So all in all, there are 10 new real features?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-44754733913151464?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/44754733913151464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=44754733913151464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/44754733913151464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/44754733913151464'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/10/my-favorite-apple-leopard-features.html' title='My favorite Apple Leopard Features'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-5098512644765519501</id><published>2007-10-17T19:08:00.001-04:00</published><updated>2007-10-17T19:09:43.931-04:00</updated><title type='text'>New Blackberry firmware coming down the pipe?</title><content type='html'>My partner alerted me today to the fact that RIM has finally released 4.2 code for the 8700.  I &lt;a href="http://mbccs.blogspot.com/2007/08/blackberry-8800-software-update-where.html"&gt;complained&lt;/a&gt; a while back that the 8800 code was buggy and in desperate need of an update -  I can only hope that this is a sign of things to come!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-5098512644765519501?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/5098512644765519501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=5098512644765519501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5098512644765519501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5098512644765519501'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/10/new-blackberry-firmware-coming-down.html' title='New Blackberry firmware coming down the pipe?'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-3462108588722527104</id><published>2007-10-10T20:53:00.000-04:00</published><updated>2007-10-10T21:02:57.632-04:00</updated><title type='text'>Watch your Fill Factor</title><content type='html'>I was asked to troubleshoot an issue today with a 3rd party web application that was throwing some SQL Timeout exceptions while attempting to insert data into a database.&lt;br /&gt;&lt;br /&gt;With the exception of long running queries, most timeout errors are caused by a few issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Runaway transaction logs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;High fill factors&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Missing clustered indexes&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While I could probably write entire articles on each of these, I'm going to concentrate on the fill factors.&lt;/p&gt;&lt;p&gt;First, it's important to know that SQL Server itself does not have any timeouts; rather timeouts are implemented by the data provider (the .NET SQL providers) or the client (query analyzer, etc).&lt;/p&gt;&lt;p&gt;So what exactly is the fill factor? The fill factor is a parameter you set on indexes (both clustered and non-clustered); it controls the percentge of free space to leave on each page to leave room for future growth.  Lower fill factors leads to less page splits.  So why is this important? Well, page splits are expensive - they take a lot of CPU and disk resources to complete.  So if you have a busy DB (lots of inserts into a table), and a high fill factor, then SQL server will have to constantly split pages to accomodate the growth, which might take longer then your timeout, resulting in a timeout error!&lt;/p&gt;&lt;p&gt;According to MSDN documentation (&lt;a href="http://msdn2.microsoft.com/en-us/library/aa933139(SQL.80).aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa933139(SQL.80).aspx&lt;/a&gt;):&lt;/p&gt;&lt;p&gt;"Fill factor value is a percentage from 0 to 100 that specifies how much to fill the data pages after the index is created. A value of 100 means the pages will be full and will take the least amount of storage space. This setting should be used only when there will be no changes to the data, for example, on a read-only table. A lower value leaves more empty space on the data pages, which reduces the need to split data pages as indexes grow but requires more storage space. This setting is more appropriate when there will be changes to the data in the table."&lt;/p&gt;&lt;p&gt;In my particular case, I was able to resolve the timeout issue by changing the fill factor from 90% to 40%.  Why 40% you might ask? The customer did not have overly large amounts of storage and decreasing the fill factor increases storage requirements - I could have set this to 0 but I didn't want to have an out-of-space condition to deal with, so 40% seemed reasonable to me.&lt;/p&gt;&lt;p&gt;Setting the fill factor via script is relatively easy and involves dropping the constraint and re-adding it with the new fill factor.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;ALTER TABLE dbo.MyTableName&lt;br /&gt;   DROP CONSTRAINT PK_MyTableName&lt;br /&gt;GO&lt;br /&gt;ALTER TABLE dbo.MyTableName ADD CONSTRAINT&lt;br /&gt;  PK_MyTableName PRIMARY KEY CLUSTERED  (&lt;br /&gt;    MyTableNameID&lt;br /&gt;  ) WITH FILLFACTOR = 40 ON [PRIMARY]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Just something to watch out for when designing your DB's!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-3462108588722527104?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/3462108588722527104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=3462108588722527104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3462108588722527104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/3462108588722527104'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/10/watch-your-fill-factor.html' title='Watch your Fill Factor'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8554097080477137869</id><published>2007-09-28T14:37:00.001-04:00</published><updated>2007-09-28T14:39:38.216-04:00</updated><title type='text'>JavaScript Gotcha: Check for undefined before null</title><content type='html'>Do you see anything wrong with this line?&lt;br /&gt;&lt;br /&gt;if (a !== null  typeof(a) !== 'undefined') {&lt;br /&gt;   // Do something with a&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;... Well neither did I - but I've had users complaining of an application just giving them a "white screen" - typical of a JavaScript error to abort everything else.  The second time I looked at it I could see what the problem was - I was checking for "a !== null" but a did not yet exist!  The correct way to do this is&lt;br /&gt;&lt;br /&gt;if(typeof(a) !== 'undefined' &amp;amp;&amp;amp; a !== null) {&lt;br /&gt;   // Do something with a&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Note to self: Always check undefined before null!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8554097080477137869?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8554097080477137869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8554097080477137869' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8554097080477137869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8554097080477137869'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/09/javascript-gotcha-check-for-undefined.html' title='JavaScript Gotcha: Check for undefined before null'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8488420586695399634</id><published>2007-09-25T14:32:00.000-04:00</published><updated>2007-09-25T14:36:06.942-04:00</updated><title type='text'>JavaScript Hashtable based on MS AJAX</title><content type='html'>I was looking to implement a JavaScript hashtable and after find a number of near identical implementations, I decicded to modify one that I found at &lt;a href="http://alexrazon.blogspot.com/2006/11/javascript-hashtable-implementation.html"&gt;http://alexrazon.blogspot.com/2006/11/javascript-hashtable-implementation.html&lt;/a&gt; to be based on the MS Ajax Patern.&lt;br /&gt;&lt;br /&gt;Anyways, here it is:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Mbccs.Psp.Web.Manager.Hashtable = function() {&lt;br /&gt; this._hash = new Array();&lt;br /&gt; this._keys = new Array();&lt;br /&gt; this._getEnum = new Array();&lt;br /&gt; this._count = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Mbccs.Psp.Web.Manager.Hashtable.prototype = {&lt;br /&gt; getAt : function(index) {&lt;br /&gt;  return this._hash[this._getEnum[index]];&lt;br /&gt; },&lt;br /&gt; &lt;br /&gt; get : function (key) {&lt;br /&gt;  return this._hash[key];&lt;br /&gt; },&lt;br /&gt;&lt;br /&gt; remove : function (key) {&lt;br /&gt;  for (var i = this._keys.length - 1; i &gt;= 0; i--) {&lt;br /&gt;   if (this._keys[i] == key) {&lt;br /&gt;    this._keys.splice(i, 1);&lt;br /&gt;    this._getEnum.splice(i, 1);&lt;br /&gt;    this._hash[key] = null;&lt;br /&gt;&lt;br /&gt;    this._count = this._keys.length;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; },&lt;br /&gt;&lt;br /&gt; put : function (key, value) {&lt;br /&gt;  if (value == null)&lt;br /&gt;   return null;&lt;br /&gt;  if (this._hash[key] == null) {&lt;br /&gt;   this._keys[this._keys.length] = key;&lt;br /&gt;   this._count = this._keys.length;&lt;br /&gt;   this._getEnum[this._count - 1] = key;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  this._hash[key] = value;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Mbccs.Psp.Web.Manager.Hashtable.registerClass('Mbccs.Psp.Web.Manager.Hashtable');&lt;br /&gt;&lt;br /&gt;if(typeof(Sys) !== 'undefined')&lt;br /&gt; Sys.Application.notifyScriptLoaded();&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8488420586695399634?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8488420586695399634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8488420586695399634' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8488420586695399634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8488420586695399634'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/09/javascript-hashtable-based-on-ms-ajax.html' title='JavaScript Hashtable based on MS AJAX'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6291534538284463341</id><published>2007-09-21T15:42:00.000-04:00</published><updated>2007-09-21T15:43:08.171-04:00</updated><title type='text'>Office 2003 SP3 Released</title><content type='html'>Microsoft seemingly quietly released Office 2003 SP3 - if you're not already running Office 2007, you can download the service pack at &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e25b7049-3e13-433b-b9d2-5e3c1132f206&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=e25b7049-3e13-433b-b9d2-5e3c1132f206&amp;amp;displaylang=en&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6291534538284463341?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6291534538284463341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6291534538284463341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6291534538284463341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6291534538284463341'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/09/office-2003-sp3-released.html' title='Office 2003 SP3 Released'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6911503428453976677</id><published>2007-09-10T20:22:00.000-04:00</published><updated>2007-09-10T20:25:37.517-04:00</updated><title type='text'>Why does iTunes setup need to close Outlook?!</title><content type='html'>Everytime I update iTunes I remember why I left it so long - the install process is quite annoying! Can someone please explain to me why it's necessary to close Microsoft Outlook and Internet Explorer while installing iTunes?&lt;br /&gt;&lt;br /&gt;It drives me even more crazy when I see Apple advertisements poking at certain annoyances in Windows yet Apple is usually the worst offender - Apple clearly does not understand the Windows environment, even though most of their software users are Windows users.&lt;br /&gt;&lt;br /&gt;Now only if I could understand why it creates shortcuts everywhere meanwhile it only has 2 checkboxes to disable a few of them. grr!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6911503428453976677?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6911503428453976677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6911503428453976677' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6911503428453976677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6911503428453976677'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/09/why-does-itunes-setup-need-to-close.html' title='Why does iTunes setup need to close Outlook?!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-9033499306150268228</id><published>2007-09-10T17:20:00.000-04:00</published><updated>2007-09-10T17:25:28.790-04:00</updated><title type='text'>Persisting the scroll position of child DIV's using MS AJAX</title><content type='html'>&lt;ul class="download"&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/useritems/AJAXPersistScrollPosition/AJAXPersistScrollPosition_src.zip"&gt;Download source and demo project - 29.5 Kb &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;While the &lt;code&gt;ScriptManager&lt;/code&gt; and &lt;code&gt;UpdatePanel&lt;/code&gt; found in Microsoft AJAX do a good job of persisting your pages scroll position during partial post back operations, you might be surprised to find out the same is not for scrollable child DIV's contained within an &lt;code&gt;UpdatePanel&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;The &lt;code&gt;PersistentScrollPosition&lt;/code&gt; control presented in this article seeks to remedy this issue using a client-side behavior and ASP.NET server control implemented using Microsoft AJAX.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Background &lt;/h2&gt;&lt;p&gt;While it is certainly not my intention to review the internals of the &lt;code&gt;UpdatePanel&lt;/code&gt; and &lt;code&gt;PageRequestManager &lt;/code&gt;or implementing any of the client-side components (&lt;code&gt;Sys.Component&lt;/code&gt;, &lt;code&gt;Sys.UI,Behavior&lt;/code&gt;, &lt;code&gt;Sys.UI.Control&lt;/code&gt;), a quick understanding can go a long way into understanding and resolving this particular problem. There are two key items to keep in mind for this control:&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Client-side components are disposed of and recreated during the partial post back lifecycle so you can't use the controls instance to store any data you need to survive this.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The HTML output of the &lt;code&gt;UpdatePanel&lt;/code&gt; is completely replaced during a partial post back (assuming it was triggered) through the &lt;code&gt;innerHTML&lt;/code&gt; property, which is why the scroll position problem exists in the first place.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;Using the code&lt;/h2&gt;&lt;p&gt;For those who just want the solution, using the code is straight forward. The control has one property you need to set named &lt;code&gt;ControlToPersist&lt;/code&gt;. This is a &lt;code&gt;string &lt;/code&gt;which takes the ID of the server-side container DIV (it must have &lt;code&gt;runat="server"&lt;/code&gt;).&lt;/p&gt;&lt;pre lang="html"&gt;&amp;lt;asp:UpdatePanel runat="server" ID="UpdatePanel" UpdateMode="always"&amp;gt;&lt;br /&gt;&amp;lt;ContentTemplate&amp;gt;&lt;br /&gt;&amp;lt;asp:Button runat="server" ID="btnPostBack" Text="Post Back" OnClick="btnPostBack_Click" /&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;div style="width:590px;height:400px;overflow-y:scroll;overflow-x:hidden;" runat="server" id="persistMe"&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit...&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;mbc:PersistentScrollPosition runat="server" ID="psf1" ControlToPersist="persistMe" /&amp;gt;&lt;br /&gt;&amp;lt;/ContentTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:UpdatePanel&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Building the Control&lt;/h2&gt;&lt;p&gt;The control consists of two parts, both of which for the most part are very "cookie cutter". On the server side, we inhert from &lt;code&gt;Control&lt;/code&gt; and implement &lt;code&gt;IScriptControl&lt;/code&gt; and &lt;code&gt;INamingContainer&lt;/code&gt; and create a &lt;code&gt;HiddenField&lt;/code&gt; during initialization to store our scroll position in between partial post backs.&lt;/p&gt;&lt;br /&gt;&lt;pre lang="CS"&gt;public class PersistentScrollPosition : Control, IScriptControl, INamingContainer&lt;br /&gt;{&lt;br /&gt;protected override void OnInit(EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            base.OnInit(e);&lt;br /&gt;&lt;br /&gt;            // Create hidden control for storage&lt;br /&gt;            storage = new HiddenField();&lt;br /&gt;            storage.ID = "storage";        &lt;br /&gt;            Controls.Add(storage);        &lt;br /&gt;        }}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;When creating the script descriptors for the client-side initiation, we pass through the scrollable DIV's &lt;code&gt;ClientID&lt;/code&gt; as the controls &lt;code&gt;ElementID&lt;/code&gt; and we pass in a reference to the HiddenField's DOM element using the &lt;code&gt;AddElementProprety&lt;/code&gt; method of the &lt;code&gt;ScriptComponentDescriptor&lt;/code&gt; class. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre lang="CS"&gt;public IEnumerable&amp;lt;scriptdescriptor /&amp;gt; GetScriptDescriptors()&lt;br /&gt;        {&lt;br /&gt;            ScriptComponentDescriptor scd =&lt;br /&gt;new ScriptBehaviorDescriptor("Mbccs.WebControls.PersistentScrollPosition", Control.ClientID);        &lt;br /&gt;            scd.AddElementProperty("storage", storage.ClientID);&lt;br /&gt;            yield return scd;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On the client-side, the control inherits from the &lt;code&gt;Sys.UI.Behavior&lt;/code&gt; base class. Upon control intialization, it hooks into two events:&lt;br /&gt;The &lt;code&gt;scroll&lt;/code&gt; DOM event of the DIV, and the &lt;code&gt;EndRequest&lt;/code&gt; event of the &lt;code&gt;Sys.WebForms.PageRequestManager&lt;/code&gt; class. The &lt;code&gt;EndRequest&lt;/code&gt; event is when the scroll state is restored, but I'll get to that shortly.&lt;/p&gt;&lt;br /&gt;&lt;pre lang="jscript"&gt;    initialize : function() {&lt;br /&gt;        Mbccs.WebControls.PersistentScrollPosition.callBaseMethod(this, 'initialize');&lt;br /&gt;    &lt;br /&gt;        this._scrollDelegate = Function.createDelegate(this, this._onScroll);&lt;br /&gt;        this._endRequestDelegate = Function.createDelegate(this, this._onEndRequest);&lt;br /&gt;    &lt;br /&gt;        var prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br /&gt;        prm.add_endRequest(this._endRequestDelegate);&lt;br /&gt;    &lt;br /&gt;        $addHandler(this.get_element(), 'scroll', this._scrollDelegate);&lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;When the DIV is scrolled, the x,y scroll position is serialized and stored in the &lt;code&gt;HiddenField&lt;/code&gt; server-side control we created earlier.&lt;/p&gt;&lt;br /&gt;&lt;pre lang="jscript"&gt;_onScroll : function(e) {            &lt;br /&gt;        this._storage.value =&lt;br /&gt;Sys.Serialization.JavaScriptSerializer.serialize(this._getScrollPosition());&lt;br /&gt;    },&lt;br /&gt;&lt;br /&gt;_getScrollPosition : function() {&lt;br /&gt;        var el = this.get_element();&lt;br /&gt;    &lt;br /&gt;        if (el) {&lt;br /&gt;            return {&lt;br /&gt;                x: el.scrollLeft  0,&lt;br /&gt;                y: el.scrollTop  0&lt;br /&gt;            };&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To prevent null's from floating around, the x,y coordinates are coerced into 0's if either the &lt;code&gt;scrollLeft&lt;/code&gt; or &lt;code&gt;scrollTop &lt;/code&gt;properties are null.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;EndRequest&lt;/code&gt; event is fired when "an asyncronous postback is finished and control has been returned to the browser," (&lt;a href="http://asp.net/AJAX/Documentation/Live/ClientReference/Sys.WebForms/PageRequestManagerClass/default.aspx"&gt;http://asp.net/AJAX/Documentation/Live/ClientReference/Sys.WebForms/PageRequestManagerClass/default.aspx&lt;/a&gt;) so it's a perfect time to restore our scroll state. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre lang="jscript"&gt;_onEndRequest : function(sender, args) {        &lt;br /&gt;        var o = null;    &lt;br /&gt;        if(this._storage.value !== '')&lt;br /&gt;            o = Sys.Serialization.JavaScriptSerializer.deserialize(this._storage.value);&lt;br /&gt;        &lt;br /&gt;        if (o) {&lt;br /&gt;            var el = this.get_element();&lt;br /&gt;            el.scrollLeft = o.x;&lt;br /&gt;            el.scrollTop = o.y;        &lt;br /&gt;            this._storage.value = '';&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;dispose&lt;/code&gt; method isn't usually a place of any particular interest, but its worthy of noting that it you need to unhook the DIV's &lt;code&gt;scroll &lt;/code&gt;event prior to calling &lt;code&gt;dispose&lt;/code&gt; on the base class.&lt;/p&gt;&lt;pre lang="jscript"&gt;dispose : function() {            &lt;br /&gt;        $removeHandler(this.get_element(), 'scroll', this._scrollDelegate);&lt;br /&gt;    &lt;br /&gt;        Mbccs.WebControls.PersistentScrollPosition.callBaseMethod(this, 'dispose');            &lt;br /&gt;    &lt;br /&gt;        var prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br /&gt;        prm.remove_endRequest(this._endRequestDelegate);            &lt;br /&gt;    &lt;br /&gt;        delete this._endRequestDelegate;&lt;br /&gt;        delete this._scrollDelegate;                            &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/28329697-9033499306150268228?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/9033499306150268228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=9033499306150268228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/9033499306150268228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/9033499306150268228'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/09/persisting-scroll-position-of-child.html' title='Persisting the scroll position of child DIV&apos;s using MS AJAX'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6126893159954965554</id><published>2007-09-04T20:11:00.000-04:00</published><updated>2007-09-04T20:15:19.777-04:00</updated><title type='text'>Strongly typed URL's for ASP.NET</title><content type='html'>I came across an interesting article today on The Code Project titled &lt;a href="http://www.codeproject.com/useritems/slink.asp"&gt;Strongly typed URL's for ASP.NET &lt;/a&gt;by Brian Chavez which is a Visual Studio add-in that creates strongly typed classes for your site's file structure and navigation.&lt;br /&gt;&lt;br /&gt;It's actually a neat concept - it creates a static class with strongly typed members that map to the actual files - if you ever change a filename, instead of worrying about updating it across the site, just use the generated class and you won't have any problems!&lt;br /&gt;&lt;br /&gt;The only thing that I can see getting annoying is having to continually update the generated class - I suppose you could add this to your build process, but when first building a site, it might get tedious as you are constantly adding new files to the project structure.&lt;br /&gt;&lt;br /&gt;In any event, it's worth a look!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6126893159954965554?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6126893159954965554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6126893159954965554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6126893159954965554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6126893159954965554'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/09/strongly-typed-urls-for-aspnet.html' title='Strongly typed URL&apos;s for ASP.NET'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8893658982029678768</id><published>2007-08-23T19:05:00.000-04:00</published><updated>2007-08-23T19:12:44.828-04:00</updated><title type='text'>Yes, you can use C# controls in VB.NET code</title><content type='html'>I've been helping a student out using the &lt;a href="http://www.codeproject.com/aspnet/outlooktimefield.asp"&gt;Outlook-like Time Field Control&lt;/a&gt; I authored.  She's been trying to port the code from C# to VB.NET.  I've been trying my best to help her but unfortunatly it's been a long time (luckily) since I've had to deal with anything coded in VB.NET.&lt;br /&gt;&lt;br /&gt;After a number of back and forths, I finally asked, "why exactly are you trying to port it over?" and her response was "surley i can't still use the control "as is" if its in C#?"&lt;br /&gt;&lt;br /&gt;It seems that in all of her classes, no one failed to mention the &lt;a href="http://msdn2.microsoft.com/en-us/library/12a7a7h3.aspx"&gt;CLS/Common Language Specification&lt;/a&gt;.  She was even more surprised to hear that much of the CLR and .NET framework were authored in C#, even though she has been using it trouble-free in VB.NET.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Side note: If you are interested in why much of it is authored in C# I suggest you read &lt;/em&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb266332.aspx"&gt;&lt;em&gt;Scott Guthrie's interview in the Architecture Journal&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;This highlights one of the fundamental benefits of the .NET "world" - language neutrality.  It doesn't matter if your coding in C#, VB.NET, Managed C++ or even Python.net for that matter, you can rest assured knowing that you can use components authored in any one of the supported .NET languages.  Now that is productive!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8893658982029678768?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8893658982029678768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8893658982029678768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8893658982029678768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8893658982029678768'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/yes-you-can-use-c-controls-in-vbnet.html' title='Yes, you can use C# controls in VB.NET code'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2501247021187894881</id><published>2007-08-21T19:29:00.000-04:00</published><updated>2007-08-21T19:32:56.068-04:00</updated><title type='text'>Blackberry 8800 software update - where are you?</title><content type='html'>There is nothing more frustrating than a buggy handheld device - except for close to 5 months of bugginess! I've been a Blackberry user for years now and I've always been impressed with RIM's ability to crank out fixes and updates - that is, until the 8800.  I picked mine up on March 31st, 2007 (no thanks to the 2 month hold-up), and within a few days had experienced a number of NullPointerExceptions, random other crashes, freezes, etc.  "No worries, they'll fix it soon" I said - now, months later, I'm left wondering when they are going to fix all these issues!&lt;br /&gt;&lt;br /&gt;I've heard rumors of a 4.3 handheld code for the 8800 - thats nice and all, but the 8800 has some serious flaws that deserve some fixes, sooner rather then later.&lt;br /&gt;&lt;br /&gt;Am I the only one who has serious problems with this device?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2501247021187894881?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2501247021187894881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2501247021187894881' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2501247021187894881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2501247021187894881'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/blackberry-8800-software-update-where.html' title='Blackberry 8800 software update - where are you?'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2278464645887983823</id><published>2007-08-15T15:55:00.000-04:00</published><updated>2007-08-15T16:02:03.972-04:00</updated><title type='text'>C# ? operator - Nullable shorthand</title><content type='html'>The Nullable&lt;t&gt; structure is a new generic structure to C# 2.0 which allows null values for value types (reference types obviously support this). This is useful in avoiding the magical "-1"'s and such.&lt;br /&gt;&lt;br /&gt;The C# 2.0 compiler also provides a handy shorthand operator for this - ?.&lt;br /&gt;&lt;br /&gt;To define a nullable integer you use one of the following statements:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Nullable&amp;lt;int&amp;gt; nullInt = new Nullable&amp;lt;int&amp;gt;(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Nullable&amp;lt;int&amp;gt;nullInt = new Nullable&amp;lt;int&amp;gt;(2); // Initialzie to 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OR&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int? nullInt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int? nullInt = 2;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;spanto&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Console.WriteLine(nullInt.HasValue ? nullInt.Value.ToString() : "NULL!");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Very handy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2278464645887983823?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2278464645887983823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2278464645887983823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2278464645887983823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2278464645887983823'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/c-operator-nullable-shorthand.html' title='C# ? operator - Nullable&lt;T&gt; shorthand'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6588183292846738650</id><published>2007-08-13T20:46:00.000-04:00</published><updated>2007-08-13T20:52:06.008-04:00</updated><title type='text'>Assigning an programs output to a variable in a batch file</title><content type='html'>This one took me longer than it should have to figure out.  I had to write a batch file to integrate with our monitoring appliance - I can't really remember the last time I had to do this, but the number 6.22 comes to mind.&lt;br /&gt;&lt;br /&gt;Anyways, the goal was to set a variable's value to the output (note: note the exit code) to the variable.  You can't do this with the SET command so I had to result to using the FOR statement.&lt;br /&gt;&lt;br /&gt;From a command prompt, it looks like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;for /f "tokens=*" %a in ('Program.exe "argument1"')  do set __VARIABLENAME__=%a&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Only one gotcha - in a batch file, you need to double up your % identifiers.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;REM This is the start of the batch file&lt;br /&gt;for /f "tokens=*" %%a in ('Program.exe "argument1"')  do set __VARIABLENAME__=%%a&lt;br /&gt;echo Result is %__VARIABLENAME__%&lt;br /&gt;REM This is the end of the batch file&lt;/span&gt;&lt;/p&gt;I'm glad thats over, back to C# for me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6588183292846738650?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6588183292846738650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6588183292846738650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6588183292846738650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6588183292846738650'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/assigning-programs-output-to-variable.html' title='Assigning an programs output to a variable in a batch file'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-6971481435759675306</id><published>2007-08-08T10:21:00.000-04:00</published><updated>2007-08-08T10:27:53.080-04:00</updated><title type='text'>System.Net.WebException from XmlDocument.Load</title><content type='html'>I had a really bizzare problem today - I was loading a &lt;strong&gt;local&lt;/strong&gt; XML document via XmlDocument.Load and it was throwing a System.Net.WebException - The remote server returned an error: (503) Server Unavailable.&lt;br /&gt;&lt;br /&gt;I was totally stumped, and then I hapened to open the XML document in question (it's actually an XHTML document), and I noticed that the first line was a DOCTYPE with a link to an external DTD.&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;Sure enough, following the&lt;br /&gt;&lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt; link gave me a 503 Server Unavailable error!&lt;br /&gt;&lt;br /&gt;To resolve the problem I simply removed the DOCTYPE from the HTML document.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-6971481435759675306?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/6971481435759675306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=6971481435759675306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6971481435759675306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/6971481435759675306'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/systemnetwebexception-from.html' title='System.Net.WebException from XmlDocument.Load'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-1242732312668821895</id><published>2007-08-07T16:29:00.001-04:00</published><updated>2007-08-07T16:37:50.352-04:00</updated><title type='text'>Choosing appropriate field lengths</title><content type='html'>For every project that I work on I seem to have the same argument with myself about field lengths (mainly when dealing with SQL) - just how long should they be? What is appropriate for first name, last name, and email address columns?&lt;br /&gt;&lt;br /&gt;I used to start big, 100 characters for first/last name and 255 characters for email addressses.  Recently I was revisiting my thinking of lengths so I decided to run some stats on the one of the larger DB's that I maintain.  Here's what I found.&lt;br /&gt;&lt;br /&gt;First Name:  Max 27, Avg 6&lt;br /&gt;Last Name: Max 27, Avg 6&lt;br /&gt;Email: Max 76, Avg 22&lt;br /&gt;&lt;br /&gt;The first thing that hit me was, geeze, a 76 character email address - that's a lot of typing! The second thing was that my column length allocations were on the really high (and unnecessary) end of the spectrum.&lt;br /&gt;&lt;br /&gt;I always like to leave a bit of room because users always seem to do the unthinkable, so moving foward, my allocations look like:&lt;br /&gt;&lt;br /&gt;First &amp; Last name: 35&lt;br /&gt;Email: 100&lt;br /&gt;&lt;br /&gt;Since I mainly use variable length columns (varchar/nvarchar), storage is never really an issue, however when you start allocating 255 characters to each column it is easy to hit the table maximum (w/o BLOB's).  Knowing that I can tone down my allocations gives me some re-assurance that I am less likely to reach the maximum when adding new columns down the road.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-1242732312668821895?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/1242732312668821895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=1242732312668821895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1242732312668821895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1242732312668821895'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/choosing-appropriate-field-lengths.html' title='Choosing appropriate field lengths'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-5788233314632787777</id><published>2007-08-02T17:00:00.001-04:00</published><updated>2007-08-02T17:16:17.718-04:00</updated><title type='text'>Why don't things just work in Safari?!</title><content type='html'>When developing web applications, I primarily target Internet Explorer 6/7, and Firefox 1.5/2.0, but I do usually test things in Safari for layout purposes. While I rarley encouter any significant layout problems in Safari (other then its odd font rendering and super-thick anti-aliasing), the second I even think about a client-side component working I seemed to get slaped in the face, especially when it has something to do with callbacks.&lt;br /&gt;&lt;br /&gt;I understand that Apple likes to do its own thing (ie: dock connector on the iPods - USB anyone?), but for god sakes, can't they support a similiar event model to another browser? Granted, Firefox and IE implement different event models too, but at least they are a bit more straight forward to abstract and work with.&lt;br /&gt;&lt;br /&gt;And that is just with Safari 2.0...Don't even get me started about 3.0 (I'd have more to say if it didn't crash everytime I tried to run it on one of my workstations).&lt;br /&gt;&lt;br /&gt;Whats most frustrating is that they've done a good job at supporting layout standards (they even pass the ACID2 test), but from a programming point of view, its a nightmare.  And built in debugging tools? Useless - I get random null references on lines that don't exist and no errors when there actually is a problem.&lt;br /&gt;&lt;br /&gt;Frustrating!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-5788233314632787777?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/5788233314632787777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=5788233314632787777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5788233314632787777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/5788233314632787777'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/08/why-dont-things-just-work-in-safari.html' title='Why don&apos;t things just work in Safari?!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4108609595844929376</id><published>2007-07-30T20:12:00.000-04:00</published><updated>2007-07-30T20:23:31.748-04:00</updated><title type='text'>Standards-based layout saved my day!</title><content type='html'>&lt;p&gt;I can always count on my clients for some last minute urgent changes - I’ve come to expect it -  in fact, I even plan for it (similarly to how I tell all my late friends that things start an hour earlier than they actually do.)  I had a change come up on Thursday afternoon that needed to be completed for Monday morning if possible. It involved a color scheme update, new menu items and a few additional design elements.  My first reaction was “great, this is going to take a few days…” but after opening up the project to take a look at what actually needed to be changed I was pleasantly surprised – it didn’t look like I needed to make any markup changes (with the exception of changing a few words – Fundraising to Fundraise, that kind of stuff).&lt;/p&gt;&lt;br /&gt; &lt;p&gt; Four hours later (most of it spent in Photoshop slicing images and testing in various browsers), the update was complete.  No HTML changes, just a bunch of new images and about 20 lines of CSS to change, amazing!&lt;/p&gt;&lt;br /&gt; &lt;p&gt;One thing that really saved me was having an extra wrappre-DIV around the main content.&lt;br /&gt;&lt;br /&gt; &lt;img src="http://www.mbccs.com/blogimages/20070730-StandardsBased/5.jpg" alt="" /&gt;&lt;/p&gt;&lt;br /&gt; &lt;br /&gt; &lt;p&gt;&lt;br /&gt;  This allowed me to easily add the circles that appear in the bottom right corner.&lt;br /&gt;&lt;br /&gt;  &lt;img src="http://www.mbccs.com/blogimages/20070730-StandardsBased/1.jpg" alt="" /&gt;&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;p&gt; Without the wrapper-DIV I likely would have to either added it to the markup or gotten really creative with the CSS on the mainbody DIV.  Not to say that it wouldn’t be possible to do, just that having it there (it wasn’t really necessary for the original design) made my life that much easier.&lt;/p&gt; &lt;br /&gt; &lt;p&gt;The final results:&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;Before:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt; &lt;img src="http://www.mbccs.com/blogimages/20070730-StandardsBased/2.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;After:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt; &lt;img src="http://www.mbccs.com/blogimages/20070730-StandardsBased/3.jpg" alt="" /&gt;&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;p&gt;To top everything off, the homepage comes down in about 3.7kb of HTML markup which means it loads wicked-fast even on my Blackberry.  And of course it gracefully renders to down-level clients without CSS support.&lt;br /&gt;&lt;br /&gt; &lt;img src="http://www.mbccs.com/blogimages/20070730-StandardsBased/4.jpg" alt="" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4108609595844929376?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4108609595844929376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4108609595844929376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4108609595844929376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4108609595844929376'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/standards-based-layout-saved-my-day_30.html' title='Standards-based layout saved my day!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8116156073084037716</id><published>2007-07-30T15:22:00.000-04:00</published><updated>2007-07-30T15:25:48.718-04:00</updated><title type='text'>Unable to stop or use COM+ component</title><content type='html'>I just had a really bizzare issue on my home workstation.  I was having trouble accessing a COM+ component that has always worked - the error was a standard issue Access Denied.  All the permissions looked fine.  I thought maybe it was having difficulty accessing a file or registry key so I pulled up Sysinternals ProcessExplorer and ProcessMonitor to take a look under the hood - and then I noticed something odd: The account it was running under was showing as &lt;unindentified&gt;.  The only change I had made recently was to hide the account from the Windows login screen (HKLM\Software\Microsoft\Windows NT\Current version\Winlogon\SpecialAccounts\UserList) - sure enough, after I removed this entry it worked as expected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-8116156073084037716?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8116156073084037716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8116156073084037716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8116156073084037716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8116156073084037716'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/unable-to-stop-or-use-com-component.html' title='Unable to stop or use COM+ component'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4785056355887756094</id><published>2007-07-26T18:04:00.001-04:00</published><updated>2007-07-26T19:11:17.267-04:00</updated><title type='text'>Visual Studio 2008 Beta 2 is released</title><content type='html'>Microsoft has just released Microsoft Visual Studio 2008 Beta 2 (in all flavors - standard, pro, team suite, and TFS). It can be downloaded here: &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4785056355887756094?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4785056355887756094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4785056355887756094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4785056355887756094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4785056355887756094'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/visual-studio-2008-beta-2-is-released.html' title='Visual Studio 2008 Beta 2 is released'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-1858578089493456409</id><published>2007-07-26T14:05:00.000-04:00</published><updated>2007-07-26T14:06:00.935-04:00</updated><title type='text'>MBC is a Microsoft Certified Partner!</title><content type='html'>MBC is now a Certified Member of the Microsoft Partner Program as of Tuesday July 3, 2007.&lt;br /&gt;&lt;br /&gt;We have achieved our Networking Infrastructure Solutions Competency.  By achieving this competency, MBC has proven that we have the ability to craft infrastructure solutions for small to midsize businesses that include Windows Server Solutions based on the Microsoft Windows Server 2003 or Windows 2000 Server operating system, or Microsoft Small Business Server 2000 and Windows Small Business Server 2003. These implementations may include crafting solutions that connect Windows-based servers, PC locations, and the Internet; installing a server farm; or building a Windows Small Business Server stand-alone solution that includes file/print capabilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-1858578089493456409?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/1858578089493456409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=1858578089493456409' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1858578089493456409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/1858578089493456409'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/mbc-is-microsoft-certified-partner.html' title='MBC is a Microsoft Certified Partner!'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-8097795508189639148</id><published>2007-07-25T16:17:00.000-04:00</published><updated>2007-07-25T16:24:27.545-04:00</updated><title type='text'>A simple way to handle data collection in email submission forms</title><content type='html'>Frequently I get asked to create a simple web-form that collects a few peices of information and either stores it or sends it to someone as an email - pretty straight forward... Where it gets annoying is when someone asks for a change and you end up messing with a bulk of string concatenation code.&lt;br /&gt;&lt;br /&gt;A really simple solution to this problem is to place all of your controls in a panel, and then loop through the panel's controls collection and create a NameValueCollection with all of the questions/answers - which can then easily be stored or emailed off.&lt;br /&gt;&lt;br /&gt;The code looks something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;NameValueCollection answers = new NameValueCollection();&lt;br /&gt;&lt;br /&gt;answers.Add("Date", DateTime.Now.ToString());&lt;br /&gt;&lt;br /&gt;foreach(Control c in panelName.Controls)&lt;br /&gt;{&lt;br /&gt; switch(c.GetType().Name)&lt;br /&gt; {&lt;br /&gt;  case "TextBox":&lt;br /&gt;   answers.Add(c.ID, ((TextBox)c).Text.Trim());&lt;br /&gt;   break;&lt;br /&gt;  case "DropDownList":&lt;br /&gt;   answers.Add(c.ID, ((DropDownList)c).SelectedValue);&lt;br /&gt;   break;&lt;br /&gt;  case "RadioButton":&lt;br /&gt;   answers.Add(c.ID, ((RadioButton)c).Checked.ToString());&lt;br /&gt;   break;&lt;br /&gt;  case "RadioButtonList":&lt;br /&gt;   answers.Add(c.ID, ((RadioButtonList)c).SelectedValue);&lt;br /&gt;   break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FormMailer.SendResponses(answers);&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/28329697-8097795508189639148?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/8097795508189639148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=8097795508189639148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8097795508189639148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/8097795508189639148'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/simple-way-to-handle-data-collection-in.html' title='A simple way to handle data collection in email submission forms'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-7120906229867214178</id><published>2007-07-24T18:34:00.000-04:00</published><updated>2007-07-26T11:55:25.351-04:00</updated><title type='text'>New version of Nikhil Kothari's Web Development Helper</title><content type='html'>If you haven't already used Nikhil Kothari's Web Development Helper IE plug-in for debugging and tracing web applications, it’s an indispensible app to have in your toolbox. It has been further updated to support class browsing of classes registered within MS AJAX.&lt;br /&gt;&lt;br /&gt;You can read the related blog entry at &lt;a href="http://www.nikhilk.net/Entry.aspx?id=168"&gt;http://www.nikhilk.net/Entry.aspx?id=168&lt;/a&gt; or download it directly from &lt;a href="http://projects.nikhilk.net/Projects/WebDevHelper.aspx"&gt;http://projects.nikhilk.net/Projects/WebDevHelper.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-7120906229867214178?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/7120906229867214178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=7120906229867214178' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/7120906229867214178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/7120906229867214178'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/new-version-of-nikhil-kotharis-web.html' title='New version of Nikhil Kothari&apos;s Web Development Helper'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-2680949497094380841</id><published>2007-07-20T09:48:00.000-04:00</published><updated>2007-07-20T09:55:27.359-04:00</updated><title type='text'>JavaScript Support in Visual Studio 2008 looks like its shaping up</title><content type='html'>Two of the features I'm looking forward to the most in Visual Studio 2008/Orcas is JavaScript Intelli-sense and debugging support.&lt;br /&gt;&lt;br /&gt;Scott Guthrie has a few posts worth checking out by the most recent shows off some of the debugging features - &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/07/19/vs-2008-javascript-debugging.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2007/07/19/vs-2008-javascript-debugging.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-2680949497094380841?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/2680949497094380841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=2680949497094380841' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2680949497094380841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/2680949497094380841'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/javascript-support-in-visual-studio.html' title='JavaScript Support in Visual Studio 2008 looks like its shaping up'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4996858357855293117</id><published>2007-07-19T17:06:00.000-04:00</published><updated>2007-07-22T19:27:32.897-04:00</updated><title type='text'>Using Web Standards to Simplify Web Control Development</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;I've been an advocate of web standards for some time now and I'm frequently surprised to find new ways to simplify seemingly unrelated tasks. This article discusses how web standards can be used in ASP.NET control development to simplify some development tasks, build lighter weight and accessible controls and increase layout flexibility.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;p&gt;This article assumes that you have a basic understanding and knowledge of Web Standards. If you need a primer there are a ton of references out there – one of my favorite being &lt;a href="http://www.alistapart.com/"&gt;A List Apart&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Typical Scenario&lt;/h2&gt;&lt;p&gt;You've probably built a glorified sign in page before using nested tables and lots of spacer images to control layout (see Traditonal.aspx in source) and a handful of properties to control how it is rendered. It may have even looked something like this:&lt;/p&gt;&lt;br /&gt;&lt;img src="http://www.codeproject.com/useritems/WebStandardsControls/WebStandardsControls1.jpg" /&gt;&lt;br /&gt;&lt;p&gt;Your HTML code probably resembled this:&lt;/p&gt;&lt;br /&gt;&lt;pre lang="html"&gt;&amp;lt;table&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            &amp;lt;table&amp;gt;&lt;br /&gt;                &amp;lt;tr&amp;gt;&lt;br /&gt;                    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;/tr&amp;gt;&lt;br /&gt;                &amp;lt;tr&amp;gt;&lt;br /&gt;                    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;/table&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            &amp;lt;table&amp;gt;&lt;br /&gt;                &amp;lt;tr&amp;gt;&lt;br /&gt;                    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;/tr&amp;gt;&lt;br /&gt;                &amp;lt;tr&amp;gt; &lt;br /&gt;                    &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;/tr&amp;gt;&lt;br /&gt;            &amp;lt;/table&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Like all good developers, you built a web control to handle its functionality so you could reuse it across sites. I've added a property named &lt;code&gt;LayoutDirection&lt;/code&gt; to control swapping the two boxes left and right positions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;When it comes to custom control rendering of such controls, you probably often find yourself with if-else blocks scattered throughout your rendering code.&lt;/p&gt;&lt;br /&gt;&lt;pre lang="cs"&gt;private void BuildControlTree()&lt;br /&gt;{&lt;br /&gt;    Controls.Add(new LiteralControl(@"&lt;br /&gt;        &amp;lt;table style=""width: 100%"" cellspacing=""0"" cellpadding=""0""&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt; &amp;lt;td style=""width: 45%""&amp;gt;"));&lt;br /&gt;&lt;br /&gt;    if(LayoutDirection == Direction.Standard)&lt;br /&gt;        BuildNewCustomers();&lt;br /&gt;    else&lt;br /&gt;        BuildExistingCustomers();&lt;br /&gt;&lt;br /&gt;    Controls.Add(new LiteralControl(@"&amp;lt;/td&amp;gt; &amp;lt;td style=""width: 10%""&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td style=""width: 45%;text-align:right;""&amp;gt;"));&lt;br /&gt;&lt;br /&gt;    if(LayoutDirection == Direction.Standard)&lt;br /&gt;        BuildExistingCustomers();&lt;br /&gt;    else&lt;br /&gt;        BuildNewCustomers();&lt;br /&gt;&lt;br /&gt;    Controls.Add(new LiteralControl(@"&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;"));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This has the following drawbacks:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Your code is cluttered with excess HTML &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Making changes is prone to errors because you often have to cut up the fragments further and matching tags properly in a code view can be difficult &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Adding properties to control the layout usually results in scattered if-else blocks. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Styling options are not very flexible without a property for each option &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Difficult to navigate and use on mobile devices such as a Blackberry &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Using Web Standards&lt;br /&gt;&lt;/h2&gt;&lt;p&gt;I always like to start with a barebones structure and then apply styling afterwards. The goal is to keep the presentation near identical. All we need here is a DIV for each box and something to designate a title (I choose the H3 tag in this case).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Our final HTML markup should look something like (See Standards.cs and WebStandards_Bare.aspx):&lt;/p&gt;&lt;br /&gt;&lt;pre lang="html"&gt;&amp;lt;div&amp;gt;&lt;br /&gt;    &amp;lt;div id="signupdiv"&amp;gt;&lt;br /&gt;        &amp;lt;h3&amp;gt;Sign Up&amp;lt;/h3&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;New customers &amp;lt;a href="#"&amp;gt;click here&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id="signindiv"&amp;gt;&lt;br /&gt;        &amp;lt;h3&amp;gt;Sign In&amp;lt;/h3&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;Existing Customers Sign In Below:&amp;lt;/p&amp;gt;&lt;br /&gt;        Email: &amp;lt;input type="text" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;        Pass: &amp;lt;input type="text" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;        &amp;lt;input type="submit" value="Sign In" /&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The rendered output looks like:&lt;/p&gt;&lt;br /&gt;&lt;img src="http://www.codeproject.com/useritems/WebStandardsControls/WebStandardsControls2.jpg" /&gt;&lt;br /&gt;&lt;p&gt;Now all we need to do is apply some styling to get it looking right. For simplicity I assigned each DIV an ID in the web control and referenced it in CSS by ID. In the real world you would probably want to expose properties to control the CSS class assigned to the DIV. Our final CSS looks like:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre lang="html"&gt;#signupdiv, #signindiv {&lt;br /&gt;    width: 45%;&lt;br /&gt;    border: 1px solid #000;&lt;br /&gt;    padding: 1px 1px 0 1px;&lt;br /&gt;    text-align:center;&lt;br /&gt;    height: 175px;&lt;br /&gt;}&lt;br /&gt;#signupdiv&lt;br /&gt;{&lt;br /&gt;    float:left;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#signindiv&lt;br /&gt;{&lt;br /&gt;    float:right;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#signupdiv h3, #signindiv h3&lt;br /&gt;{&lt;br /&gt;    color: #fff;&lt;br /&gt;    background: #444;&lt;br /&gt;    text-align:center;&lt;br /&gt;    width: 100%;&lt;br /&gt;    height: 25px;&lt;br /&gt;    font-weight:normal;&lt;br /&gt;} &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Remember how in the traditional model I added a property named LayoutDirection to the web control so I could swap the left and right boxes? That's no longer needed thanks to the floating techniques available. Not only did we remove an entire property block from our code, we replaced it with two lines of external CSS code!&lt;/p&gt;&lt;br /&gt;&lt;img src="http://www.codeproject.com/useritems/WebStandardsControls/WebStandardsControls3.jpg" /&gt;&lt;br /&gt;&lt;h2&gt;Side-By-Side Comparison&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;We've accomplished identical layouts using both techniques, so how do they stack up next to each other? For simple tasks like this I often like to look at two factors: number of lines of code, size of rendered output. I know that line counting isn't a practical measurement for most projects, but in this case I think it's a good gauge of simplicity.&lt;/p&gt;&lt;br /&gt;&lt;table class="MsoTableMediumShading2Accent1" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="padding: 0in 5.4pt; border-right: medium none #f0f0f0; border-top: 2.25pt solid windowtext; background: #4f81bd; border-left: medium none #f0f0f0; WIDTH: 126.1pt; BORDER-BOTTOM: windowtext 2.25pt solid; " valign="top" width="168"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; "&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="padding: 0in 5.4pt; border-right: medium none #f0f0f0; border-top: 2.25pt solid windowtext; FONT-SIZE: 11pt; BACKGROUND: #4f81bd; BORDER-LEFT: #f0f0f0; WIDTH: 123.7pt; BORDER-BOTTOM: windowtext 2.25pt solid; FONT-FAMILY: Calibri; " valign="top" width="165"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; "&gt;&lt;strong&gt;Traditional &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 2.25pt solid; PADDING-LEFT: 5.4pt; FONT-SIZE: 11pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 122.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 2.25pt solid; FONT-FAMILY: Calibri; mso-background-themecolor: accent1" valign="top" width="163"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 1"&gt;&lt;strong&gt;Standards Based &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 2.25pt solid; PADDING-LEFT: 5.4pt; FONT-SIZE: 11pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 106.55pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 2.25pt solid; FONT-FAMILY: Calibri; mso-background-themecolor: accent1" valign="top" width="142"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 1"&gt;&lt;strong&gt;% Change &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri; mso-yfti-irow: 0"&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 126.1pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: accent1" valign="top" width="168"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 68"&gt;&lt;strong&gt;Web Control Lines of Code &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 123.7pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: background1; mso-background-themeshade: 216" valign="top" width="165"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;128 &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 122.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: background1; mso-background-themeshade: 216" valign="top" width="163"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;55 &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 106.55pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: background1; mso-background-themeshade: 216" valign="top" width="142"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;-57% &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri; mso-yfti-irow: 1"&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 126.1pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: accent1" valign="top" width="168"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 4"&gt;&lt;strong&gt;Rendered HTML Page Size &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 123.7pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent" valign="top" width="165"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;1,899 bytes &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 122.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent" valign="top" width="163"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;1,224 bytes &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 106.55pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent" valign="top" width="142"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;-35% &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri; mso-yfti-irow: 2"&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 126.1pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: accent1" valign="top" width="168"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 68"&gt;&lt;strong&gt;Easily viewable on Blackberry handheld &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 123.7pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: background1; mso-background-themeshade: 216" valign="top" width="165"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;No &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 122.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: background1; mso-background-themeshade: 216" valign="top" width="163"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;Yes &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 106.55pt; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; mso-background-themecolor: background1; mso-background-themeshade: 216" valign="top" width="142"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 64"&gt;N/A &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri; mso-yfti-irow: 3; mso-yfti-lastrow: yes"&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; BACKGROUND: #4f81bd; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 126.1pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 2.25pt solid; mso-background-themecolor: accent1" valign="top" width="168"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-yfti-cnfc: 4"&gt;&lt;strong&gt;Easily viewable without style sheet? &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 123.7pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 2.25pt solid; BACKGROUND-COLOR: transparent" valign="top" width="165"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;No &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 122.45pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 2.25pt solid; BACKGROUND-COLOR: transparent" valign="top" width="163"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;Yes &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;br /&gt;&lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f0f0f0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; WIDTH: 106.55pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 2.25pt solid; BACKGROUND-COLOR: transparent" valign="top" width="142"&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;N/A &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Points of Interest&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If you have been paying attention you might point out that I've excluded the size of the external CSS document (which, by the way, is 361 bytes). The reason for this is that because it will be cached by the browser, it only needs to be downloaded once.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4996858357855293117?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4996858357855293117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4996858357855293117' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4996858357855293117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4996858357855293117'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/using-web-standards-to-simplify-web.html' title='Using Web Standards to Simplify Web Control Development'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-4994960987113512046</id><published>2007-07-19T17:00:00.000-04:00</published><updated>2008-06-19T21:35:09.681-04:00</updated><title type='text'>Unable to create bookmarks in IE7 - "Unspecified Error"</title><content type='html'>&lt;p&gt;I just had a somewhat interesting security problem in Vista that I thought I&amp;#8217;d share.   &lt;br /&gt;    &lt;br /&gt;The problem was in Internet Explorer when creating a bookmark, I&amp;#8217;d receive a message &amp;#8220;Unable to create [URL]. Unspecified error&amp;#8221;. The problem only occurred in protected mode websites which led me to believe it might have been a permissions issue. Indeed, trying to propagate my local account with full access generated an Access is Denied error, so I replaced ownership on the folder successfully, however the problem was still occurring. A bit of research later and here is what I discovered in a nutshell    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;- Windows Vista introduces a new concept called &amp;#8220;Integrity Level&amp;#8221;. Basically, along with every ACL, there is also a &amp;#8220;class&amp;#8221; &amp;#8211; this defines what types of applications can modify a particular file.    &lt;br /&gt;    &lt;br /&gt;- By default, all files allow &amp;#8220;Medium&amp;#8221; or higher applications to modified them, however Internet Explorer running Protected Mode runs at a &amp;#8220;Low&amp;#8221; integrity level (basically, IE can only directly write to files with a Low integrity level associated with them, otherwise, the write has to go through the protected mode broker process which runs as a medium level application)    &lt;br /&gt;    &lt;br /&gt;- The icacls command line utility (introduced in W2K2 SP2 and Vista) includes a new switch that allows you to set the integrity level    &lt;br /&gt;    &lt;br /&gt;To resolve the issue, navigate to c:\users\USERNAME and run the following command against the favorites folder:    &lt;br /&gt;    &lt;br /&gt;icacls Favorites /setintegritylevel (OI)(CI)low    &lt;br /&gt;    &lt;br /&gt;The (OI) and (CI) stand for &amp;#8220;object inherit&amp;#8221; and &amp;#8220;container inherit&amp;#8221; respectively (propagate permissions basically), and the low is pretty obviously assigning a low integrity level requirement to the file.&lt;/p&gt;  &lt;p&gt;[Updated: June 19, 2008 - Step-by-step instructions due to popular demaind]&lt;/p&gt;  &lt;h2&gt;Step-by-step Instructions&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Choose Start -&amp;gt; Run&lt;/li&gt;    &lt;li&gt;Type &amp;quot;cmd&amp;quot; (without the quotes) and press OK&lt;/li&gt;    &lt;li&gt;Navigate to your user folder.&amp;#160; By default, this is c:\users\Username.&amp;#160; In my case:     &lt;br /&gt;      &lt;br /&gt;&lt;font face="Courier New"&gt;cd /d c:\users\steven&lt;/font&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Run icacls:     &lt;br /&gt;      &lt;br /&gt;&lt;font face="Courier New"&gt;icacls Favorites /setintegritylevel (OI)(CI)low&lt;/font&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The sequence should look like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/stevenberkovitz/SFsJTBz5SwI/AAAAAAAAABs/LWKbCvyW2VU/s1600-h/icacls%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="254" alt="icacls" src="http://lh3.ggpht.com/stevenberkovitz/SFsJTRjG2CI/AAAAAAAAABw/XuT1RQBZOiY/icacls_thumb%5B2%5D.jpg?imgmax=800" width="702" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-4994960987113512046?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/4994960987113512046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=4994960987113512046' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4994960987113512046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/4994960987113512046'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2007/07/unable-to-create-bookmarks-in-ie7.html' title='Unable to create bookmarks in IE7 - &amp;quot;Unspecified Error&amp;quot;'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/stevenberkovitz/SFsJTRjG2CI/AAAAAAAAABw/XuT1RQBZOiY/s72-c/icacls_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-114798602977462410</id><published>2006-05-18T16:56:00.000-04:00</published><updated>2006-05-18T17:00:35.853-04:00</updated><title type='text'>Welcome</title><content type='html'>Welcome, and thank you for taking the time to visit.&lt;br /&gt;&lt;br /&gt;Allow me to introduce myself - my name is Steven Berkovitz and I'm VP Development at MBC Development Ltd.&lt;br /&gt;&lt;br /&gt;Over time MBC staff and I will be posting articles, technical information, how-to's, and most importantly, once proprietary code that we are making available to the open-source community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-114798602977462410?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/114798602977462410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=114798602977462410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/114798602977462410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/114798602977462410'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2006/05/welcome.html' title='Welcome'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-114798472599874903</id><published>2006-05-18T16:36:00.000-04:00</published><updated>2006-05-18T16:46:00.200-04:00</updated><title type='text'>ASP.NET Outlook-like Time Field</title><content type='html'>&lt;p&gt;Another updated (and repost) of a Code Project article I authored&lt;/p&gt;&lt;br /&gt;&lt;ul class="download"&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mbccs.com/SourceDemos/OutlookTimeField/default.aspx" target="_blank"&gt;View demo project&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mbccs.com/BlogFiles/outlooktimefield_src.zip"&gt;Download source - 7.64 Kb&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://www.mbccs.com/BlogFiles/outlooktimefield.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;The IT side of my company is almost completely service based, mostly involving on-site technicians. We have an internal e-Business portal that we use to track services rendered to the clients. The complaint I received most often from our technicians was how annoying it was to enter the time in and out for service calls. I was presenting three dropdowns for each time field: one for hour, minute and AM/PM. I had heard enough complaining, it was time to do something. Almost all of the time pickers I found on the net were either based on the same concept or a textbox with a masked input. I found these to be equally annoying as moving from field to field was sometimes cumbersome and input was often too restrictive.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;One of my favorite Outlook features is the time picker used in appointments and tasks. It is a textbox that applies logic when it looses focus. It takes just about anything you can throw at it as input and computes a time in &lt;b&gt;hh:mm tt&lt;/b&gt; format (i.e. 3:45 PM). I decided to duplicate this behavior and encompass it in an ASP.NET 2.0 web control. The standard &lt;code&gt;TextBox&lt;/code&gt; control provided 99% of what I needed to accomplish so I derived my class from this one and started coding!&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;It was decided that the control had to accept any of the following inputs:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;3:45 PM&lt;br /&gt;&lt;li&gt;1:45a&lt;br /&gt;&lt;li&gt;230a&lt;br /&gt;&lt;li&gt;545p&lt;br /&gt;&lt;li&gt;1843&lt;br /&gt;&lt;li&gt;23&lt;br /&gt;&lt;li&gt;21:30 &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;It took me two attempts to get it right. My first attempt involved parsing the input for the location of the colon, reading each side into hours and minutes respectively and then searching for an 'a' or 'p' to indicate the time of the day. However, this proved to be troublesome when the input was not exactly as expected, like when a decimal was used instead, etc.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My final implementation handles this by splitting the text input into two components: a numeric component and a text component. I accomplish this with the following client-side JavaScript (complete JavaScript source code found in &lt;i&gt;App_GlobalResources\OutlookTimeField.txt&lt;/i&gt;):&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Client-side implementation&lt;/h2&gt;&lt;pre lang="jscript"&gt;function UpdateTime(sender) { &lt;br /&gt;    ...&lt;br /&gt;    var numericPart = '';&lt;br /&gt;    var characterPart = '';&lt;br /&gt;    var i;&lt;br /&gt;    var current;&lt;br /&gt; &lt;br /&gt;    // Break the text input into numeric and&lt;br /&gt;    // character parts for easier parsing             &lt;br /&gt;    for(i = 0; i &amp;lt; text.length; i++) {&lt;br /&gt;        current = text.charAt(i);                 &lt;br /&gt;     &lt;br /&gt;        if(IsNumeric(current))&lt;br /&gt;            numericPart = numericPart + current;&lt;br /&gt;         &lt;br /&gt;        if(IsCharacter(current))&lt;br /&gt;            characterPart = characterPart + current;&lt;br /&gt;    }&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function IsNumeric(text) {&lt;br /&gt;   var validChars = '0123456789';&lt;br /&gt;   return (validChars.indexOf(text) &amp;gt; -1)                &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function IsCharacter(text) {&lt;br /&gt;   var validChars =&lt;br /&gt;     'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';&lt;br /&gt;   return (validChars.indexOf(text) &amp;gt; -1)                &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;After the text is split, figuring out what the user intended is relatively simple. First, if the &lt;code&gt;characterPart&lt;/code&gt; contains an A or an a, treat it as AM (unless the hour is greater then 12), otherwise, default to PM. Second, depending on how many characters were entered in the &lt;code&gt;numericPart&lt;/code&gt;, split the hours and minutes according to the following algorithm:&lt;/p&gt;&lt;pre lang="jscript"&gt;...&lt;br /&gt;if(numericPart.length &amp;gt;= 4) {&lt;br /&gt;    hour = numericPart.substring(0, 2);&lt;br /&gt;    minute = numericPart.substring(2, 4);&lt;br /&gt;} else if(numericPart.length == 3) {  &lt;br /&gt;    hour = numericPart.substring(0, 1);&lt;br /&gt;    minute = numericPart.substring(1, 3);&lt;br /&gt;} else if(numericPart.length == 2) {  &lt;br /&gt;    hour = numericPart.substring(0, 2);&lt;br /&gt;    minute = '00';     &lt;br /&gt;} else if(numericPart.length == 1) {  &lt;br /&gt;    hour = numericPart.substring(0, 1);&lt;br /&gt;    minute = '00';                                 &lt;br /&gt;} else {  &lt;br /&gt;    // Just use the current hour&lt;br /&gt;    var d = new Date();&lt;br /&gt;    hour = d.getHours(); &lt;br /&gt; &lt;br /&gt;    minute = '00';&lt;br /&gt;} &lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Next, apply some 24-hour logic:&lt;/p&gt;&lt;pre lang="jscript"&gt;...&lt;br /&gt;if(hour &amp;gt; 12) {&lt;br /&gt;    if(hour &amp;lt;= 24) {&lt;br /&gt;        hour -= 12;&lt;br /&gt;        dayPart = 'PM';&lt;br /&gt;    } else {&lt;br /&gt;        // If the hour is still &amp;gt; 12 then the&lt;br /&gt;        // user has inputed something that doesn't&lt;br /&gt;        // exist, so just use current hour&lt;br /&gt;     &lt;br /&gt;        hour = (new Date()).getHours();             &lt;br /&gt;             &lt;br /&gt;        if(hour &amp;gt; 12) {     &lt;br /&gt;            hour -= 12;&lt;br /&gt;            dayPart = 'PM';&lt;br /&gt;        } else {     &lt;br /&gt;            dayPart = 'AM';&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;if(hour == 0) {&lt;br /&gt;    hour = 12;&lt;br /&gt;    dayPart = 'AM';&lt;br /&gt;}&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;All that's left on the client-side is updating the sending textbox's value: &lt;code&gt;sender.value = hour + ':' + minute + ' ' + dayPart;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Server-side implementation&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;There really isn't much to the server side code. First, override the &lt;code&gt;Render&lt;/code&gt; method to add an &lt;code&gt;onBlur&lt;/code&gt; event to the &lt;code&gt;TextBox&lt;/code&gt;:&lt;/p&gt;&lt;pre lang="cs"&gt;protected override void Render(HtmlTextWriter writer) {     &lt;br /&gt;    writer.AddAttribute(BLUR_ATTRIBUTE, "UpdateTime(this);");&lt;br /&gt;    base.Render(writer);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Second, override the &lt;code&gt;OnPreRender&lt;/code&gt; method to inject the client-side script:&lt;/p&gt;&lt;pre lang="cs"&gt;protected override void OnPreRender(EventArgs e) {&lt;br /&gt;    base.OnPreRender(e);&lt;br /&gt;    if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(),&lt;br /&gt;                                                           SCRIPT_KEY)) {&lt;br /&gt;        Page.ClientScript.RegisterClientScriptBlock(this.GetType(),&lt;br /&gt;          SCRIPT_KEY, Resources.ControlResources.OutlookTimeField, true);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;And last, create a new property that returns a &lt;code&gt;TimeSpan&lt;/code&gt; structure with the corresponding time:&lt;/p&gt;&lt;pre lang="cs"&gt;public TimeSpan Time&lt;br /&gt;{&lt;br /&gt;    get {&lt;br /&gt;        if (string.IsNullOrEmpty(Text))&lt;br /&gt;            return TimeSpan.Zero;&lt;br /&gt;        else&lt;br /&gt;            return TimeSpanHelper.GetTimeSpan(Text);&lt;br /&gt;    }&lt;br /&gt;    set { Text = TimeSpanHelper.ConvertTimeSpanToString(value); }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I won't go into the code that converts to and from the &lt;code&gt;TimeSpan&lt;/code&gt; structure as it's relatively straightforward. You can find my implementation in &lt;i&gt;App_Code\TimeSpanHelper.cs&lt;/i&gt;.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Using the code&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Same as using any other web control, but for the sake of being thorough:&lt;/p&gt;&lt;pre lang="aspnet"&gt;...&lt;br /&gt;&amp;lt;%@ Register TagPrefix="mbc"&lt;br /&gt;                      Namespace="Mbccs.WebControls" %&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;mbc:OutlookTimeField runat="server" ID="startTime"&lt;br /&gt;                            AutoCompleteType="None" /&amp;gt;&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Points of interest&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Set the &lt;code&gt;AutoCompleteType&lt;/code&gt; property of the &lt;code&gt;OutlookTimeField&lt;/code&gt; to &lt;code&gt;None&lt;/code&gt; to prevent any browser annoyances.&lt;br /&gt;&lt;li&gt;This control is not localizable (only suitable for US/CAN)&lt;br /&gt;&lt;li&gt;I have not implemented this web control in a standalone DLL for simplicity and because there are tons of articles on doing this.&lt;br /&gt;&lt;li&gt;I am purposefully throwing a &lt;code&gt;FormatException&lt;/code&gt; (this is not a bug) if you type in bogus data (that the control does not re-format) and attempt to post back. If you want to prevent this, you should:&lt;br /&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;br /&gt;&lt;li&gt;add a &lt;code&gt;RegularExpressionValidator&lt;/code&gt; using the regular expression found in &lt;i&gt;App_Code\TimeSpanHelper.cs&lt;/i&gt; or&lt;br /&gt;&lt;li&gt;catch the exception and apply some custom logic - perhaps using a default date or the current date. &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-114798472599874903?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/114798472599874903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=114798472599874903' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/114798472599874903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/114798472599874903'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2006/05/aspnet-outlook-like-time-field.html' title='ASP.NET Outlook-like Time Field'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28329697.post-114798418239283993</id><published>2006-05-18T16:25:00.000-04:00</published><updated>2006-05-18T16:53:01.730-04:00</updated><title type='text'>Pushing HTML content to a Blackberry</title><content type='html'>&lt;p&gt;&lt;/p&gt;This is a re-post of an updated article I wrote for &lt;a href="http://www.codeproject.com"&gt;The Code Project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul class="download"&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;ul class="download"&gt;&lt;li&gt;&lt;a href="http://www.mbccs.com/blogfiles/MdsBlackberryPush_src.zip"&gt;Download source - 9 Kb&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img height="500" alt="Blackberry showing pushed HTML content" src="http://www.mbccs.com/BlogFiles/MdsBlackberryPush.jpg" width="357" /&gt;&lt;/p&gt;&lt;!-------------------------------     STEP 3      ---------------------------&gt;&lt;!--  Add the article text. Please use simple formatting (&lt;h2&gt;, &lt;p&gt; etc)   --&gt;&lt;br /&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Blackberry's (developed by Research In Motion - RIM) have become a critical part of many corporate networks including IT, financial and government networks. Their always connected nature and rich content delivery services (through Blackberry Enterprise Server and Mobile Data Service) make them very inviting to developers to develop applications for. Out of the box, you can deliver HTML content to them with very little work. Their Java-based operating system allows for developers to create applications that deliver data in real time and can be interacted with using the devices intuitive user interface and full QWERTY keyboard.&lt;br /&gt;&lt;p&gt;I am going to concentrate on the most simplistic way to delivery content to the device using a HTML browser channel. My next article may include a custom application for the handheld.&lt;br /&gt;&lt;p&gt;In order to use this code you need&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;A Blackberry Enterprise Server 4.0 or above&lt;br /&gt;&lt;li&gt;A Blackberry handheld running the 4.0 operating system or above&lt;br /&gt;&lt;li&gt;The IPPP service book installed (automatically installed through Enterprise Activation)&lt;br /&gt;&lt;li&gt;IIS 5 or above to run the WebService I have created &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;How It Works&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;The Mobile Data Service is completely HTTP based. You establish an HTTP connection to your Blackberry Enterprise Server (default port is 8300) with some query parameters and POST containing your data. The handheld's browser listens on port 7874 for incoming pushes. Custom Blackberry HTTP headers specify information about the content and how to display it (including read and unread icons, title, etc). For simplicity sakes, I am going to let the handheld use its default icons. &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Using the code&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;I decided to implement this as a WebService to allow for easy access from other internal applications. The code is pretty straight forward. There is one WebService method and one protected method that handles actually creating the HTTP request and firing it off to the MDS server. Configuration information about the MDS server is held in &lt;code&gt;web.config&lt;/code&gt; and can be accessed using the built in &lt;code&gt;ConfigurationSettings.AppSettings&lt;/code&gt; collection.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The WebService method has the following signature: &lt;pre lang="cs"&gt;public virtual void PushToBrowser(string[] recipients,&lt;br /&gt;                                  string channelTitle,&lt;br /&gt;                                  string channelName,&lt;br /&gt;                                  string baseLocation,&lt;br /&gt;                                  string message)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;To use, create a new application, add a web reference to it (I called mine BesUtils). The code below illustrates how you'd push a simple HTML document to a handheld&lt;/p&gt;&lt;pre lang="cs"&gt;BesUtils.MdsPusher pusher = new BesUtils.MdsPusher();&lt;br /&gt;&lt;br /&gt;string[] recip = {"steven@mbccs.com"};&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;    pusher.PushToBrowser(recip, "Hello World", Guid.NewGuid().ToString(),&lt;br /&gt;               "", "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;Hello World.&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;");&lt;br /&gt;}&lt;br /&gt;catch(Exception ex)&lt;br /&gt;{&lt;br /&gt;    Console.Write(ex.ToString());&lt;br /&gt;} &lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The image at the top of this article illustrates the icon and text that appears when a new message has been pushed to the handheld. You would click the icon to open the browser and it would take you directly to the document you pushed down.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Points of Interest&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You need to keep &lt;code&gt;channelName&lt;/code&gt; constant if you want the handheld to update the same channel, otherwise a new channel will be created each time you push to the handheld.&lt;/li&gt;&lt;li&gt;To remove channels, open your browser (on your handheld), and in the bookmarks section there is a new Node called "Browser Channels". You can remove the channels from here.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28329697-114798418239283993?l=mbccs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mbccs.blogspot.com/feeds/114798418239283993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28329697&amp;postID=114798418239283993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/114798418239283993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28329697/posts/default/114798418239283993'/><link rel='alternate' type='text/html' href='http://mbccs.blogspot.com/2006/05/pushing-html-content-to-blackberry.html' title='Pushing HTML content to a Blackberry'/><author><name>Steven Berkovitz</name><uri>http://www.blogger.com/profile/03753982563911870077</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
