<?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-8223661</id><updated>2012-01-03T06:53:42.312-08:00</updated><category term='Kindle'/><category term='Visual SourceSafe'/><category term='WWW Technologies'/><category term='MS Access'/><category term='MS Exchange'/><category term='gadgets'/><category term='Source Control'/><category term='Web Publishing'/><category term='Web Services'/><category term='SQL Server'/><category term='AJAX'/><category term='Workarounds'/><category term='Online Banking'/><category term='Site Maintenance'/><category term='.NET Framework'/><category term='Security'/><category term='PHP-Nuke'/><category term='Apple'/><category term='Skype'/><category term='Open Source'/><category term='CSLA'/><category term='PHP'/><category term='Yahoo Small Business Services'/><category term='Joomla'/><category term='Blackberry'/><category term='VS .NET 2005'/><category term='Bugs'/><category term='.NET Compact Framework'/><category term='CMS'/><category term='Mac'/><category term='Collaboration'/><category term='VS .NET'/><category term='DirectX'/><category term='Tricks'/><category term='Utilities'/><title type='text'>GhostSpook's Haunted Manor</title><subtitle type='html'>Some of this, some of that... what's the difference!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8223661.post-2062777973458273726</id><published>2010-03-11T21:49:00.000-08:00</published><updated>2010-03-11T22:00:56.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='Kindle'/><title type='text'>Determine the kind of kindle you have</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/S5nYjp7vp0I/AAAAAAAAAUk/gD0qlcXZ9NQ/s1600-h/kindledx.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 108px; height: 178px;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/S5nYjp7vp0I/AAAAAAAAAUk/gD0qlcXZ9NQ/s400/kindledx.jpg" alt="" id="BLOGGER_PHOTO_ID_5447623331344787266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My friend got a Kindle DX as a present and he needed to know if it was a Global Wireless or a US Wireless version.&lt;br /&gt;&lt;br /&gt;Fortunately I found this page that helps you determine what kind of kindle you have based on the serial number. Here is the link:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.mobileread.com/wiki/Kindle_Serial_Numbers"&gt;http://wiki.mobileread.com/wiki/Kindle_Serial_Numbers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Shortly, here is the bottom line based on the first 4 digits of the device's serial number:&lt;br /&gt;&lt;br /&gt;B001 = Kindle 1&lt;br /&gt;B002 = Kindle 2 U.S. (Sprint)&lt;br /&gt;B003 = Kindle 2 International (AT&amp;amp;T)&lt;br /&gt;B004 = Kindle DX U.S.&lt;br /&gt;B005 = Kindle DX International&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-2062777973458273726?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/2062777973458273726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=2062777973458273726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2062777973458273726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2062777973458273726'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2010/03/determine-kind-of-kindle-you-have.html' title='Determine the kind of kindle you have'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RekmCvHQFXY/S5nYjp7vp0I/AAAAAAAAAUk/gD0qlcXZ9NQ/s72-c/kindledx.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-7763307944155979770</id><published>2009-07-13T06:10:00.000-07:00</published><updated>2009-07-13T06:49:21.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='Joomla'/><category scheme='http://www.blogger.com/atom/ns#' term='WWW Technologies'/><title type='text'>Found the cause for ERROR LOADING FEED DATA message in Joomla</title><content type='html'>&lt;div style="text-align: left;"&gt;After updating my client's site from Joomla 1.5.4 to 1.5.9 on my host &lt;a href="http://www.siteground.com/"&gt;Siteground.com&lt;/a&gt; I started seen the following error message on the front page:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Error loading feed data&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I realized that the error was being generated by one &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mod_feed&lt;/span&gt; module published on the site's front page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also found that the problem was related with caching of the xml feed, since changing the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mod_feed&lt;/span&gt; module's &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Cache Time&lt;/span&gt; to a higher value would temporarily fix the problem until the cache timed out, after which the error message came back.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://1.bp.blogspot.com/_RekmCvHQFXY/Sls1AQ0ur5I/AAAAAAAAAT0/gFoJArbRgi4/s400/cachesettings_modfeed.jpg" /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;After reading blogs and forums everywhere it was clear to me that my problem wouldn't be fixed by any of the solutions I found. This was a different issue. Also many people was experiencing a similar problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using trial and error I noticed that some feeds did work fine always, like &lt;a href="http://rss.cnn.com/rss/edition_business.rss"&gt;this one&lt;/a&gt; from CNN, while others didn't (see &lt;a href="http://servicios.eluniverso.com/rss/economia.xml"&gt;this other one&lt;/a&gt; in spanish). I dag into the feeds' source XML and noticed that the feeds that worked fine were the ones which included the &lt;i&gt;time to live &lt;/i&gt; &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;ttl&gt;&lt;/ttl&gt;&lt;/span&gt; tag. I then theorized that the error could be fixed by adding that tag.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To prove my theory I copied the XML source of one of the feeds that didn't work fine (i.e. didn't include the aforementioned tag) into a text editor, then I added the ttl tag and published it on one of my personal sites. Here is the &lt;a href="http://homepage.mac.com/pcastill/indeg/rsssamplefeed.xml"&gt;link to the "fixed" feed&lt;/a&gt;. Then I updated my mod_feed module to point to the feed published on my site... and IT WORKED!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://1.bp.blogspot.com/_RekmCvHQFXY/Sls7L0eE9dI/AAAAAAAAAT8/7nHXGjK1uA4/s400/ttl_tag.jpg" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I repeated the experiment with several other feeds and they all confirmed my theory.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My guess is that there is some sort of bug introduced in one of the updates that affects the way Joomla parses the feeds. It is like Joomla considers the ttl tag as mandatory, which &lt;a href="http://cyber.law.harvard.edu/rss/rss.html#ltttlgtSubelementOfLtchannelgt"&gt;it isn't&lt;/a&gt;. This is as far as I can go, now we need that one our Joomla geniuses go and fix this for us.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-7763307944155979770?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/7763307944155979770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=7763307944155979770' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/7763307944155979770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/7763307944155979770'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2009/07/found-cause-for-error-loading-feed-data.html' title='Found the cause for ERROR LOADING FEED DATA message in Joomla'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RekmCvHQFXY/Sls1AQ0ur5I/AAAAAAAAAT0/gFoJArbRgi4/s72-c/cachesettings_modfeed.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-7724745439474292397</id><published>2008-12-28T09:25:00.000-08:00</published><updated>2009-01-01T11:31:35.741-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blackberry'/><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><title type='text'>Monitor BlackBerry Data Usage</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;IMPORTANT UPDATE FOR 4.5 SYSTEM USERS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;: &lt;a href="http://www.blackberryforums.com/aftermarket-software/122471-minimoni-traffic-data-monitor-new-release-1-01-03-a.html"&gt;MiniMoni doesn't work on Blackberries with 4.5 system&lt;/a&gt;, if that is your case you may want to try the (still free) beta version of &lt;/span&gt;&lt;a href="http://www.berryreview.com/2008/08/19/myboxtone-insight-beta-sign-up-for-a-cool-app/"&gt;&lt;span class="Apple-style-span"&gt;MyBoxTone Insight&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;. As a final option, although not the most accurate one, you can install Opera Mini which keeps a counter for WEB traffic (&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Opera Mini -&gt; Help -&gt; About&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;), which is better than nothing.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;If you look for a data monitor utility to help you keep track of your data usage I suggest you give &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;MiniMoni&lt;/span&gt; a try.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.ehnert.net/MiniMoni/"&gt;MiniMoni&lt;/a&gt; was developed by Alex Ehnert and comes in two presentations for the 4.1 and the 4.2+ systems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have one of those limited data transfer plans, you will find its "Period logging" feature really useful. You set the billing cycle date and MiniMoni will "reset" the data counter. You can set up an alert in case you reach you data transfer limit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can keep a data transfer log for 30, 60 or 90 days. It also displays a live data transfer graphic to visualize data usage, you can disable this graphic when you don't use it to save resources.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-7724745439474292397?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ehnert.net/MiniMoni/' title='Monitor BlackBerry Data Usage'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/7724745439474292397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=7724745439474292397' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/7724745439474292397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/7724745439474292397'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/12/monitor-blackberry-data-usage.html' title='Monitor BlackBerry Data Usage'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-4193396848239944317</id><published>2008-12-19T10:59:00.000-08:00</published><updated>2008-12-19T11:07:57.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Joomla'/><category scheme='http://www.blogger.com/atom/ns#' term='CMS'/><title type='text'>Joomla: Setting Server Time Zone</title><content type='html'>It is not uncommon to have  a website display the site's date and time (as opposed to the local system date and time). If you are using joomla you have plenty of resources to do that: some templates include the time and if not some components will allow you to show it.&lt;br /&gt;&lt;br /&gt;But then you realize that the date/time being displayed is the GMT time. In case you want to change that all you have to do is to login into your Joomla installation's administrator site and choose Global Configuration on the Control Panel.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/SUvvX4KujEI/AAAAAAAAARQ/SO_2bjq9WdY/s1600-h/Joomla+Control+Panel.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 323px;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/SUvvX4KujEI/AAAAAAAAARQ/SO_2bjq9WdY/s400/Joomla+Control+Panel.JPG" alt="" id="BLOGGER_PHOTO_ID_5281578181515447362" border="0" /&gt;&lt;/a&gt;The Global Configuration page will show up. There you will find a Time Zone combo box where you can choose your site's time zone to whatever value you want. In my case I chose GMT-5:00.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/SUvvYIdFAOI/AAAAAAAAARY/rh7Tl6XKzKY/s1600-h/Joomla+Global+Configuration.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 211px;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/SUvvYIdFAOI/AAAAAAAAARY/rh7Tl6XKzKY/s400/Joomla+Global+Configuration.JPG" alt="" id="BLOGGER_PHOTO_ID_5281578185887383778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As usual I hope someone will find this post useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-4193396848239944317?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/4193396848239944317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=4193396848239944317' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/4193396848239944317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/4193396848239944317'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/12/joomla-setting-server-time-zone.html' title='Joomla: Setting Server Time Zone'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RekmCvHQFXY/SUvvX4KujEI/AAAAAAAAARQ/SO_2bjq9WdY/s72-c/Joomla+Control+Panel.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-2699684270190708710</id><published>2008-06-09T13:58:00.000-07:00</published><updated>2009-12-18T06:06:24.273-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='WWW Technologies'/><category scheme='http://www.blogger.com/atom/ns#' term='VS .NET 2005'/><title type='text'>Publishing ICS Calendars From MS Exchange</title><content type='html'>I made a small ASP.NET 2.0 application that publishes calendars from any MS Mailbox in ICS format. I called the solution &lt;span style="font-weight: bold;"&gt;Exchange2ICS&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;For instance you can choose to publish certain users calendars and make them available through a URL like in the following examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://www.mydomain.com/calendars/jsmith.aspx&lt;/li&gt;&lt;li&gt;http://www.mydomain.com/activities/calendar.aspx&lt;/li&gt;&lt;li&gt;http://www.mydomain.com/availability/room1.aspx&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The first URL assumes that you deploy the web application as '&lt;span style="font-family:courier new;"&gt;calendars&lt;/span&gt;' and that you want to publish the calendar items in the mailbox of user &lt;span style="font-family:courier new;"&gt;jsmith&lt;/span&gt;. The second URL assumes that you deploy the web application as '&lt;span style="font-family:courier new;"&gt;activities&lt;/span&gt;' and that you want to publish the calendar items defined in a mailbox named as '&lt;span style="font-family:courier new;"&gt;calendar&lt;/span&gt;'. The  thirt URL assumes that you deploy the web application as '&lt;span style="font-family:courier new;"&gt;availability&lt;/span&gt;' and that you want to publish the calendar items for the mailbox called '&lt;span style="font-family:courier new;"&gt;room1&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;The source (Visual Studio .NET 2005) and binaries can be downloaded &lt;a href="http://homepage.mac.com/pcastill/GSHM/downloads/Exchange2ICS.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Exchange2ICS consumes Exchange Web Services (EWS) so it dinamically requests calendar information from MS Exchange server.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/SE3JFJ7zC5I/AAAAAAAAAL4/i3MCPjtbKtA/s1600-h/Exchange2ICS_2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/SE3JFJ7zC5I/AAAAAAAAAL4/i3MCPjtbKtA/s400/Exchange2ICS_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5210041434340789138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since authentication is mandatory for EWS, you will have to create an ActiveDirectory/Mailbox user that the Exchange2ICS will use to log into EWS. You will also have to add this user as the delegated user with permissions for reading the calendars that you want to publish.&lt;br /&gt;&lt;br /&gt;For instance, if you want publish the calendar for the mailbox &lt;span style="font-family:courier new;"&gt;gameschedule&lt;/span&gt;, you will have to create a new user, say &lt;span style="font-family:courier new;"&gt;e2ics &lt;/span&gt;and using Outlook 2003/2007 delegate &lt;span style="font-family:courier new;"&gt;gameschedule&lt;/span&gt;'s calendar to user &lt;span style="font-family:courier new;"&gt;e2ics &lt;/span&gt;with permissions to read subject, this is the same procedure you would use to have your assistant get read-only access to your scheduled appointments.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Exchange2ICS Architecture&lt;/span&gt;&lt;br /&gt;The VS.NET solution contains 2 proyects:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;www&lt;/span&gt; (a web project)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ProxyHelpers&lt;/span&gt; (a class library project)&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/SE3UH_ROFpI/AAAAAAAAAMA/PffAlyEAFmo/s1600-h/Exchange2ICS.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/SE3UH_ROFpI/AAAAAAAAAMA/PffAlyEAFmo/s400/Exchange2ICS.jpg" alt="" id="BLOGGER_PHOTO_ID_5210053577645364882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ProxyHelpers&lt;/span&gt; is just a wrapper that contains the proxy web service definitions, as described in the book &lt;span class="b"&gt;&lt;a href="http://www.amazon.com/Inside-Microsoft-Exchange-Server-Services/dp/0735623929/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1213058629&amp;amp;sr=8-1"&gt;Inside Microsoft® Exchange Server 2007 Web Services&lt;/a&gt;. This helps keep the rest of the code a little bit cleaner.&lt;br /&gt;&lt;br /&gt;www is an ASP.NET Web Project. The important things in it are:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li style="font-family: courier new; font-weight: bold;"&gt;GetCalendar.aspx&lt;/li&gt;&lt;li style="font-family: courier new; font-weight: bold;"&gt;Web.config&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;GetCalendar.aspx&lt;/span&gt; implements the rendering of the ICS text file, while &lt;span style="font-family:courier new;"&gt;Web.config&lt;/span&gt; contains the configuration settings that will need to be defined at deployment time. Here I have to add that while the returned ICS formatted text is fully compliant and works perfectly fine, it does not use all the options and parameters available as defined in &lt;a href="http://www.ietf.org/rfc/rfc2445.txt"&gt;RFC 2445&lt;/a&gt;. But then again, you have the source code, so go ahead and add any additional feature that you may need.&lt;br /&gt;&lt;br /&gt;Finally, the www ASP.NET Web Project also contains a reference to &lt;span style="font-family:courier new;"&gt;Intelligencia.UrlRewriter.dll&lt;/span&gt;, which implements the URL redirector (&lt;a href="http://urlrewriter.net/"&gt;URLRewriter.NET&lt;/a&gt;) that redirects URLs like:&lt;br /&gt;&lt;br /&gt;http://myserver.com/teachers/jsmith.aspx&lt;br /&gt;&lt;br /&gt;into the following URL:&lt;br /&gt;&lt;br /&gt;http://myserver.com/GetCalendar.aspx?Mailbox=jsmith&lt;br /&gt;&lt;br /&gt;I use &lt;a href="http://urlrewriter.net/"&gt;URLRewriter.NET&lt;/a&gt; to simplify the URLs and also to simplify deployment, as it is fully configurable through the &lt;span style="font-family:courier new;"&gt;Web.config&lt;/span&gt; file. Now, I would have prefered to use .ics extensions as in:&lt;br /&gt;&lt;br /&gt;http://myserver.com/teachers/jsmith.ics&lt;br /&gt;&lt;br /&gt;But while that is possible, its implementation (deployment) depends on which version of IIS you are using. In case you want to dig more into this you can read Scott Guthrie's brilliant &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx"&gt;post about URL Rewriting&lt;/a&gt; on his blog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Configuration (Web.config)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;All the configuration is done through the &lt;span style="font-family:courier new;"&gt;Web.config&lt;/span&gt; file. What matters most is what is in the appSettings section:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="ExchangeDomain"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="mydomain.com"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="EWSUrl"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="https://myserver.mydomain.com/ews/Exchange.ASMX"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="EWSCredentials"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Username=aUser;Password=pass;Domain=myADdomain"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="TZID"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="America/Phoenix"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="TZNAME"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="MST"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="DTSTART"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="19700101T000000"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="TZOFFSETFROM"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="-0700"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="TZOFFSETTO"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="-0700"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;ExchangeDomain&lt;/span&gt; is the domain used to define the mailbox IDs, for example if the users in your organization are &lt;span style="font-family:courier new;"&gt;jsmith@mydomain.com&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;wgordon@mydomain.com&lt;/span&gt;, then the value for this parameter should be &lt;span style="font-family:courier new;"&gt;mydomain.com&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;EWSUrl &lt;/span&gt;is the URL to Exchange Web Services, the host name needs to match the one on the certificate that you used when you installed Exchange Server.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;EWSCredentials&lt;/span&gt; contains the username, password and Active Directory domain for used by the application to log into EWS.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;TZID &lt;/span&gt;is the time zone ID. Here is a list of other &lt;a href="http://www.statoids.com/tus.html"&gt;time zone IDs&lt;/a&gt; in the United States.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;TZNAME &lt;/span&gt;is the &lt;a href="http://www.statoids.com/tus.html"&gt;time zone name&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DTSTART &lt;/span&gt;is mandatory according to &lt;a href="http://www.ietf.org/rfc/rfc2445.txt"&gt;RFC 2445&lt;/a&gt;. It defines the starting date of the calendar. I don't know how important it is though.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DTOFFSETFROM &lt;/span&gt;is the time offset from UTC time for the time zone before daylight savings time applies.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DTOFFSETTO &lt;/span&gt;is the time offset from UTC time for the time zone when daylight savings time applies.&lt;/li&gt;&lt;/ul&gt;There is another seticion that is relevant, the &lt;a href="http://urlrewriter.net/"&gt;URLRewriter.NET&lt;/a&gt; section. The default is:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;rewriter&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;rewrite&lt;/span&gt; &lt;span class="attr"&gt;url&lt;/span&gt;&lt;span class="kwrd"&gt;="~/(.+).aspx"&lt;/span&gt; &lt;span class="attr"&gt;to&lt;/span&gt;&lt;span class="kwrd"&gt;="~/GetCalendar.aspx?Mailbox=$1"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;rewriter&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Which will turn:&lt;br /&gt;&lt;br /&gt;http://&lt;span style="font-style: italic;"&gt;hostname&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;appname&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;calendarname&lt;/span&gt;.aspx&lt;br /&gt;&lt;br /&gt;into&lt;br /&gt;&lt;br /&gt;http://&lt;span style="font-style: italic;"&gt;hostname&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;appname&lt;/span&gt;/GetCalendar.aspx?Mailbox=&lt;span style="font-style: italic;"&gt;calendarname&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can change to fit your needs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Conclusion&lt;/span&gt;&lt;br /&gt;Exchange2ICS is not really sophisticated and is definitely not a comprehensive solution for publishing MS Exchange calendars on ICS format, but it is pretty simple, customizable and it works. Feel free to make any changes you need to the solution and please, let me know of any breakthroughs you make. And if you happen to like it and decide to use it, please let me know about it too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-2699684270190708710?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/2699684270190708710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=2699684270190708710' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2699684270190708710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2699684270190708710'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/06/publishing-ics-calendars-from-ms.html' title='Publishing ICS Calendars From MS Exchange'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RekmCvHQFXY/SE3JFJ7zC5I/AAAAAAAAAL4/i3MCPjtbKtA/s72-c/Exchange2ICS_2.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-7390217257701167135</id><published>2008-05-31T08:13:00.000-07:00</published><updated>2008-05-31T08:38:33.302-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Importing SQL Server 2005 database into SQL Server 2000</title><content type='html'>It happened to me that after writing a whole application using SQL Server 2005 to manage the data I was forced to switch to SQL Server 2000 for deployment reasons.&lt;br /&gt;&lt;br /&gt;Although there is a DB version compatibility option that can be set using SQL Server Management Studio, it doesn't provide real backwards compatibility. In other words, you can't just detach a SQL Server 2005 database and attach it to to an instance of SQL Server 2000.&lt;br /&gt;&lt;br /&gt;While there are several ways to workaround this limitation, I think that the easiest way is the one described in &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=722132&amp;amp;SiteID=1"&gt;a post I found on a Microsoft forum&lt;/a&gt;. Just in case that page disappears one of these days I am transcribing here the step by step instructions:&lt;br /&gt;&lt;br /&gt;&lt;span id="_ctl0_MainContent_PostFlatView"&gt;&lt;span&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: center;" align="center"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style="font-size: 16pt;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: center;" align="center"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style="font-size: 16pt;"&gt;&lt;span style="font-family:Times New Roman;"&gt;How to Downgrade a Database from SQL Server 2005 to SQL Server 2000&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;As you may all know, SQL Server 2005 request a minimum of 8GB RAM to work… let say satisfactorily. I first didn’t knew that and after a while from the upgrade I did from SQL Server 2000 to 2005 my SQL Services were starting to crash three or four times per DAY!!! &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;At first I thought I was being attacked, but soon I realized it was nothing like that. I then decided to downgrade to an SQL Server 2000 edition. Though I looked around the internet to find some information on how to do that, I got very disappointed when I realized that no actual documentation of any kind could be found for that. So I am posting this thread to inform you on the procedures I had to follow for this action. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;Before beginning I must assume, firstly that the user, who will attempt such thing, has &lt;span style=""&gt; &lt;/span&gt;a basic knowledge of SQL Environment, secondly that he has the two versions already installed (both 2000 and 2005), that a basic backup of the databases has been created and finally that all the 2005 SQL Server Users have been created at the SQL Server 2000 environment as well.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;u&gt;&lt;span style="font-size: 14pt;"&gt;Step 1&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;i style=""&gt;&lt;u&gt;&lt;span style="font-size: 14pt;"&gt; Generating Scripts for the Database Elements and Structures&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;1)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Right-click over the desired Database at 2005, Choose Tasks and the Generate Scripts (Option).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;2)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;At the pop-up Dialog Box click at the &lt;i style=""&gt;Script All Objects in the selected Databases&lt;/i&gt; check box, to activate it and then Click the Next Button.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;3)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Set the following Elements to the following Values&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;a.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script Collation , set to TRUE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;b.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script Database Create, set to TRUE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;c.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script of SQL Version, set to SQL SERVER 2000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;d.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script foreign keys, set to FALSE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;e.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script Triggers, set to FALSE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.25in; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt; &lt;/span&gt;Then Hit the Next button&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;4)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Select the way the generated scripts should be saved (There are different selections. The most common one is Clipboard). Finally click the Next button till you reach the end.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;5)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Click Finish&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;After completing this procedure, we have to move to the SQL SERVER 2000 environment. Here, by using the Query Analyzer, we will have to run the scripts that were generated using the master database. Copy and Paste the script at the Query Analyzer and run it. After that the Structure of the Database will be created.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;Be careful, the SQL Server 2005 Edition inserts the Views in a random place through the script. Therefore, all the scripts that are referred to the Views MUST be moved to the end of the script. If the Query Analyzer shows some errors do not be bothered. Delete all the elements created from the script and after you fix the code run it again.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;u&gt;&lt;span style="font-size: 14pt;"&gt;Step2 &lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;i style=""&gt;&lt;u&gt;&lt;span style="font-size: 14pt;"&gt;Moving the data from 2005 to 2000&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;1)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;After completing the previous step successfully, moving the data follows. Right-click at the 2005 database you used to run the previous step and select Tasks and then choose the Export Data (option).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;2)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;From the pop-up Dialog Box, select the Source Db and Click at the Next Button.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;3)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;At the next step you will have to choose the destination server and the destination Database for the Data to be exported. Then Click Next.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;4)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;A List of all the Source Database’s Elements will appear in the screen. Select one by one all the Elements you wish to move and for each one click at the button Edit Mappings (Located at the bottom right corner of the Dialog Box just under the Elements list). A new Dialog box will pop-up. Select the Delete rows in Destination Tables option and activate the Enable Identity Insert Option. (Remember to repeat this action for each of the selected Element from the list that will be moved.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style=""&gt;CAUTION!!!&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span style=""&gt; A malfunction of the SQL Server 2005 has been found. Not sure why, after multiple tries I have observed that when I tried to move more than twelve Elements at once, the Export Data Wizard of SQL Server 2005 seemed to disable the Enable Identity Insert Option that was activated over the Edit Mappings Dialog Box. But if the number of the selected Elements is smaller than 12 no problem seemed to appear.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;u&gt;&lt;span style="font-size: 14pt;"&gt;Step 3&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;i style=""&gt;&lt;u&gt;&lt;span style="font-size: 14pt;"&gt; Generating Scripts for the Database Foreign Keys and Triggers&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;Finally, to successfully finish the downgrade of the Database, the Triggers and the Foreign Keys of the DB must be produced. The procedure that should be followed is the one stated next:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;1)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Right-Click at the SQL 2005 Database and Select from Tasks Menu the Generate Scripts Option.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;2)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Using the pop-up Dialog Box make sure that the check box &lt;i style=""&gt;Script All Objects in the selected Databases&lt;/i&gt; is not enabled and hit the Next Button.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;3)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Set all the Elements on the List to a False Value except the ones that follow:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;a.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Include IF NOT EXISTS , set to TRUE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;b.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script Owner, set to TRUE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;c.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script of SQL Version, set to SQL SERVER 2000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;d.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script foreign keys, set to TRUE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;e.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Script Triggers, set to TRUE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.25in; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt; &lt;/span&gt;Then Hit the Next button &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;4)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;After finishing reading the Elements of the Database, a new list will appear at the Dialog Box. Make sure that you select ONLY THE TABLES of the Database and hit the Next Button.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;5)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;At the screen that follows hit the Select All button and the Next.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;6)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Select the way the generated scripts should be saved (There are different selections. The most common one is Clipboard). Finally click the Next button till you reach the end.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in; text-align: justify;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;7)&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Click Finish Button.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;After completing this procedure, we have to move to the SQL SERVER 2000 environment. Here, by using the Query Analyzer, we will have to run the scripts that were generated using the master database. Copy and Paste the script at the Query Analyzer and run it. After that the Foreign Keys and the Triggers of the Database will be created.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;After these steps the database should be fully functional under the SQL Server 2000 edition.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;www.hellasinternet.com&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;Panos Tzirakis &amp;amp; George Dounavis&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-align: justify;"&gt;&lt;span style=""&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pretty neat, isn't it?&lt;br /&gt;&lt;br /&gt;In case you are using SQL Server Management Studio Express 2005, you won't be able to perform step 2 as described in the instructions, since they were not meant for the express edition. But you can still use a tool like MS Access and add linked tables to both databases (SQL Server 2005 and SQL Server 2000 formats) and then use simple queries to copy the records to the corresponding tables. Anyway, this operation is better to be performed before executing step 3.&lt;br /&gt;&lt;br /&gt;I hope someone else will find this information useful. Thanks to Panos Tzirakis &amp;amp; George Dounavis for sharing their knowledge with all of us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-7390217257701167135?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=722132&amp;SiteID=1' title='Importing SQL Server 2005 database into SQL Server 2000'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/7390217257701167135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=7390217257701167135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/7390217257701167135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/7390217257701167135'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/05/importing-sql-server-2005-database-into.html' title='Importing SQL Server 2005 database into SQL Server 2000'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-2386214587017030417</id><published>2008-03-22T08:11:00.000-07:00</published><updated>2008-03-22T08:26:44.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='CSLA'/><title type='text'>CSLA: Invalid token for impersonation - it cannot be duplicated</title><content type='html'>I have been working on a &lt;span style="font-weight: bold;"&gt;WinForms &lt;/span&gt;app and I am using &lt;span style="font-weight: bold;"&gt;CSLA.NET&lt;/span&gt; 2 to implement the business logic (business objects). Everything worked fine when I used &lt;span style="font-style: italic;"&gt;direct DB access&lt;/span&gt; as opposed to a &lt;span style="font-style: italic;"&gt;remote data portal&lt;/span&gt;, but once I switched to a &lt;span style="font-style: italic;"&gt;remote data portal&lt;/span&gt; configuration I got the regular &lt;span style="font-family: courier new;"&gt;System.Reflection.TargetInvocationException&lt;/span&gt; with the following message in its &lt;span style="font-family: courier new;"&gt;InnerException&lt;/span&gt;  property:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;Invalid token for impersonation - it cannot be duplicated&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I started digging and I found a &lt;a href="http://forums.lhotka.net/forums/thread/2584.aspx"&gt;description of the problem on the CSLA forum&lt;/a&gt;: If you make WinForms apps using CSLA.NET 2 you have to perform a logout before you can perform the login in the first place:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Security.PTPrincipal.Logout()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Security.PTPrincipal.Login()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Failure to do this will result in the aforementioned exception being thrown. I lost a couple of hours looking for an answer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-2386214587017030417?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.lhotka.net/forums/thread/2584.aspx' title='CSLA: Invalid token for impersonation - it cannot be duplicated'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/2386214587017030417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=2386214587017030417' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2386214587017030417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2386214587017030417'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/03/csla-invalid-token-for-impersonation-it.html' title='CSLA: Invalid token for impersonation - it cannot be duplicated'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-62693167406101154</id><published>2008-03-17T18:48:00.000-07:00</published><updated>2008-03-17T19:36:32.693-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Connecting remotely to SQL Server 2005 Express Edition</title><content type='html'>By default, &lt;span style="font-weight: bold;"&gt;SQL Server Express&lt;/span&gt; can only be used by applications that run locally on the same box that actually executes the service.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;914277"&gt;This link &lt;/a&gt;from Microsoft provides a series of steps to enable remote connections to SQL Server Express and SQL Server Developer Edition.&lt;br /&gt;&lt;br /&gt;However, I also found &lt;a href="http://blogs.msdn.com/sqlexpress/archive/2005/05/05/415084.aspx"&gt;this other posts&lt;/a&gt; that describes different steps. I prefer these over the steps provided by MS due to the fact that the first ones don't involve the activation of the the SQL Browser service and therefore it reduces the security risks. Also, it is firewall friendlier, as you get to specify which IP port will be used by the server to listen to the clients' requests.&lt;br /&gt;&lt;br /&gt;The steps (extracted from the linked page):&lt;br /&gt;1. Launch the SQL Server Configuration Manager&lt;br /&gt;2. Click on the "Protocols for SQLEXPRESS" node,&lt;br /&gt;3. Right click on "TCP/IP" in the list of Protocols and choose, "Enable" (see screenshot below - in Spanish) and click OK.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/R98k79Gw1AI/AAAAAAAAAKI/zF0_5bkqoIo/s1600-h/SQLEXPRESS_RemoteConn2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/R98k79Gw1AI/AAAAAAAAAKI/zF0_5bkqoIo/s400/SQLEXPRESS_RemoteConn2.JPG" alt="" id="BLOGGER_PHOTO_ID_5178898708933170178" border="0" /&gt;&lt;/a&gt;3.      Click on the "TCP/IP" child node&lt;br /&gt;4.      You will notice an entry for "IPAll", Clear out the value for "TCP Dynamic Ports"&lt;br /&gt;5.      Give a TcpPort number to use when making remote connections, for&lt;br /&gt;purposes of this example lets choose, "2301" (see screenshot below - again in Spanish)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RekmCvHQFXY/R98k8NGw1BI/AAAAAAAAAKQ/zdt2KK29fRQ/s1600-h/SQLEXPRESS_RemoteConn3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RekmCvHQFXY/R98k8NGw1BI/AAAAAAAAAKQ/zdt2KK29fRQ/s400/SQLEXPRESS_RemoteConn3.JPG" alt="" id="BLOGGER_PHOTO_ID_5178898713228137490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;6. Now, don't forget to enable remote connections for your server. Open SQL Server Management Studio Express Edition, right click on your server instance and select the "Properties" item from the context menu. Check "Allow connections to this server".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RekmCvHQFXY/R98k7tGw0_I/AAAAAAAAAKA/Ry1JLeGYKU8/s1600-h/SQLEXPRESS_RemoteConn.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_RekmCvHQFXY/R98k7tGw0_I/AAAAAAAAAKA/Ry1JLeGYKU8/s400/SQLEXPRESS_RemoteConn.JPG" alt="" id="BLOGGER_PHOTO_ID_5178898704638202866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now you should be able to connect remotely using a connection string like this one:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-style: italic;"&gt;yourserver&lt;/span&gt;\SQLEXPRESS,&lt;span style="font-style: italic;"&gt;portnumber&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can replace &lt;span style="font-family: courier new; font-style: italic;"&gt;yourserver&lt;/span&gt; with the IP address of the box that runs SQL Server Express and&lt;span style="font-family: courier new; font-style: italic;"&gt; portnumber&lt;/span&gt; with the IP port you used in step 5. For instance, see how I connect remotely to using Management Studio:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RekmCvHQFXY/R98o3NGw1CI/AAAAAAAAAKY/AD2MgEXzE7U/s1600-h/SQLEXPRESS_RemoteConn4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RekmCvHQFXY/R98o3NGw1CI/AAAAAAAAAKY/AD2MgEXzE7U/s400/SQLEXPRESS_RemoteConn4.JPG" alt="" id="BLOGGER_PHOTO_ID_5178903025375302690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Same thing with .NET connection strings defined in the &lt;span style="font-family: courier new;"&gt;app.config&lt;/span&gt; or &lt;span style="font-family: courier new;"&gt;web.config&lt;/span&gt; files:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="SGC"&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;connectionString&lt;/span&gt;&lt;span class="kwrd"&gt;="Data Source=192.168.0.1\SQLEXPRESS,2301;Initial Catalog=Indeg;User ID=indeg;Password=********;"&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;providerName&lt;/span&gt;&lt;span class="kwrd"&gt;="System.Data.SqlClient"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I hope this will be helpful to sombody else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-62693167406101154?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.msdn.com/sqlexpress/archive/2005/05/05/415084.aspx' title='Connecting remotely to SQL Server 2005 Express Edition'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/62693167406101154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=62693167406101154' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/62693167406101154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/62693167406101154'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/03/connecting-remotely-to-sql-server-2005.html' title='Connecting remotely to SQL Server 2005 Express Edition'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RekmCvHQFXY/R98k79Gw1AI/AAAAAAAAAKI/zF0_5bkqoIo/s72-c/SQLEXPRESS_RemoteConn2.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-5944890963639778846</id><published>2008-02-21T16:57:00.000-08:00</published><updated>2008-02-21T17:38:27.029-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS .NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual SourceSafe'/><category scheme='http://www.blogger.com/atom/ns#' term='Source Control'/><category scheme='http://www.blogger.com/atom/ns#' term='VS .NET 2005'/><title type='text'>VS.Net 2005: Getting rid of that unwanted .root project (source control)</title><content type='html'>I started wondering why did I have to concede to &lt;span style="font-weight: bold;"&gt;VS.NET 2005&lt;/span&gt;'s obsession with creating that dreadful &lt;span style="font-weight: bold;"&gt;.root&lt;/span&gt; project folder for every solution I wanted to add to source control (Visual SoureSafe in my case - see screenshot below).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RekmCvHQFXY/R74hzfCSiTI/AAAAAAAAAJw/rsxYKrKjkIQ/s1600-h/VSS_Root_Folder.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_RekmCvHQFXY/R74hzfCSiTI/AAAAAAAAAJw/rsxYKrKjkIQ/s400/VSS_Root_Folder.JPG" alt="" id="BLOGGER_PHOTO_ID_5169606590656055602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Turns out there was plenty of literature regarding this issue which seems to have bothered more than one developer. &lt;a href="http://blogs.msdn.com/korbyp/archive/2003/08/05/54094.aspx"&gt;One of the best posts&lt;/a&gt; I found actually explains the reason why this "feature" was put into place since VS.NET 2003 and how to get rid of it. In short, here are the steps:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Click Start, click Run, type Regedit, and then click OK.&lt;/li&gt;&lt;li&gt;Open HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\SourceControl&lt;/li&gt;&lt;li&gt;Select key DoNotCreateSolutionRootFolderInSourceControl, click Edit, and then click Modify.&lt;/li&gt;&lt;li&gt;In the Value data box, change 0 to 1, and then click OK.&lt;/li&gt;&lt;/ol&gt;I followed the instructions (see screenshot below) and it did work for me.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/R74hzvCSiUI/AAAAAAAAAJ4/scbktKvOTZk/s1600-h/VSS_Root_Folder2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/R74hzvCSiUI/AAAAAAAAAJ4/scbktKvOTZk/s400/VSS_Root_Folder2.JPG" alt="" id="BLOGGER_PHOTO_ID_5169606594951022914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hope this post will help somebody else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-5944890963639778846?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.msdn.com/korbyp/archive/2003/08/05/54094.aspx' title='VS.Net 2005: Getting rid of that unwanted .root project (source control)'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/5944890963639778846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=5944890963639778846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/5944890963639778846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/5944890963639778846'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/02/vsnet-2005-getting-rid-of-that-unwanted.html' title='VS.Net 2005: Getting rid of that unwanted .root project (source control)'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RekmCvHQFXY/R74hzfCSiTI/AAAAAAAAAJw/rsxYKrKjkIQ/s72-c/VSS_Root_Folder.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-2141413773598392381</id><published>2008-01-28T17:42:00.001-08:00</published><updated>2008-01-28T17:45:53.199-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Online Banking'/><title type='text'>Produbanco's Banca en Linea is out of service</title><content type='html'>Has been for most of the day. And now I am getting those unfriendly messages:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/R56FOqquYVI/AAAAAAAAAJY/5xcffHBu5Ko/s1600-h/PRODUBANCO_NET_ERROR.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/R56FOqquYVI/AAAAAAAAAJY/5xcffHBu5Ko/s400/PRODUBANCO_NET_ERROR.JPG" alt="" id="BLOGGER_PHOTO_ID_5160708710031319378" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-2141413773598392381?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/2141413773598392381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=2141413773598392381' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2141413773598392381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2141413773598392381'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/01/produbancos-banca-en-linea-is-out-of.html' title='Produbanco&apos;s Banca en Linea is out of service'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RekmCvHQFXY/R56FOqquYVI/AAAAAAAAAJY/5xcffHBu5Ko/s72-c/PRODUBANCO_NET_ERROR.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-6757446230099107538</id><published>2008-01-08T18:22:00.000-08:00</published><updated>2008-01-09T12:08:07.666-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>The ISO 27000 Family</title><content type='html'>This is my first post in spanish. I am taking a long course on&lt;b&gt; IT Auditing&lt;/b&gt; and one of the modules involves the ISO 27000 standard. The professor ask our team to elaborate a list of all the standards of the ISO 27000 family, including the ones that are not published yet and are still a work in progress. Here is the credits list (my friends and I):&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-family:Tahoma, sans-serif;"&gt;Iván Coronel  (icoronel@categ.com.ec)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;  &lt;span style="font-family:Tahoma, sans-serif;"&gt;Leonor Quinchango  (lquinchango@grupowong.com)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Tahoma, sans-serif;"&gt;Pedro R. Castillo (pcastill@mac.com)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here is the report... in spanish. I hope someone finds it useful:&lt;br /&gt;      &lt;p class="western" style="margin-bottom: 0in;" align="center" lang="es-EC"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="center" lang="es-EC"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="center" lang="es-EC"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="center" lang="es-EC"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" lang="es-EC"&gt;&lt;span style="font-family:Tahoma, sans-serif;"&gt;Guayaquil, 18 de octubre de 2007&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in; page-break-before: always;" align="justify" lang="es-EC"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;Introducción&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Las normas asociadas bajo la serie ISO 27000 constituyen una familia de estándares publicados por la International Organization for Standardization y que están relacionados con la seguridad de la información.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Algunas de estas normas fueron adoptadas a partir de otras publicadas originalmente por la British Standards Institution en la década de los 90. Otras normas de la serie ISO 27000 son de autoría del International Organization for Standardization, algunas de ellas se encuentran en proceso de desarrollo.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27000&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para noviembre 2008&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Contendrá fundamentos conceptuales y definiciones de términos comunes y relevantes a las demás normas de la familia 27000. A diferencia de las demás normas del grupo se prevé que esta sea libre de costo.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27001&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; Publicada&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Octubre 15, 2005&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Contiene los requisitos a ser satisfechos con miras a certificar un Sistema de Gestión de Seguridad de la Información (SGSI). Esta norma se deriva del estándar británico BS 7799-2. En su anexo A se listan todos los objetivos de control y los controles que se desarrollan en detalle en la norma ISO 27002. Aunque no todos los controles tienen que ser obligatoriamente implementados, su no aplicabilidad debe ser justificada satisfactoriamente al ente certificador.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27002&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; Publicada&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Julio 1, 2007&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; A partir del 1 de julio de 2007 la norma ISO 17799:2005 adoptó el nombre de ISO 27002. Constituye un conjunto de mejores prácticas para la implementación de un SGSI. Estas mejores prácticas están organizadas como 39 objetivos de control y133 controles agrupados en 11 dominios. Esta norma no es certificable pero constituye una guía para la implementación de un SGSI.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27003&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para mayo 2009&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Tiene su origen en el anexo B de la norma BS 7799-2 y en un conjunto de documentos publicados por la BSI. Contiene recomendaciones guías de implementación de un SGSI así como información sobre el uso del modelo Plan-Do-Check-Act (PDCA) y de los requerimientos en sus diferentes fases.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27004&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para noviembre 2008&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Describe las métricas y técnicas de medición que pueden ser utilizadas para medir la eficacia de un SGSI, aplicables sobre todo para medir el desempeño de los componentes asociados al proceso “Do” (Implementar y Utilizar) del modelo PDCA.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27005&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para mayo 2008&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Recoge partes de la norma ISO/IEC 13335. Contendrá una guía, un conjunto de técnicas para la gestión de riesgo asociado con la seguridad de la información. Será un apoyo a la norma ISO 27001.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27006&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; Publicada&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Marzo 1, 2007&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Sin pretender que se convierta en una norma de acreditación en sí misma, ISO está desarrollando el estándar ISO 27006 como una guía de requisitos necesarios para conseguir la acreditación de entidades auditoras o de certificación de SGSIs. En cierta forma es una versión aumentada de la ISO 17021 &lt;span lang="es-ES"&gt;(Requisitos para las entidades de auditoría y certificación de sistemas de gestión) que aporta con los requisitos específicos relacionados con ISO 27001 y los SGSIs.&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27007&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para mayo 2010&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Será una guía de auditoría de SGSIs.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27011&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para enero 2008&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Norma elaborada en conjunto con la International Telecommunication Union (ITU). Será una guía de gestión de seguridad de la información enfocada y dirigida a  empresas de telecomunicaciones.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27031&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para mayo 2010&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Constituirá una guía de continuidad de negocios en lo referente a la tecnología informática y telecomunicaciones.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27032&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para febrero 2009&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Guía de Ciberseguridad&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27033&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para 2010-2011&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Se trata de una versión revisada y aumentada de la norma ISO 18028 (Seguridad de la Información – Técnicas de seguridad – Seguridad de redes de TI). Se prevé que esta norma contenga 7 partes:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  gestión de seguridad de redes,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  arquitectura de seguridad de redes,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  escenarios de redes de referencia,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  aseguramiento de las comunicaciones entre redes mediante ruteadores,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  acceso remoto,&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  aseguramiento de comunicaciones en redes mediante redes privadas  virtuales y&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;  diseño e implementación de seguridad en redes&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27034&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para febrero 2009&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Guía de seguridad para aplicaciones.&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h1 class="western" align="justify" lang="es-ES"&gt;ISO 27799&lt;/h1&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Estado:&lt;/b&gt; En desarrollo&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; &lt;b&gt;Fecha de Publicación:&lt;/b&gt; Previsto para 2008&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;" align="justify" lang="es-ES"&gt; Constituirá un estándar de gestión de seguridad de la información dirigido al sector sanitario basado en la aplicación de la norma ISO 17799 (actualmente reemplazada por ISO 27002). Esta es la única norma de la familia ISO 27000 que no es desarrollada por el subcomité JTC1/SC27, sino por el comité técnico &lt;span lang="es-ES"&gt;TC 215.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-6757446230099107538?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/6757446230099107538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=6757446230099107538' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/6757446230099107538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/6757446230099107538'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2008/01/this-is-my-first-post-in-spanish.html' title='The ISO 27000 Family'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-8011018775758702560</id><published>2007-12-17T15:54:00.000-08:00</published><updated>2007-12-17T16:10:49.689-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Compact Framework'/><title type='text'>Returning an array of objects from a Web Service</title><content type='html'>I am writing an application for &lt;span style="font-weight: bold;"&gt;Windows CE 4.2 .NET&lt;/span&gt; using the &lt;span style="font-weight: bold;"&gt;.NET Compact Framework&lt;/span&gt;. It needs to interact with an &lt;span style="font-weight: bold;"&gt;Oracle DB&lt;/span&gt;, so I am using a &lt;span style="font-weight: bold;"&gt;web service&lt;/span&gt; to perform the DB operations. Among other things my application needs to obtain a set of objects from the web service and for that purpose I didn't want to use &lt;span style="font-family: courier new;"&gt;DataSets&lt;/span&gt;, as I know it's not a good practice. So I thought that it was better to return an ArrayList. Big mistake.&lt;br /&gt;&lt;br /&gt;What I had to use is an &lt;span style="font-family: courier new;"&gt;Array&lt;/span&gt; of objects. &lt;a href="http://samples.gotdotnet.com/quickstart/aspplus/doc/webservicetypes.aspx"&gt;This link&lt;/a&gt; describes the different .NET &lt;span style="font-style: italic;"&gt;data types&lt;/span&gt; that can be returned from a Web Service. &lt;a href="http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/services/DataTypes/DataTypes.src"&gt;This other link&lt;/a&gt; shows some sample code. Don't forget that in order to add new elements to an array you have to use the &lt;span style="font-family: courier new;"&gt;Array.SetValue()&lt;/span&gt; method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-8011018775758702560?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://samples.gotdotnet.com/quickstart/aspplus/doc/webservicetypes.aspx' title='Returning an array of objects from a Web Service'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/8011018775758702560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=8011018775758702560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/8011018775758702560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/8011018775758702560'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/12/returning-array-of-objects-from-web.html' title='Returning an array of objects from a Web Service'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-3552036400988736981</id><published>2007-12-17T11:55:00.000-08:00</published><updated>2007-12-17T11:59:49.794-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>.Mac is down</title><content type='html'>The &lt;a href="http://www.mac.com"&gt;.Mac&lt;/a&gt; website is not working since today at 2:40 pm. Also my e-mail software (Mozzila Thunderberd) is complaining about not being able to authenticate and/or send e-mails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-3552036400988736981?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/3552036400988736981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=3552036400988736981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3552036400988736981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3552036400988736981'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/12/mac-is-down.html' title='.Mac is down'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-1437772622485350920</id><published>2007-12-09T06:23:00.000-08:00</published><updated>2007-12-09T06:56:15.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Workarounds'/><category scheme='http://www.blogger.com/atom/ns#' term='Bugs'/><title type='text'>Norton AV dissables ODBC window on MS Access</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Norton Antivirus&lt;/span&gt; (I am using the &lt;span style="font-weight: bold;"&gt;2006 &lt;/span&gt;version) has an option that prevents &lt;span style="font-weight: bold;"&gt;MS Access&lt;/span&gt; from opening the &lt;span style="font-weight: bold;"&gt;ODBC&lt;/span&gt; data sources window.&lt;br /&gt;&lt;br /&gt;I found the bug while trying to add a &lt;span style="font-style: italic;"&gt;linked table&lt;/span&gt; using an ODBC database as the source. After clicking on the "Link" button (see screen shot below - it's in Spanish) normally you would see the&lt;span style="font-style: italic;"&gt; ODBC data sources&lt;/span&gt; window, however when I clicked on it nothing happened, not even an error message. It just didn't do anything.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/R1v_n55iTjI/AAAAAAAAAJI/vccQM7i98pw/s1600-h/NortonODBCBug1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/R1v_n55iTjI/AAAAAAAAAJI/vccQM7i98pw/s400/NortonODBCBug1.JPG" alt="" id="BLOGGER_PHOTO_ID_5141984460595678770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After doing some research I found a &lt;a href="http://msmvps.com/blogs/access/archive/2007/06/19/norton-antivirus-strikes-again-odbc-to-sql-server-2005.aspx"&gt;post &lt;/a&gt;that pointed to an option in Norton AV as the cause of the problem. The "&lt;span style="font-weight: bold;"&gt;Activate Office Plug-in&lt;/span&gt;" option which needs to be &lt;span style="font-weight: bold;"&gt;unchecked &lt;/span&gt;can be found in the Norton Antivirus options window, see the screenshot below  (Spanish, again):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RekmCvHQFXY/R1v_oJ5iTkI/AAAAAAAAAJQ/Y7chjHLidJk/s1600-h/NortonODBCBug.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_RekmCvHQFXY/R1v_oJ5iTkI/AAAAAAAAAJQ/Y7chjHLidJk/s400/NortonODBCBug.JPG" alt="" id="BLOGGER_PHOTO_ID_5141984464890646082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I hope someone else will find this post useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-1437772622485350920?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msmvps.com/blogs/access/archive/2007/06/19/norton-antivirus-strikes-again-odbc-to-sql-server-2005.aspx' title='Norton AV dissables ODBC window on MS Access'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/1437772622485350920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=1437772622485350920' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/1437772622485350920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/1437772622485350920'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/12/norton-av-dissables-odbc-window-on-ms.html' title='Norton AV dissables ODBC window on MS Access'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RekmCvHQFXY/R1v_n55iTjI/AAAAAAAAAJI/vccQM7i98pw/s72-c/NortonODBCBug1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-5873766893956386867</id><published>2007-10-23T16:48:00.000-07:00</published><updated>2007-10-23T17:14:18.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='WWW Technologies'/><title type='text'>Some CNN.com web pages are too slow</title><content type='html'>Since CNN.com switched to their new design (which I like it a lot) the user experience has been dramatically improved. Of course, this all comes at a price.&lt;br /&gt;&lt;br /&gt;I noticed several things that make it slower compared to what it used to be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The new "widescreen" video is too slow. It uses Adobe Flash to stream video, like YouTube does, however it is considerably slower, probably due to higher quality.&lt;/li&gt;&lt;li&gt;It has way too many Adobe Flash components embedded into the page.&lt;/li&gt;&lt;li&gt;It makes heavy use of javascript to "animate" some elements using DHTML.&lt;/li&gt;&lt;/ul&gt;Here is just a small group of areas in a CNN.com page. These areas use JavaScript and Adobe Flash.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RekmCvHQFXY/Rx6LHKwlYzI/AAAAAAAAAIQ/9s_Zy_ANiGk/s1600-h/cnn_right_column.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RekmCvHQFXY/Rx6LHKwlYzI/AAAAAAAAAIQ/9s_Zy_ANiGk/s400/cnn_right_column.JPG" alt="" id="BLOGGER_PHOTO_ID_5124686381257679666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/Rx6Mz6wlY0I/AAAAAAAAAIY/AljxxfOSe-U/s1600-h/cnn_photos.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/Rx6Mz6wlY0I/AAAAAAAAAIY/AljxxfOSe-U/s400/cnn_photos.JPG" alt="" id="BLOGGER_PHOTO_ID_5124688249568453442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;The use of this technologies while improving the user experience, it also results a considerably slower rendering of web pages. However, there was a design decision that had a dramatic impact on some pages and renders them ridiculously slow: long list of comments using AJAX.&lt;br /&gt;&lt;br /&gt;Some CNN.com pages (like &lt;a href="http://www.cnn.com/2007/US/10/23/wildfire.ca/index.html"&gt;this one&lt;/a&gt;) invite the users to post comments (see screenshot below) these comments seem to be requested at run time using AJAX techniques.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RekmCvHQFXY/Rx6LGqwlYxI/AAAAAAAAAIA/IWry0Eg4z_U/s1600-h/cnn_comments1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_RekmCvHQFXY/Rx6LGqwlYxI/AAAAAAAAAIA/IWry0Eg4z_U/s400/cnn_comments1.JPG" alt="" id="BLOGGER_PHOTO_ID_5124686372667745042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If the news topic is a rather polemic one or if it touches the fiber of too many people enough to make them feel compelled to post a comment, it is just a matter of time before the page becomes unbearably slow.&lt;br /&gt;&lt;br /&gt;The issue can be experienced in IE, Firefox and Safari.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-5873766893956386867?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.cnn.com/2007/US/10/23/wildfire.ca/index.html' title='Some CNN.com web pages are too slow'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/5873766893956386867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=5873766893956386867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/5873766893956386867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/5873766893956386867'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/10/some-cnncom-web-pages-are-too-slow.html' title='Some CNN.com web pages are too slow'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RekmCvHQFXY/Rx6LHKwlYzI/AAAAAAAAAIQ/9s_Zy_ANiGk/s72-c/cnn_right_column.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-128723812261529813</id><published>2007-08-16T14:04:00.000-07:00</published><updated>2007-08-16T14:09:14.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Collaboration'/><category scheme='http://www.blogger.com/atom/ns#' term='Skype'/><title type='text'>Skype won't login. Worlwide Skype Outage</title><content type='html'>I haven't been able to log into Skype all day long. I thought it was a problem with my ISP but now I am getting reports that there is a &lt;a href="http://www.usatoday.com/tech/wireless/phones/2007-08-16-skype-outage_N.htm"&gt;worlwide Skype problem&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-128723812261529813?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.usatoday.com/tech/wireless/phones/2007-08-16-skype-outage_N.htm' title='Skype won&apos;t login. Worlwide Skype Outage'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/128723812261529813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=128723812261529813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/128723812261529813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/128723812261529813'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/08/skype-outage.html' title='Skype won&apos;t login. Worlwide Skype Outage'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-763125673954291412</id><published>2007-07-12T12:09:00.000-07:00</published><updated>2007-07-12T13:26:28.424-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><title type='text'>Decompiling .NET assemblies with Reflector</title><content type='html'>My HDD crashed a few weeks ago. I had back ups of mostly everything but not as recent as I should have. My Visual Source Safe database was backed up more than 3 months before the incident so I lost 3 months worth of changes to the code.&lt;br /&gt;&lt;br /&gt;I have another (private) blog where I document changes I make to the multiple applications and components that make up the solutions I work in but it was impossible to recreate every change I made based on that.&lt;br /&gt;&lt;br /&gt;I had backups of every build I made so I thought that if I could somehow decompile the code based on those build assemblies I would be able to replicate every little change in the code that had been lost with the HDD failure.&lt;br /&gt;&lt;br /&gt;I started looking for a utility and found this:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MSIL Disassembler&lt;/li&gt;&lt;li&gt;Salamander .NET&lt;/li&gt;&lt;li&gt;Reflector&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/f7dy01k1%28vs.71%29.aspx"&gt;MSIL Disassembler&lt;/a&gt; is an intermediate language decompiler provided by Microsoft, which means that it decompiles to .NET's Intermediate Language. It is a pretty cool utility but it didn't help me solve my problem. I need to recompile to VB.NET.&lt;br /&gt;&lt;br /&gt;Based on the screen shots available at &lt;a href="http://www.remotesoft.com/salamander/"&gt;Salamander .NET&lt;/a&gt;'s website it seems like that tool could really help me, but the price is just way above my capacity: $1,099.00 USD!!!!&lt;br /&gt;&lt;br /&gt;I was about to give up when I came across Lutz Roeder's &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;.NET Reflector&lt;/a&gt; and it turned out to be an amazing utility that not only was free and did what I needed but it was also expandable via freely available &lt;a href="http://www.codeplex.com/reflectoraddins"&gt;add-ins&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are plenty of documented experiences and tutorials on how to use .NET Reflector, here is one &lt;a href="http://aspnet.4guysfromrolla.com/articles/080404-1.aspx"&gt;article &lt;/a&gt;demonstrating .NET Reflector virtues. Here is a screen shot of Reflector disassembling &lt;span style="font-family:courier new;"&gt;CSLA.DLL&lt;/span&gt;, which part of &lt;a href="http://www.lhotka.net/"&gt;Rockford Lhotka&lt;/a&gt;'s widely adopted CSLA. NET business objects framework.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/RpaOXhXI9BI/AAAAAAAAAGo/X-T07VXFUAQ/s1600-h/Reflector.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/RpaOXhXI9BI/AAAAAAAAAGo/X-T07VXFUAQ/s400/Reflector.JPG" alt="" id="BLOGGER_PHOTO_ID_5086409363905115154" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-763125673954291412?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/763125673954291412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=763125673954291412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/763125673954291412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/763125673954291412'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/07/decompiling-net-assemblies-with.html' title='Decompiling .NET assemblies with Reflector'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RekmCvHQFXY/RpaOXhXI9BI/AAAAAAAAAGo/X-T07VXFUAQ/s72-c/Reflector.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-3818080569996211284</id><published>2007-06-03T14:48:00.000-07:00</published><updated>2007-06-03T14:54:07.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><title type='text'>How to Tell Which Version of DirectX You Are Running</title><content type='html'>My hard drive crashed and I had to reinstall everything on a new drive but before installing the DirectX SDK I needed to find which version was currently installed. I found &lt;a href="http://www.microsoft.com/protect/computer/updates/bulletins/version.mspx#EHC"&gt;this page&lt;/a&gt; that includes steps to obtain the currently installed version of different components. For DirectX:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;On the &lt;span style="font-style: italic;"&gt;task bar&lt;/span&gt; at the bottom of your screen, click &lt;span style="font-weight: bold;"&gt;Start&lt;/span&gt;, and then click &lt;span style="font-weight: bold;"&gt;Run.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;In the Run dialog box, type &lt;span style="font-family: courier new;"&gt;dxdiag&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Click &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;A dialog box displays the version that you are running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-3818080569996211284?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/protect/computer/updates/bulletins/version.mspx#EHC' title='How to Tell Which Version of DirectX You Are Running'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/3818080569996211284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=3818080569996211284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3818080569996211284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3818080569996211284'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/06/how-to-tell-which-version-of-directx.html' title='How to Tell Which Version of DirectX You Are Running'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-2139669507366232745</id><published>2007-05-12T06:36:00.000-07:00</published><updated>2007-05-12T18:42:36.934-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP-Nuke'/><title type='text'>PHP-Nuke: Showing Dates In Spanish</title><content type='html'>PHP-Nuke uses a PHP function called &lt;span style="font-family:courier new;"&gt;setlocale()&lt;/span&gt; to set the date format and language. However, this function will work or not depending on the operating system on top of which PHP is running and and it will also depend on the system configuration.&lt;br /&gt;&lt;br /&gt;I am using a Yahoo Web Hosting and the settings I should be using for &lt;span style="font-family:courier new;"&gt;setlocale()&lt;/span&gt; (which are "&lt;span style="font-family:courier new;"&gt;es_US&lt;/span&gt;") do not work and obviosly I can't change the OS or system settings on Yahoo's server. However, I found that every date that is displayed by PHP-Nuke is formatted by the &lt;span style="font-family:courier new;"&gt;formatTimestamp()&lt;/span&gt; function defined in &lt;span style="font-family:courier new;"&gt;mainfile.php&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I was about to re-write the function to fit my needs but as I suspected someone else had already done so and was nice enough to post &lt;a href="http://www.desarrollonuke.org/modules.php?name=Content&amp;pa=showpage&amp;amp;pid=17"&gt;the code&lt;/a&gt; on the net. Here is the function definition:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function formatTimestamp($time){&lt;br /&gt;&lt;br /&gt;  global $datetime, $locale;&lt;br /&gt;  setlocale (LC_TIME, "$locale");&lt;br /&gt;  ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})", $time, $datetime);&lt;br /&gt;&lt;br /&gt;  $ano=$datetime[1]+0;&lt;br /&gt;  $mes=$datetime[2]+0;&lt;br /&gt;  $dia=$datetime[3]+0;&lt;br /&gt;  $hora=$datetime[4]+0;&lt;br /&gt;  $min=$datetime[5]+0;&lt;br /&gt;  $longitud=strlen($min);&lt;br /&gt;&lt;br /&gt;  if ($longitud == 1) $min="0".$min;&lt;br /&gt;&lt;br /&gt;  $segs=$datetime[6]+0;&lt;br /&gt;  $longitud=strlen($segs);&lt;br /&gt;&lt;br /&gt;  if ($longitud == 1) $segs="0".$segs;&lt;br /&gt;&lt;br /&gt;  $quedia= strftime ("%w", mktime($hora,$min,$segs,$mes,$dia,$ano));&lt;br /&gt;&lt;br /&gt;  switch($quedia) {&lt;br /&gt;    case 0:&lt;br /&gt;      $quedia="Domingo";&lt;br /&gt;      break;&lt;br /&gt;    case 1:&lt;br /&gt;      $quedia="Lunes";&lt;br /&gt;      break;&lt;br /&gt;    case 2:&lt;br /&gt;      $quedia="Martes";&lt;br /&gt;      break;&lt;br /&gt;    case 3:&lt;br /&gt;      $quedia="Miércoles";&lt;br /&gt;      break;&lt;br /&gt;    case 4:&lt;br /&gt;      $quedia="Jueves";&lt;br /&gt;      break;&lt;br /&gt;    case 5:&lt;br /&gt;      $quedia="Viernes";&lt;br /&gt;      break;&lt;br /&gt;    case 6:&lt;br /&gt;      $quedia="Sábado";&lt;br /&gt;      break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  switch($mes) {&lt;br /&gt;    case 1:&lt;br /&gt;      $mes="Enero";&lt;br /&gt;      break;&lt;br /&gt;    case 2:&lt;br /&gt;      $mes="Febrero";&lt;br /&gt;      break;&lt;br /&gt;    case 3:&lt;br /&gt;      $mes="Marzo";&lt;br /&gt;      break;&lt;br /&gt;    case 4:&lt;br /&gt;      $mes="Abril";&lt;br /&gt;      break;&lt;br /&gt;    case 5:&lt;br /&gt;      $mes="Mayo";&lt;br /&gt;      break;&lt;br /&gt;    case 6:&lt;br /&gt;      $mes="Junio";&lt;br /&gt;      break;&lt;br /&gt;    case 7:&lt;br /&gt;      $mes="Julio";&lt;br /&gt;      break;&lt;br /&gt;    case 8:&lt;br /&gt;      $mes="Agosto";&lt;br /&gt;      break;&lt;br /&gt;    case 9:&lt;br /&gt;      $mes="Septiembre";&lt;br /&gt;      break;&lt;br /&gt;    case 10:&lt;br /&gt;      $mes="Octubre";&lt;br /&gt;      break;&lt;br /&gt;    case 11:&lt;br /&gt;      $mes="Noviembre";&lt;br /&gt;      break;&lt;br /&gt;    case 12:&lt;br /&gt;      $mes="Diciembre";&lt;br /&gt;      break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  $datetime = "$quedia, $dia de $mes del $ano ($hora:$min:$segs)";&lt;br /&gt;  return($datetime);&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/8223661-2139669507366232745?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.desarrollonuke.org/modules.php?name=Content&amp;pa=showpage&amp;pid=17' title='PHP-Nuke: Showing Dates In Spanish'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/2139669507366232745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=2139669507366232745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2139669507366232745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2139669507366232745'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/05/php-nuke-show-dates-in-spanish.html' title='PHP-Nuke: Showing Dates In Spanish'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-8858563546593979028</id><published>2007-05-05T19:36:00.000-07:00</published><updated>2007-05-05T20:28:42.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP-Nuke'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo Small Business Services'/><title type='text'>Setting Up PHP-Nuke On Yahoo Web Hosting (Part II)</title><content type='html'>On &lt;a href="http://ghostspook.blogspot.com/2007/05/setting-up-php-nuke-on-yahoo-web.html"&gt;Part I&lt;/a&gt; of this three-part series I described what you can expect from Y! SBS Web Hosting when it comes to hosting a PHP-Nuke site. I also desribed the specific steps to be taken to set up a PHP-Nuke site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;File Manager&lt;/span&gt;&lt;br /&gt;PHP-Nuke is a pretty decent Content Manager and provides most of the tools you need to keep your site updated. However there are certain things that will require to dig deeper that PHP-Nuke's administration page:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Customize Template&lt;/li&gt;&lt;li&gt;Upload new "topics" images.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This things can be accomplished by using the File Manger utility provided by Y! SBS Web Hosting Control Panel. Just go to the Web Hosting Control Panel, click on &lt;span style="font-weight: bold;"&gt;Create and Update&lt;/span&gt; and then click on &lt;span style="font-weight: bold;"&gt;File Manager&lt;/span&gt;. Alternatively you can also use the &lt;span style="font-weight: bold;"&gt;Quick Links&lt;/span&gt; menu (see screenshot below).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RekmCvHQFXY/Rj1CZX0NzlI/AAAAAAAAAE4/3gKnJiX9ibM/s1600-h/WebHostingControlPanel2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RekmCvHQFXY/Rj1CZX0NzlI/AAAAAAAAAE4/3gKnJiX9ibM/s400/WebHostingControlPanel2.JPG" alt="" id="BLOGGER_PHOTO_ID_5061274559891492434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;From that point on the File Manager is very intuitive. You can browse through the files on your site, rename them, delete them. You can modify existing files using the HTML Editor, PHP Editor. You can also upload new files with the downside that they have to be uploaded individually and you can not upload entire directories. Of course you can always use FTP to upload multiple files (like a whole new template) in just one step. The File Manager is ideal for uploading new image files into your &lt;span style="font-family:courier new;"&gt;/images/topics/&lt;/span&gt; folder.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RekmCvHQFXY/Rj1GZX0NzmI/AAAAAAAAAFA/q5g9DY9-A_0/s1600-h/YahooFileManager.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_RekmCvHQFXY/Rj1GZX0NzmI/AAAAAAAAAFA/q5g9DY9-A_0/s400/YahooFileManager.JPG" alt="" id="BLOGGER_PHOTO_ID_5061278957938003554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Database Utilities&lt;/span&gt;&lt;br /&gt;The Web Hosting Control Panels also allows you to perform the following database tasks:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Check DB status (active, inactive, schedule tasks pending or in course)&lt;/li&gt;&lt;li&gt;Back Up database&lt;/li&gt;&lt;li&gt; Restore database&lt;/li&gt;&lt;li&gt;Repair database&lt;/li&gt;&lt;/ul&gt;To access the DB utilities you will have to click on the &lt;span style="font-weight: bold;"&gt;Open database utilities&lt;/span&gt; link on the &lt;span style="font-style: italic;"&gt;File Manager&lt;/span&gt; (see previous screenshot).&lt;br /&gt;&lt;br /&gt;The backup and restore take place asynchronously. This means that you kind of  "schedule" the tasks and then wait until the tasks are completed. You can check the status of any scheduled task using the &lt;span style="font-weight: bold;"&gt;Database status&lt;/span&gt; link.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/Rj1HVn0NznI/AAAAAAAAAFI/JD1ZkNUdKcE/s1600-h/YahooMySQLDatabase.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/Rj1HVn0NznI/AAAAAAAAAFI/JD1ZkNUdKcE/s400/YahooMySQLDatabase.JPG" alt="" id="BLOGGER_PHOTO_ID_5061279993025121906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;phpMyAdmin&lt;/span&gt;&lt;br /&gt;Being able to backup and restore your DB is a handy thing. However, there will be times in which you will want to browse your DB records, or maybe even modify the DB structure. In that case you will need &lt;a style="font-weight: bold;" href="http://www.google.com/url?sa=t&amp;ct=res&amp;amp;amp;amp;amp;cd=1&amp;url=http%3A%2F%2Fwww.phpmyadmin.net%2F&amp;amp;ei=zEg9RqO0Loe-wALi-rCVAw&amp;usg=AFrqEzdJRDRqS3YGlSkk9i7Sg4YuSfMNQw&amp;amp;sig2=XlGsVNMFbBOEOeup2uV9gQ"&gt;phpMyAdmin&lt;/a&gt;, which is a very powerful web-based administrative tool for MySQL.&lt;br /&gt;&lt;br /&gt;To set up phpMyAdmin go to the &lt;span style="font-style: italic;"&gt;Database Utilities&lt;/span&gt; page on you &lt;span style="font-style: italic;"&gt;Web Hosting Control Panel&lt;/span&gt; and click on the link that says &lt;span style="font-weight: bold;"&gt;Install admin tool&lt;/span&gt;. You will go through a 3-step process that will prompt you to provide the &lt;span style="font-weight: bold;"&gt;username &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;password &lt;/span&gt;for the database administrator, please DO NOT FORGET THIS INFO.&lt;br /&gt;&lt;br /&gt;Here I will warn you that in a bug in this phpMyAdmin configuration may lead you to believe that it is not working. The problem is related with the frames opened by the link to which you are re-directed right after you login in to phpMyAmin:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;http://&lt;span style="font-style: italic;"&gt;yourdomain.com&lt;/span&gt;/phpMyAdmin/index.php?lang=en-iso-8859-1&amp;server=1&amp;amp;collation_connection=utf8_general_ci&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That link will not work. To workaround this, browse to the following address after you successfully login:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;http://&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;opinaecuador.com&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;/phpMyAdmin/main.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You will see phpMyAdmin's main page:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/Rj1LSn0NzoI/AAAAAAAAAFQ/Xujk1EasAwo/s1600-h/YahooPHPMyAdmin.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/Rj1LSn0NzoI/AAAAAAAAAFQ/Xujk1EasAwo/s400/YahooPHPMyAdmin.JPG" alt="" id="BLOGGER_PHOTO_ID_5061284339532025474" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-8858563546593979028?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/8858563546593979028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=8858563546593979028' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/8858563546593979028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/8858563546593979028'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/05/setting-up-php-nuke-on-yahoo-web_05.html' title='Setting Up PHP-Nuke On Yahoo Web Hosting (Part II)'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RekmCvHQFXY/Rj1CZX0NzlI/AAAAAAAAAE4/3gKnJiX9ibM/s72-c/WebHostingControlPanel2.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-5678661416643709947</id><published>2007-05-04T19:29:00.000-07:00</published><updated>2007-05-05T20:30:04.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP-Nuke'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo Small Business Services'/><title type='text'>Setting Up PHP-Nuke On Yahoo Web Hosting (Part I)</title><content type='html'>For a while I'd wanted to make my own opinion site, sort of like &lt;a href="http://slashdot.org/"&gt;slashdot.org&lt;/a&gt;, but with a totally different focus. After doing some research I chose &lt;a href="http://phpnuke.org/"&gt;PHP-Nuke&lt;/a&gt; as the Content Management Solution and I was looking for a Web Host. I decided to try &lt;a href="http://smallbusiness.yahoo.com/"&gt;Yahoo Small Business Services&lt;/a&gt; because I was really satisfied with the way they allow me to manage my personal domain and asumed that their web hosting solutions would be just as friendly... and I was right.&lt;br /&gt;&lt;br /&gt;However, I wasn't able to find any specific information on how to set up PHP-Nuke site using any of &lt;a href="http://smallbusiness.yahoo.com/webhosting/"&gt;Yahoo SBS' web hosting plans&lt;/a&gt;, so I explored on my own and now that I set up my site I am publishing a few instructions on how to do it hoping that other people might find this info useful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Which plan should I choose?&lt;/span&gt;&lt;br /&gt;Basically, any plan will be fine.&lt;br /&gt;&lt;br /&gt;I used the web hosting plan with the lowest profile: &lt;span style="font-weight: bold;"&gt;Web Hosting Starter&lt;/span&gt; (&lt;a href="http://smallbusiness.yahoo.com/webhosting/compare.php"&gt;click here for a comparison chart&lt;/a&gt;). It includes everything you need to set up a PHP-Nuke site: PHP, MySQL, phpMyAdmin and other utilities like DB backup and an easy to use file manager. And of course the plan also includes free domain registration, FTP accounts; email accounts with imap, pop3 or webmail; statistics... everything you would expect from a professional web host.&lt;br /&gt;&lt;br /&gt;You can use Y! SBS' built-in editor to modify .php, .html files.&lt;br /&gt;&lt;br /&gt;The other plans provide basically the same features only with larger hard-disk space and bandwith, more subdomains, more e-mail accounts. It will be a long time until I need more features I suppose.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Which version of PHP-Nuke?&lt;/span&gt;&lt;br /&gt;At the moment of this writing Y! SBS provides an installation utility for &lt;span style="font-weight: bold;"&gt;PHP-Nuke 6.5&lt;/span&gt;. But (at least theoretically) you can update to a newer version or install a new version from scratch using the database utilities included with the plan.&lt;br /&gt;&lt;br /&gt;The site will run on a &lt;span style="font-weight: bold;"&gt;FreeBSD 4.11&lt;/span&gt; Unix server with &lt;span style="font-weight: bold;"&gt;PHP Version 4.3.11&lt;/span&gt;. The database server is &lt;b&gt;MySQL 4.1.14&lt;/b&gt; and you can also setup &lt;span style="font-weight: bold;"&gt;phpMyAdmin 2.6.3-pl1&lt;/span&gt; to manage the database.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Not-So-Instant Gratification&lt;/span&gt;&lt;br /&gt;Once you submit your order with Y! SBS for a web hosting plan, you will have to wait for a period of time before you are actually able to do anything. This is mostly due to domain name propagation. Ideally you will be able to start working on your site within a few hours after you submit your order.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Web Hosting Control Panel&lt;/span&gt;&lt;br /&gt;One of the most remarkable things about Y! SBS hosting solutions is the Control Panel. It is very comprehensive and is loaded with features.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RekmCvHQFXY/RjvyiH0NziI/AAAAAAAAAEg/53SgHbe1svQ/s1600-h/WebHostingControlPanel.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_RekmCvHQFXY/RjvyiH0NziI/AAAAAAAAAEg/53SgHbe1svQ/s400/WebHostingControlPanel.JPG" alt="" id="BLOGGER_PHOTO_ID_5060905274308415010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I am going to skip all the features and go directly to setting up a PHP-Nuke site. Click on the &lt;span style="font-weight: bold;"&gt;Create and Update&lt;/span&gt; tab link. Now, scroll down and click on &lt;span style="font-weight: bold;"&gt;Add-Ons&lt;/span&gt;. Click on &lt;span style="font-weight: bold;"&gt;PHP-Nuke&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RekmCvHQFXY/Rjvz2X0NzjI/AAAAAAAAAEo/Yju64ECZMmg/s1600-h/YahooInstallPHP-Nuke1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_RekmCvHQFXY/Rjvz2X0NzjI/AAAAAAAAAEo/Yju64ECZMmg/s400/YahooInstallPHP-Nuke1.JPG" alt="" id="BLOGGER_PHOTO_ID_5060906721712393778" border="0" /&gt;&lt;/a&gt;Now you are starting to set up your PHP-Nuke site. Agree with the terms (you might even read them if you want). You will be prompted if you want to use a sub-domain or if you rather install it in the root directory. I chose the second option.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/Rjv00n0NzkI/AAAAAAAAAEw/EbLEI1HyOTo/s1600-h/YahooInstallPHP-Nuke2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/Rjv00n0NzkI/AAAAAAAAAEw/EbLEI1HyOTo/s400/YahooInstallPHP-Nuke2.JPG" alt="" id="BLOGGER_PHOTO_ID_5060907791159250498" border="0" /&gt;&lt;/a&gt;You will have to be patient here and wait a few minutes until your site and the corresponding database are being put together by Y! SBS. The first time I attempted to install PHP-Nuke I got an error saying that the database could not be configured. I tried again and it worked the second time. Go figure!&lt;br /&gt;&lt;br /&gt;In the final step you will have to set up the credentials of the PHP-Nuke site's administrator.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://ghostspook.blogspot.com/2007/05/setting-up-php-nuke-on-yahoo-web_05.html"&gt;Part II&lt;/a&gt; of this series I will discuss how to manage the files and the database for your PHP-Nuke site using the &lt;span style="font-weight: bold;"&gt;File Manager&lt;/span&gt; utility, &lt;span style="font-weight: bold;"&gt;Database Utilities&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;phpMyAdmin&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-5678661416643709947?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/5678661416643709947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=5678661416643709947' title='65 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/5678661416643709947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/5678661416643709947'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/05/setting-up-php-nuke-on-yahoo-web.html' title='Setting Up PHP-Nuke On Yahoo Web Hosting (Part I)'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RekmCvHQFXY/RjvyiH0NziI/AAAAAAAAAEg/53SgHbe1svQ/s72-c/WebHostingControlPanel.JPG' height='72' width='72'/><thr:total>65</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-3121712971856401664</id><published>2007-02-28T20:58:00.000-08:00</published><updated>2007-02-28T21:10:13.236-08:00</updated><title type='text'>Windows Media Encoder 9 SDK Sample</title><content type='html'>I am publishing a little Utility I made using &lt;span style="font-weight: bold;"&gt;MS Visual Studio 2005&lt;/span&gt;. It is intended to be a sample on how to automate the encoding process using &lt;span style="font-weight: bold;"&gt;Windows Media Encoder 9 SDK&lt;/span&gt;. Below is a screen shot of the utility.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RekmCvHQFXY/ReZeVnDe7dI/AAAAAAAAADc/lz0vFcsRmSc/s1600-h/WMETester.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_RekmCvHQFXY/ReZeVnDe7dI/AAAAAAAAADc/lz0vFcsRmSc/s400/WMETester.JPG" alt="" id="BLOGGER_PHOTO_ID_5036816958614334930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It takes an input file and encodes it into an output file using the &lt;span style="font-style: italic;"&gt;Encoder Profile&lt;/span&gt; selected by the user. New profiles can be created using &lt;span style="font-weight: bold;"&gt;Windows Media Profile Editor&lt;/span&gt; which is an utility included in with WME 9 SDK.&lt;br /&gt;&lt;br /&gt;You can download the source and binaries &lt;a href="http://homepage.mac.com/pcastill/GSHM/downloads/WMETester.zip"&gt;from this link&lt;/a&gt;. To compile the utility you will need VS 2005 and WME 9 SDK. For execution only you will need .NET Framework 2.0 and Windows Media Encoder 9.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-3121712971856401664?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://homepage.mac.com/pcastill/GSHM/downloads/WMETester.zip' title='Windows Media Encoder 9 SDK Sample'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/3121712971856401664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=3121712971856401664' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3121712971856401664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3121712971856401664'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2007/02/windows-media-encoder-9-sdk-sample.html' title='Windows Media Encoder 9 SDK Sample'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RekmCvHQFXY/ReZeVnDe7dI/AAAAAAAAADc/lz0vFcsRmSc/s72-c/WMETester.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-3008628366701331862</id><published>2006-11-27T18:47:00.000-08:00</published><updated>2006-11-27T19:48:56.068-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Publishing'/><title type='text'>Formatting .Net code For Blogger</title><content type='html'>In the same line of the &lt;a href="http://ghostspook.blogspot.com/2006/10/formatting-sql-statements-for-blogger.html"&gt;online SQL Formatter&lt;/a&gt; I posted about a month ago, here is another helpful tool for coding bloggers: &lt;a href="http://www.manoli.net/csharpformat/"&gt;C# Code Formatter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is an online tool and by that I mean that you have to browse to it in order to use it. Despite its name, it is not only restricted to C# code as it also support VB.Net, SQL and &lt;a href="http://channel9.msdn.com/wiki/default.aspx/Channel9.WindowsPowerShellWiki"&gt;Windows Power Shell&lt;/a&gt; commands.&lt;br /&gt;&lt;br /&gt;I like the clever use it makes of CSS styles. Of course it means you have to add a CSS file to your website or, in case you use blogger you can add the following text to the style section of the template:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The next is just trivial, copy and paste your code into the linked web page, select between C#, VB.Net, T-SQL and MSH (Windows Power Shell) and enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-3008628366701331862?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://channel9.msdn.com/wiki/default.aspx/Channel9.WindowsPowerShellWiki' title='Formatting .Net code For Blogger'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/3008628366701331862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=3008628366701331862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3008628366701331862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/3008628366701331862'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/11/formatting-net-code-for-blogger.html' title='Formatting .Net code For Blogger'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-2258250910481855409</id><published>2006-11-09T11:05:00.000-08:00</published><updated>2006-11-09T11:28:29.350-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Site Maintenance'/><title type='text'>Switching to Blogger Beta</title><content type='html'>I have been using &lt;span style="font-weight: bold;"&gt;Blogger beta&lt;/span&gt; for 2 weeks already for my "work" blog and I have to admit I am impressed. So I am deciding to migrate this blog (my personal one) to the beta version too.&lt;br /&gt;&lt;br /&gt;One of the first things I loved about "beta" is &lt;span style="font-weight: bold;"&gt;how faster posts are added&lt;/span&gt;. No more long waits until the pages are rebuilt after every post addition. Also &lt;span style="font-weight: bold;"&gt;spellchecking is great&lt;/span&gt;, unfortunately it is only available in English. &lt;span style="font-weight: bold;"&gt;Adding images is also a breeze&lt;/span&gt; and very user friendly.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;WYSIWYG editor is now available for &lt;/span&gt;Firefox in Blogger beta, something that doesn't happen with Blogger's current version.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Labels &lt;/span&gt;were a long overdue feature that really rocks. Labels act as categories, a single post can have multiple labels, meaning that they are booked into different categories, this is exactly what I needed for my "work" blog. A post can be labeled by typing the corresponding label(s) in a text box. What is great about that text box is the &lt;span style="font-weight: bold;"&gt;use of AJAX technology to help you choose from a list of previously typed labels&lt;/span&gt; (i.e. already existing categories) or just type a new one (resulting in a new category).&lt;br /&gt;&lt;br /&gt;The use of &lt;span style="font-weight: bold;"&gt;google accounts&lt;/span&gt; also makes total sense and it enables me to keep my "work" blog private, only accessible to a reduced number of users that can add both posts  and comments. I find this very curious that I don't feel uncomfortable having a google account but despise the need of &lt;span style="font-style: italic;"&gt;Microsoft Passport&lt;/span&gt; accounts.&lt;br /&gt;&lt;br /&gt;The migration of this blog was super-fast and seamless. The sitemeter&lt;span style="font-weight: bold;"&gt;.com&lt;/span&gt; visit counter remains in place, I still have to see about the CSS&lt;span style="font-weight: bold;"&gt; styles&lt;/span&gt; I had defined in my customized template, but I bet they still work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-2258250910481855409?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/2258250910481855409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=2258250910481855409' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2258250910481855409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/2258250910481855409'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/11/switching-to-blogger-beta.html' title='Switching to Blogger Beta'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-116198946410243835</id><published>2006-10-27T15:32:00.000-07:00</published><updated>2006-11-09T10:42:54.423-08:00</updated><title type='text'>Formatting SQL Statements For Blogger</title><content type='html'>Posting SQL stored procedures on a blog and making them readable at the same time is no easy task. I stoped trying a while ago.&lt;br /&gt;&lt;br /&gt;However, today I came accross an &lt;a href="http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl"&gt;online SQL Formatter&lt;/a&gt; which does exactly that, it formats SQL statements into a readable way. And the output is provided in both RTF text (ready to be used in your stored procedure) and in HTML.&lt;br /&gt;&lt;br /&gt;The only downside is that the carriage returns in the resulting HTML are translated into empty lines due to a blogger's "Convert line breaks" feature. But solving that is easy, just copy the resulting HTML into MSWord and replace all paragraph signs with a blank space.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5071/156/1600/ReplaceParagraphs.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/5071/156/320/ReplaceParagraphs.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The results are impressive, just read the stored procedure bellow:&lt;br /&gt;&lt;br /&gt;&lt;font face="Courier New" size="2"&gt;&lt;br&gt;&lt;font color="blue"&gt;/* Created by &lt;a href="http://www.wangz.net/gsqlparser/sqlpp/sqlformat.htm"&gt;free online sql formatter&lt;/a&gt; */&lt;/font&gt;&lt;br&gt;&lt;br&gt; &lt;font color = "blue"&gt;ALTER&lt;/font&gt;&amp;nbsp;&lt;font color = "blue"&gt;PROCEDURE&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;CustOrderHist&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "#8000FF"&gt;@CustomerID&lt;/font&gt;&amp;nbsp;&lt;font color = "black"&gt;NCHAR&lt;/font&gt;&lt;font color = "silver"&gt;(&lt;/font&gt;&lt;font color = "black"&gt;5&lt;/font&gt;&lt;font color = "silver"&gt;)&lt;/font&gt; &lt;br&gt;&lt;font color = "blue"&gt;AS&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;SELECT&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;ProductName&lt;/font&gt;&lt;font color = "silver"&gt;,&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;Total&lt;/font&gt;&amp;nbsp;&lt;font color = "silver"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color = "fuchsia"&gt;&lt;b&gt;SUM&lt;/font&gt;&lt;/b&gt;&lt;font color = "silver"&gt;(&lt;/font&gt;&lt;font color = "maroon"&gt;Quantity&lt;/font&gt;&lt;font color = "silver"&gt;)&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;FROM&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;Products&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;P&lt;/font&gt;&lt;font color = "silver"&gt;,&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;[Order&amp;nbsp;Details]&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;OD&lt;/font&gt;&lt;font color = "silver"&gt;,&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;Orders&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;O&lt;/font&gt;&lt;font color = "silver"&gt;,&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;Customers&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;C&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;WHERE&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "maroon"&gt;C&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;CustomerID&lt;/font&gt;&amp;nbsp;&lt;font color = "silver"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color = "#8000FF"&gt;@CustomerID&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;AND&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;C&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;CustomerID&lt;/font&gt;&amp;nbsp;&lt;font color = "silver"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;O&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;CustomerID&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;AND&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;O&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;OrderID&lt;/font&gt;&amp;nbsp;&lt;font color = "silver"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;OD&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;OrderID&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;AND&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;OD&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;ProductID&lt;/font&gt;&amp;nbsp;&lt;font color = "silver"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;P&lt;/font&gt;&lt;font color = "silver"&gt;.&lt;/font&gt;&lt;font color = "maroon"&gt;ProductID&lt;/font&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;font color = "blue"&gt;GROUP&lt;/font&gt;&amp;nbsp;&lt;font color = "blue"&gt;BY&lt;/font&gt;&amp;nbsp;&lt;font color = "maroon"&gt;ProductName&lt;/font&gt;    &lt;/font&gt; &lt;br /&gt;&lt;br /&gt;Cool, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-116198946410243835?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl' title='Formatting SQL Statements For Blogger'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/116198946410243835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=116198946410243835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116198946410243835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116198946410243835'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/10/formatting-sql-statements-for-blogger.html' title='Formatting SQL Statements For Blogger'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-116163249880287603</id><published>2006-10-23T11:42:00.000-07:00</published><updated>2006-11-09T10:42:54.359-08:00</updated><title type='text'>Nonsensical Patent Infrigement Lawsuit</title><content type='html'>Never understimate the nerve of some patent holding companies. For example take, take a look at these &lt;a href="http://news.yahoo.com/s/nm/20061023/wr_nm/ibm_amazon_dc_11"&gt;lawsuits that IBM is filing against Amazon&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;From the news note:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The suits say Amazon violates IBM patents covering such features as allowing users to order items from an electronic catalog, displaying advertising in an interactive service and storing data in an interactive network.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now seriously, what are the chances of any uf us coming up with a good idea that turns out to become a success without having to worry about this nonsensical patent infringement lawsuits?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-116163249880287603?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.yahoo.com/s/nm/20061023/wr_nm/ibm_amazon_dc_11' title='Nonsensical Patent Infrigement Lawsuit'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/116163249880287603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=116163249880287603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116163249880287603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116163249880287603'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/10/nonsensical-patent-infrigement-lawsuit.html' title='Nonsensical Patent Infrigement Lawsuit'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-116128514191521116</id><published>2006-10-19T11:41:00.000-07:00</published><updated>2006-11-09T10:42:54.299-08:00</updated><title type='text'>Fooling Keyloggers</title><content type='html'>Being the security paranoid that I am, I used to sweat whenever for some reason I had to use a public computer. Checking my mail or doing online banking is always a risk considering PCs vulnerability to so many keylogger trojans out there. Necessity being the mother of invention inspired me to come up with my own mechanism to fool keyloggers on a Windows PC: Using Windows Character Map&lt;br /&gt;&lt;br /&gt;For those who don't know what it is, Windows Character Map (WCM) is a small windows utility whose main purpose in life is to provide access to any font's entire repertoire of characters.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5071/156/1600/CharMap.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5071/156/320/CharMap.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But it can also be used to fool keyloggers. Just launch &lt;span style="font-weight:bold;"&gt;charmap.exe&lt;/span&gt; or go to &lt;span style="font-weight:bold;"&gt;Programs-Accesories-System Tools-Character Map&lt;/span&gt;. Using your mouse double click on the characters on the screen to build up your username or password, WCM has a textbox that shows the word you are building, make sure nobody is watching what you are writing of course. Now, select the text you typed into WCM's textbox and drag it (don't copy/paste, the clipboard is not safe either) into the webpage's username or password input box.&lt;br /&gt;&lt;br /&gt;As usual I hope somebody finds this tip useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-116128514191521116?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/116128514191521116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=116128514191521116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116128514191521116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116128514191521116'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/10/fooling-keyloggers.html' title='Fooling Keyloggers'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-116067427120471710</id><published>2006-10-12T10:12:00.000-07:00</published><updated>2006-11-09T10:42:54.232-08:00</updated><title type='text'>IIS Wouldn't Start: Port 80 Already Taken By Skype</title><content type='html'>Seems like Skype was preventing the IIS WWW service from starting on my System.&lt;br /&gt;&lt;br /&gt;Every now and then I stop certaing services/processes running on my Win XP Box to put the additionally available clock cicles to better use . When I am done with whatever I have in mind I turn on the services back again.&lt;br /&gt;&lt;br /&gt;A few days ago, along with some other services I also stopped Micosoft Information Server's services, all of them: WWW, FTP and SMTP. Usually I restart every service I have stopepd once I am done with the stuff I was up to, but this time I forgot to restart IIS.&lt;br /&gt;&lt;br /&gt;Next morning, after booting up I wasn't able to work on my Visual Studio .NET web project. That was becouse IIS' WWW Service was stopped. I unsuccessfully tried to start it using the IIS Management Console. I didn´t get an error message, the only feedback was a weird stop sign next to the WWW Service in IIS Management Console.&lt;br /&gt;&lt;br /&gt;The EventLog provided an entry whose source was W3SVC. Indicating error 10048 (&amp;2740H). I googled it and found it was a socket error: &lt;span style="font-style:italic;"&gt;Address Already in Use&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I performed a &lt;span style="font-style:italic;"&gt;netstat -o&lt;/span&gt; and found the guilty process: Skype. Skype uses port 80 if it is available. I was able to start the WWW service after exiting Skype. After that I launched Skype and it worked fine.&lt;br /&gt;&lt;br /&gt;Haven't had any other problem with both IIS and Skype since then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-116067427120471710?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/116067427120471710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=116067427120471710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116067427120471710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116067427120471710'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/10/iis-wouldnt-start-port-80-already.html' title='IIS Wouldn&apos;t Start: Port 80 Already Taken By Skype'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-116059634260477495</id><published>2006-10-11T12:37:00.000-07:00</published><updated>2006-11-09T10:42:54.168-08:00</updated><title type='text'>Generating a CREATE TABLE T-SQL Definition From Any Table</title><content type='html'>Thanks to Mark Clerget for this &lt;a href="http://blogs.consultantsguild.com/index.php/mclerget/2005/01/31/dynamic_t_sql_in_just_minutes"&gt;helpful hint&lt;/a&gt; on how to obtain a neat 'CREATE TABLE' T-SQL definition based on an already existing table on MS SQL Server. This is what I do to document new table definitions in my blog at work using T-SQL as a formal language.&lt;br /&gt;&lt;br /&gt;The process is quite simple. Paste the following query into a SQL Server Query Analyzer window and set the current database to Northwind. Set the output format to Text. Then run the query....&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;declare @vsSQL varchar(8000)&lt;br /&gt;declare @vsTableName varchar(50)&lt;br /&gt;select @vsTableName = 'Customers'&lt;br /&gt;&lt;br /&gt;select @vsSQL = 'CREATE TABLE ' + @vsTableName + char(10) + '(' + char(10)&lt;br /&gt;&lt;br /&gt;select @vsSQL = @vsSQL + ' ' + sc.Name + ' ' +&lt;br /&gt;st.Name +&lt;br /&gt;case when st.Name in ('varchar','varchar','char','nchar') then '(' + cast(sc.Length as varchar) + ') ' else ' ' end +&lt;br /&gt;case when sc.IsNullable = 1 then 'NULL' else 'NOT NULL' end + ',' + char(10)&lt;br /&gt;from sysobjects so&lt;br /&gt;join syscolumns sc on sc.id = so.id&lt;br /&gt;join systypes st on st.xusertype = sc.xusertype&lt;br /&gt;where so.name = @vsTableName&lt;br /&gt;order by&lt;br /&gt;sc.ColID&lt;br /&gt;&lt;br /&gt;select substring(@vsSQL,1,len(@vsSQL) - 2) + char(10) + ')'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For best results select Query-&gt;Results In Text. You should get something like this&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE Customers&lt;br /&gt;(&lt;br /&gt; CustomerID nchar(10) NOT NULL,&lt;br /&gt; CompanyName nvarchar NOT NULL,&lt;br /&gt; ContactName nvarchar NULL,&lt;br /&gt; ContactTitle nvarchar NULL,&lt;br /&gt; Address nvarchar NULL,&lt;br /&gt; City nvarchar NULL,&lt;br /&gt; Region nvarchar NULL,&lt;br /&gt; PostalCode nvarchar NULL,&lt;br /&gt; Country nvarchar NULL,&lt;br /&gt; Phone nvarchar NULL,&lt;br /&gt; Fax nvarchar NULL&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If the resulting T-SQL script gets truncated, you may have to increase the 'Maximum Characters per column' settings which is in Tools-&gt;Options ('Results' tab).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-116059634260477495?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.consultantsguild.com/index.php/mclerget/2005/01/31/dynamic_t_sql_in_just_minutes' title='Generating a CREATE TABLE T-SQL Definition From Any Table'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/116059634260477495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=116059634260477495' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116059634260477495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/116059634260477495'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/10/generating-create-table-t-sql.html' title='Generating a CREATE TABLE T-SQL Definition From Any Table'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-115561497927445916</id><published>2006-08-14T21:04:00.000-07:00</published><updated>2006-11-09T10:42:54.107-08:00</updated><title type='text'>Open Letter To US Congressmen On Network Neutrality</title><content type='html'>To all Congressmen:&lt;br /&gt;&lt;br /&gt;The Internet's current Network Neutrality paradigm is not an accident. It was produced by design based on technological reasons.&lt;br /&gt;&lt;br /&gt;This design combined with the power of the free market and the initiative of individuals shaped the Internet into the democratizing tool that we have in hand today.&lt;br /&gt;&lt;br /&gt;Governments that are not commited with true democratic values see the Internet as threat to their hegemony. It is not uncommon to see these governments take direct action in censoring Internet content. We, as free people should treasure the potential that the Internet's current approach represents for spreading liberty and democracy. I, as a non-US citizen certainly do.&lt;br /&gt;&lt;br /&gt;By voting against Network Neutrality, Congress would effectively be giving Corporations that lobby against it, the power to discriminate how information reaches the final users.&lt;br /&gt;&lt;br /&gt;Don't let this happen. Keep the Internet democratic. Keep it free.&lt;br /&gt;&lt;br /&gt;Sincerely,&lt;br /&gt;&lt;br /&gt;Rafael Castillo&lt;br /&gt;Ecuadorian Citizen and Internet User&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-115561497927445916?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/115561497927445916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=115561497927445916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115561497927445916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115561497927445916'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/08/open-letter-to-us-congressmen-on.html' title='Open Letter To US Congressmen On Network Neutrality'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-115561164890261001</id><published>2006-08-14T19:54:00.000-07:00</published><updated>2006-11-09T10:42:54.045-08:00</updated><title type='text'>Microsoft XBOX Strategy On The Right Track</title><content type='html'>Microsoft's business success is based mostly on Windows success. And yes there is also Office and Windows CE and some other fine piced of software made by MS but let's face it, Windows is not just the company's flagproduct, it is the reason it has survived and became what it is. Now, despite what many die-hard PC enthusiasts say, Windows success is not due to its technological superiority, but rather the result of a brilliant yet simple business idea: Let developers push the technology.&lt;br /&gt;&lt;br /&gt;Microsoft has mastered this strategy. They had a vision in which users would choose Windows because there are tons of software for it and the way to make that happen consisted in providing developers of all levels with the right development tools.&lt;br /&gt;&lt;br /&gt;Behold Visual Studio. Visual Studio was born years after the individual releases of Microsoft Visual C++ and Visual Basic, but it was Visual Basic that did the magic. Developers of Business Solutions found in VB the tool they needed to get the most out of the platform during the client-server revolution back in the early 90s. Most professional developers of today found in VB the first door to fulfill their dreams: to build a program that could run in the most popular platform with most advanced user interface of its time (or so we thought) and be able to learn it, master it and make profit with it in a decent amount of time. And I think MS did it just right and that is why they won the desktop OS competition despite being technologically inferior when compared with other operating systems.&lt;br /&gt;&lt;br /&gt;History is about to repeat itself somehow (in a different arena though) with MS announcement of &lt;a href="http://msdn.microsoft.com/directx/xna/"&gt;XNA Game Studio Express&lt;/a&gt;. According to Microsoft, XNA GSE is a set of tools that allow students and hobbyists to build games that target both Windows and Xbox 360.&lt;br /&gt;&lt;br /&gt;If MS idea works, it could mean serios problems for Sony and Nintendo game stations. XNA GSE combined with the power of the Intenrnet could generate a whole new brand of online communities and markets. I am no big fan of MS, but I have to admit these guys know the rules of this online-gaming-market game as well as its tricks and shortcuts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-115561164890261001?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/directx/xna/' title='Microsoft XBOX Strategy On The Right Track'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/115561164890261001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=115561164890261001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115561164890261001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115561164890261001'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/08/microsoft-xbox-strategy-on-right-track.html' title='Microsoft XBOX Strategy On The Right Track'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-115285572591775450</id><published>2006-07-13T22:34:00.000-07:00</published><updated>2006-11-09T10:42:53.983-08:00</updated><title type='text'>Bringing Back My Firefox Profile</title><content type='html'>After leaving my computer unattended for one hour, I faced the inability to access my bookmarks and the whole set of preferences that has taken me so long to establish on Firefox, including saved passwords and toolbar configurations. Fortunately I found a &lt;a href="http://forums.mozillazine.org/viewtopic.php?t=261801"&gt;helpful post&lt;/a&gt; and I was able to fix it in a minute or so.&lt;br /&gt;&lt;br /&gt;The steps, as directed on the page mentioned above are:&lt;br /&gt;&lt;br /&gt;1. Close Firefox; completely. Open the Task Manager [Ctrl+Alt+Delete in winXP] [screenshot] and kill any firefox.exe processes, if still running. [How to kill an application]&lt;br /&gt;&lt;br /&gt;2. Skip this step. Browse to your Profile Folder [in windowsXP under C:\Documents and Settings\%username%\Application Data\Mozilla\Firefox\Profiles\randomname.default\ ] and delete the file parent.lock, if it exists. [Where is my Profile Folder?]&lt;br /&gt;&lt;br /&gt;3. Run the Profile Manager [in windows: Start | Run | type firefox.exe -p | ok] and choose the default profile. [screenshot] [How to run the Profile Manager]&lt;br /&gt;&lt;br /&gt;If the Profile Manager does not appear, repeat without skipping step 2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-115285572591775450?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.mozillazine.org/viewtopic.php?t=261801' title='Bringing Back My Firefox Profile'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/115285572591775450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=115285572591775450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115285572591775450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115285572591775450'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/07/bringing-back-my-firefox-profile.html' title='Bringing Back My Firefox Profile'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-115282926991084722</id><published>2006-07-13T15:02:00.000-07:00</published><updated>2006-11-09T10:42:53.923-08:00</updated><title type='text'>Hosting AJAX Solutions On Amazon S3 with OpenFount Queued Server</title><content type='html'>Amazon S3 opens a whole new universe of possible web solutions. But hosting AJAX solutions that consume third party web services is not possible due to the security limitations imposed by the XMLHttlRequest object.&lt;br /&gt;&lt;br /&gt;OpenFount Queued Server addresses this problem by providing a fully decoupled solution that is both highly reusable, very scalable and also affordable.&lt;br /&gt;&lt;br /&gt;It works like this. AJAX solutions are stored in S3. The requests to third party web services are stored in S3 using a provided API. A working OpenFount Queued Server  constantly polls S3 for this requests which are dealt in a first come first served basis. The OQS then contacts the web service provider (so far only Google Web Services are provided out of the box) an fulfills the requests, posting the response back into S3. See diagram below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5071/156/1600/OpenFountQS.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5071/156/400/OpenFountQS.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The client application reads the response from S3 using a similar polling approach.&lt;br /&gt;&lt;br /&gt;For more info, read on Jon Udel post &lt;a href="http://weblog.infoworld.com/udell/2006/07/07.html#a1483"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-115282926991084722?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/115282926991084722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=115282926991084722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115282926991084722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/115282926991084722'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/07/hosting-ajax-solutions-on-amazon-s3.html' title='Hosting AJAX Solutions On Amazon S3 with OpenFount Queued Server'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-114969033024335954</id><published>2006-06-07T07:13:00.000-07:00</published><updated>2006-11-09T10:42:53.861-08:00</updated><title type='text'>YAMAHA Digital Music Notebook: Printing Multiple Times</title><content type='html'>I really like &lt;a href="http://www.digitalmusicnotebook.com"&gt;YAMAHA Digital Music Notebook&lt;/a&gt;, it is a neat application that let's me download digital sheet music for a price. Think of it as the digital sheet music version of the &lt;a href="http://www.apple.com/itunes/"&gt;iTunes Music Store&lt;/a&gt; only that it is less popular than the famous online store and YAMAHA has to fight for marketshare with competitor services like &lt;a href="http://musicnotes.com/"&gt;Musicnotes.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, there are two things I don't like about YAMAHA DMN: 1) It's catalog is too small. 2) It only allows me to print my sheet music once per song. There is nothing I can do about problem 1 and it doesn't really bother me too much as I am only an amateur musician trying to play some tunes. But I have found problem 2 very troubling. Think of it, it's like buying music on iTMS and not being able to take it with me on my iPod while leaving it on my PC for future playback (I am being totally metaphoric here, as I do not own an iPod and I have not plans to get one anytime soon).&lt;br /&gt;&lt;br /&gt;But then I found the solution: MS Office Document Image Writer. MSODIW is a feature of Office 2003. It is a virtual printer that works pretty much the same way Adobe PDF printer does.&lt;br /&gt;&lt;br /&gt;For those who haven't used either MSODIW or Adobe PDF printer, these are virtual printers that output print jobs into files. Whenever one prints a job using these virtual devices, the user is prompeted for a filename and a file location. The User can then open the "print" (as in non-editable) version of the file using  Microsoft Office Digital Imaging or Adobe Reader respectively. These applications are freely available. I have always prefered Adobe over MS, mostly for universal compatibility reasons. I can read PDF docs on my Mac, my PDA or my PC indistinctly.&lt;br /&gt;&lt;br /&gt;However MSODIW has proven very useful to solve my problem with YAMAHA DMN; I can not do the same with Adobe PDF printer, I get a message saying that printing to a file is not enabled. So what I do now is: 1)I buy the sheet music, 2)I download it, 3)I print it to MSODIW, and save it in my file system for future use. Now, anytime I need to print my sheet music again (the one I already PAID for). I just open the corresponding file and print again, as many times as I want.&lt;br /&gt;&lt;br /&gt;I really hope someone will find this post helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-114969033024335954?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/114969033024335954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=114969033024335954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114969033024335954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114969033024335954'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/06/yamaha-digital-music-notebook-printing.html' title='YAMAHA Digital Music Notebook: Printing Multiple Times'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-114952415544785767</id><published>2006-06-05T08:38:00.000-07:00</published><updated>2006-11-09T10:42:53.793-08:00</updated><title type='text'>AJAX On VS.Net 2002: Don't Forget To Set ContentType</title><content type='html'>In a previous post I described how I managed to log actions performed by the client (browser, ActiveX components, etc.) using AJAX techniques.&lt;br /&gt;&lt;br /&gt;In such ocasion there was no need for the client to do anything with the server's response. After doing that I tried a second improvement to my web project using AJAX and this time I would be doing something with the response. The response was provided in XML format.&lt;br /&gt;&lt;br /&gt;The XML was built using the HTML designer of VS .NET:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;%&lt;/font&gt;&lt;font color="#646464"&gt;@&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Page&amp;nbsp;Language=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;vb&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;AutoEventWireup=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;false&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Codebehind=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;GetDeliverable.aspx.vb&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;Inherits=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;WebSys2.GetDeliverable&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;%&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;?xml&amp;nbsp;version=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;1.0&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;encoding=&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;UTF-8&amp;#34;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;?&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;xmlresponse&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;success&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;%=_success%&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/success&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;url&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;%=_url%&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/url&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;reportNo&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;%=_reportNo%&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;/reportNo&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;&amp;lt;/xmlresponse&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The variables are populated by the serverside code of the .aspx page:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Protected _deliverableVirtualPath As String = ""&lt;br /&gt;    Protected _reportNo As String = ""&lt;br /&gt;    Protected _success As Boolean = False&lt;br /&gt;    Protected _url As String = ""&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;        &lt;strong&gt;Response.ContentType = "text/xml"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;        _reportNo = "report No goes here"&lt;br /&gt;        _url = "URL goes here"&lt;br /&gt;        _deliverableVirtualPath = "here is the path to something"&lt;br /&gt;        _success = True&lt;br /&gt;    End Sub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So here is the tip for this entry: Do not forget to set the Response.ContentType to "text/xml". If you do, the callback code on your browser will fail to parse the XMLHttpRequest.xmlResponse object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-114952415544785767?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/114952415544785767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=114952415544785767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114952415544785767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114952415544785767'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/06/ajax-on-vsnet-2002-dont-forget-to-set.html' title='AJAX On VS.Net 2002: Don&apos;t Forget To Set ContentType'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-114926220698642491</id><published>2006-06-02T08:14:00.000-07:00</published><updated>2006-11-09T10:42:53.728-08:00</updated><title type='text'>AJAX On VS.Net 2002: Logging Client Actions</title><content type='html'>After reading &lt;a href="http://www.amazon.com/gp/product/1590595823/sr=8-1/qid=1149261212/ref=pd_bbs_1/002-9428001-6046447?%5Fencoding=UTF8"&gt;Foundations of Ajax&lt;/a&gt;, I decided to implement some AJAX enabled features on an existing solution.&lt;br /&gt;&lt;br /&gt;This is an ongoing project that started a few years ago and remains to this day a solution based on the .NET Framework 1.0. I use VS.Net 2002 to develop it.&lt;br /&gt;&lt;br /&gt;My first AJAX project consisted on logging some client server actions (like printing an embeded office document using MS' &lt;a href="http://support.microsoft.com/?id=311765"&gt;DSOFramer&lt;/a&gt; component). After the printing takes place, the browser would send a request to the server using the XMLHttpRequest object sending the information needed to be logged along with the URL using a GET request. &lt;code&gt;printDoc2&lt;/code&gt; is the method invoked by the &lt;code&gt;onclick&lt;/code&gt; event of the print button:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; var xmlHttp;&lt;br /&gt;&lt;br /&gt; function createXMLHttpRequest() {&lt;br /&gt;  if (window.ActiveXObject) {&lt;br /&gt;   xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;  } &lt;br /&gt;  else if (window.XMLHttpRequest) {&lt;br /&gt;   xmlHttp = new XMLHttpRequest();                &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function logClientAction(action, reportNo) {&lt;br /&gt;  createXMLHttpRequest();&lt;br /&gt;  var url = "LogClientAction.aspx?action=" + action + "&amp;reportno=" + reportNo + "&amp;ts=" + new Date().getTime();&lt;br /&gt;  xmlHttp.open("GET", url, true);&lt;br /&gt;  xmlHttp.onreadystatechange = callback;&lt;br /&gt;  xmlHttp.send(null);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function callback() {&lt;br /&gt;  if (xmlHttp.readyState == 4) {&lt;br /&gt;   if (xmlHttp.status == 200) {&lt;br /&gt;    //alert("Successful callback");&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function printDoc2(reportNo) {&lt;br /&gt;  var oDoc;&lt;br /&gt;  //Start printing&lt;br /&gt;  oDoc = dsoDeliverable.ActiveDocument;&lt;br /&gt;  oDoc.PrintOut(false);&lt;br /&gt;  dsoDeliverable.toolbars = true;&lt;br /&gt;  dsoDeliverable.toolbars = false;&lt;br /&gt;  //Finish printing&lt;br /&gt;  logClientAction("print", reportNo);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see I am doing nothing with the response to my request. I have a remarked out call to the &lt;code&gt;alert()&lt;/code&gt; method inside the &lt;code&gt;callback&lt;/code&gt; function to be conveniently used for debugging purposes.&lt;br /&gt;&lt;br /&gt;On the server side LogClientAction.aspx has to be edited to perform the corresponding serverside actions:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;    Dim ActionText As String&lt;br /&gt;    Dim ReportNo As String&lt;br /&gt;&lt;br /&gt;    ActionText = Request.Params("action")&lt;br /&gt;    ReportNo = Request.Params("reportNo")&lt;br /&gt;&lt;br /&gt;    'Here I am going to log the action:&lt;br /&gt;&lt;br /&gt;    '1. This is CSLA specific code to get&lt;br /&gt;    '   the session's username&lt;br /&gt;    Dim MyPrincipal As BusinessPrincipal&lt;br /&gt;    MyPrincipal = CType(Threading.Thread.CurrentPrincipal, _&lt;br /&gt;        BusinessPrincipal)&lt;br /&gt;&lt;br /&gt;    '2. Get the client's IP&lt;br /&gt;    Dim IPAddress As String = _&lt;br /&gt;        Request.ServerVariables("REMOTE_ADDR")&lt;br /&gt;&lt;br /&gt;    Dim ActionID As Long&lt;br /&gt;&lt;br /&gt;    Select Case ActionText&lt;br /&gt;        Case "print"&lt;br /&gt;            ActionID = 7&lt;br /&gt;    End Select&lt;br /&gt;&lt;br /&gt;    '3. Log action into DB, File, etc.&lt;br /&gt;    'In order to perform the logging&lt;br /&gt;    'I use my CSLA.Net business objects,&lt;br /&gt;    'replace this with your own code&lt;br /&gt;    Dim LogEntry As EMRLogReport&lt;br /&gt;    LogEntry = EMRLogReport.NewEMRLogReport( _&lt;br /&gt;        ReportNo, ActionID, _&lt;br /&gt;        MyPrincipal.Identity.Name, _&lt;br /&gt;        IPAddress)&lt;br /&gt;    LogEntry.Save()&lt;br /&gt;End Sub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Since no response is expected by the &lt;code&gt;callback&lt;/code&gt; function, there is no need to modify anything on the HTML part of  LogClientAction.aspx.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-114926220698642491?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/114926220698642491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=114926220698642491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114926220698642491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114926220698642491'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/06/ajax-on-vsnet-2002-logging-client.html' title='AJAX On VS.Net 2002: Logging Client Actions'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-114722819768015245</id><published>2006-05-09T19:24:00.000-07:00</published><updated>2006-11-09T10:42:53.665-08:00</updated><title type='text'>The New Breed Of Team Applications</title><content type='html'>Having worked a year and a half for a US Company from my home office in Ecuador, I can relate to some of the needs that are satisfied by a new generation of online collaboration tools depicted in &lt;a href="http://www.informit.com/articles/article.asp?p=460396&amp;rl=1"&gt;this article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A very recomended reading for anyone who is considering telecommuting or IT managers that need to coordinate actions with remoted employees.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-114722819768015245?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.informit.com/articles/article.asp?p=460396&amp;rl=1' title='The New Breed Of Team Applications'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/114722819768015245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=114722819768015245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114722819768015245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/114722819768015245'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2006/05/new-breed-of-team-applications.html' title='The New Breed Of Team Applications'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-113012075818268189</id><published>2005-10-23T19:18:00.000-07:00</published><updated>2006-11-09T10:42:53.602-08:00</updated><title type='text'>Set initial focus on Web Forms</title><content type='html'>Long time no post. The most scary thing is that nobody has complained.&lt;br /&gt;&lt;br /&gt;Anyway, here is an article published by &lt;a href="mailto:webmaster at dotnetbips.com"&gt;Bipin Joshi&lt;/a&gt; where he explains his solution to the problem of setting the initial focus on a web form.&lt;br /&gt;&lt;br /&gt;It is easy, elegant and it works. Here is the function that needs to be added to the server side code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Private Sub &lt;br /&gt;Page_Load(ByVal sender As System.Object, &lt;br /&gt;ByVal e As System.EventArgs) &lt;br /&gt;Handles MyBase.Load&lt;br /&gt;&lt;br /&gt; SetInitialFocus(TextBox1)&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Public Shared Sub SetInitialFocus(ByVal ctrl As Control)&lt;br /&gt;Dim s As StringBuilder = New StringBuilder()&lt;br /&gt;s.Append("&amp;lt;SCRIPT LANGUAGE='JavaScript'&amp;gt;")&lt;br /&gt;s.Append("function SetInitialFocus()")&lt;br /&gt;s.Append("{")&lt;br /&gt;s.Append("   document.")&lt;br /&gt;&lt;br /&gt;Dim p As Control = ctrl.Parent&lt;br /&gt;While Not TypeOf p Is System.Web.UI.HtmlControls.HtmlForm&lt;br /&gt; p = p.Parent&lt;br /&gt;End While&lt;br /&gt;s.Append(p.ClientID)&lt;br /&gt;s.Append("['")&lt;br /&gt;s.Append(ctrl.UniqueID)&lt;br /&gt;s.Append("'].focus();")&lt;br /&gt;s.Append("}")&lt;br /&gt;s.Append("window.onload = SetInitialFocus;")&lt;br /&gt;s.Append("&amp;lt;/SCRIPT&amp;gt;")&lt;br /&gt;ctrl.Page.RegisterClientScriptBlock("InitialFocus", s.ToString())&lt;br /&gt;End Sub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dotnetbips.com/12665335-9869-4458-8207-3201398B6902.aspx?articleid=106"&gt;Here is a link&lt;/a&gt; to the article where you can find a disection of the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-113012075818268189?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dotnetbips.com/12665335-9869-4458-8207-3201398B6902.aspx?articleid=106' title='Set initial focus on Web Forms'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/113012075818268189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=113012075818268189' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/113012075818268189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/113012075818268189'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/10/set-initial-focus-on-web-forms.html' title='Set initial focus on Web Forms'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-111380551345886969</id><published>2005-04-17T23:06:00.000-07:00</published><updated>2006-11-09T10:42:53.542-08:00</updated><title type='text'>Bug when exposing BizObjs through secure Data Portal (https)</title><content type='html'>We just discovered an issue with CSLA BizObjs that is only present when the BizObj DLLs are exposed through IIS using a secure site and any of the DLLs referenced by the client app is called &lt;code&gt;security.dll&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;When using a secure HTTPS connection to access remoted CSLA business objects the .NET framework attempts to use one &lt;b&gt;Windows DLL called '&lt;code&gt;security.dll&lt;/code&gt;'&lt;/b&gt;. A conflict occurs when the client app references another DLL with that same name. Other people have experienced &lt;a href="http://www.error-bank.com/microsoft.public.dotnet.security/4135_thread.aspx"&gt;the same situation&lt;/a&gt; with Web Services. In CSLA's case the exception is thrown by the CSLA framework's DataPortal class at the time it attempts to call any DataPortal.* method.&lt;br /&gt;&lt;br /&gt;Here is the output of the exception:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;An unhandled exception of type 'System.EntryPointNotFoundException' occurred in system.dll &lt;br /&gt;Additional information: Unable to find an entry point named EnumerateSecurityPackagesW in DLL security.dll.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The only solution is to &lt;b&gt;rename the referenced DLL and then update the reference&lt;/b&gt; in the VS.NET project to point to the new filename. In our case, our Security.dll actually contained bizobjs, so we had to modify the Security project's Assembly name property to something else and recompile. Then we updated references and recompiled the client apps that used those BizObjs. It worked fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-111380551345886969?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/111380551345886969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=111380551345886969' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111380551345886969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111380551345886969'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/04/bug-when-exposing-bizobjs-through.html' title='Bug when exposing BizObjs through secure Data Portal (https)'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-111329087335085745</id><published>2005-04-12T00:18:00.000-07:00</published><updated>2006-11-09T10:42:53.471-08:00</updated><title type='text'>iBlog 1.4.2 Won't Publish Anymore</title><content type='html'>I updated my version of iBlog (1.3.1)  to the latest one (1.4.2) and it seemed to work fine, at least at the beginning. But then, the next time I launched the app I wasn't able to publish any of my blogs.&lt;br /&gt;&lt;br /&gt;I didn't get any errors. It simply did nothing when I clicked on the Publish button. Fortunately I kept my original binary of iBlog and was able to roll back to it. However, I lost the posts that I entered using 1.4.2.&lt;br /&gt;&lt;br /&gt;It was good while it lasted, I have to admit that it has several nice features, but what good can they make if I can not publish my posts. Seems like the bugs with version 1.4.x are causing some serios damage to the iBlog user base, at least according to the number of posts on sites like VersionTracker.com. Worst of all, the developer's website says nothing about the bugs nor the fixes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-111329087335085745?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/111329087335085745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=111329087335085745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111329087335085745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111329087335085745'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/04/iblog-142-wont-publish-anymore.html' title='iBlog 1.4.2 Won&apos;t Publish Anymore'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-111224162038504966</id><published>2005-03-30T19:59:00.000-08:00</published><updated>2006-11-09T10:42:53.348-08:00</updated><title type='text'>Gluing Up The Pieces Of Web Presence</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;We all new it was coming, but it wasn't until this week that I really had a chance to experience how web technologies and tools have evolved and how available they have become to the individual user.&lt;br /&gt;&lt;br /&gt;Web content has always been a highly democratized good and even though the number of subscription (pay) sites has increased, it is safe to say that most content in the web (both authoritative and non-authoritative) is freely available. But building a web presence has never been quite easy. Sites like &lt;a href="http://www.geocities.com/"&gt;Geocities&lt;/a&gt; and &lt;a href="http://www.lycos.com/"&gt;Lycos&lt;/a&gt; offered a chance for individuals to post content on the Internet, but the technical part (HTML) always imposed a problem.&lt;br /&gt;&lt;br /&gt;Behold &lt;b&gt;blogs&lt;/b&gt; and &lt;b&gt;XML feeds&lt;/b&gt;. This one tool and that other technology simplify personal web publishing in a way that it can become a doable task. No need to hire a funky guy that wears weird clothes eats lots of pizza and drinks gallons of soda (like me) to have a website that really say something about someone and can be updated regularly. Like one, two, three, 20 times aday&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Blogs and XML feeds&lt;/b&gt;&lt;br /&gt;In case you've been living in Biosphere II for the last 4 years, a blog is a tool that enables regular, non-technical users to publish anything they want just by typing it on a text box and pushing a "publish" button. Today you can find blogs for almost any subject. Bloggers have already showed how they can even have an &lt;a href="http://abcnews.go.com/WNT/PersonOfWeek/story?id=372266&amp;amp;page=1"&gt;impact in the political spectrum&lt;/a&gt;. This article is actually a posting of a blog.&lt;br /&gt;&lt;br /&gt;Now, XML Feeds are to web content syndication what Blogs are to web content creation. Again, this is simple technology that allows the publication of articles (and blogs too) in a structured and well-known format. This amounts for automatic update of web content. For instance your page could show updated &lt;a href="http://rss.cnn.com/rss/cnn_topstories.rss"&gt;headlines of CNN&lt;/a&gt; or &lt;a href="http://guide.apple.com/rss/newarrivals.rss"&gt;new products from Apple&lt;/a&gt;. XML Feeds also shows how content itself and presentation can be decoupled in a way that makes content more reusable. XML Feeds are also called sometimes RSS, Atom feed, RDF, etc.&lt;br /&gt;&lt;br /&gt;For XML feeds to be useful, you need an aggregator. An aggregator is a tool that renders XML feeds in a "readable" format. Remember that XML feeds are, well... XML. There are several stand-alone aggregators, but we need a JavaScript based aggregator. For web publishing purposes, XML needs to be massaged into HTML in order to be displayed in a webpage. For that you need a special kind of aggregator, a JavaScript-based aggregator. To publish syndicated content in your page you just have to add some code generated by the aggregator into your web page. The rest is handled by the code. That is how CNN can end up in your page.&lt;br /&gt;&lt;br /&gt;If you are clever enough you can combine these two technologies with some other elements and you can publish your own web content in a very flexible and practical way.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Ingredients&lt;/b&gt;&lt;br /&gt;Ok, you have to do what you can with what you have. In my case these were my tools:&lt;br /&gt;&lt;br /&gt;    * A Web Host. In my case &lt;a href="http://www.mac.com/"&gt;.mac&lt;/a&gt; homepage. It comes as part of my subscription to Apple's .mac services ($100 a year). But you might as well try a free host like bravenet.com.&lt;br /&gt;    * A Web template. Unless you want to start from scratch, you may want to try one of those free HTML templates. I grabbed one for free from &lt;a href="http://www.freewebtemplates.com/"&gt;http://www.freewebtemplates.com/&lt;/a&gt;&lt;br /&gt;    * An HTML editor. I am short of money so I went the freeware way: I used &lt;a href="http://www.nvu.com/"&gt;NVU&lt;/a&gt; for Mac OS X. There is a Windows version too. NVU is an open source project that promises a lot and it is only in version 0.9 as of the time of this post.&lt;br /&gt;    * A Blog with XML feed support. I opened my blog at &lt;a href="http://www.blogger.com"&gt;blogger.com&lt;/a&gt; (free again). Blogger.com offers Atom feeds, which work fine.&lt;br /&gt;    * A web (JavaScript-based) aggregator. I used &lt;a href="http://jade.mcli.dist.maricopa.edu/feed/index.php?s=about"&gt;F2JS&lt;/a&gt;, again free.&lt;br /&gt;    * A web domain. I bought Rafael-castillo.com through &lt;a href="http://smallbusiness.yahoo.com/domains"&gt;Yahoo! Domains&lt;/a&gt; for 9.95&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gluing up the pieces&lt;/b&gt;&lt;br /&gt;I built my Main Page by modifying the template I downloaded from freewebtemplates.com using NVU. I added links to my &lt;a href="http://homepage.mac.com/pcastill/Gallery/"&gt;.mac picture Gallery&lt;/a&gt;, to &lt;a href="http://ghostspook.blogspot.com/"&gt;my blog&lt;/a&gt; and some graphics.&lt;br /&gt;&lt;br /&gt;Using F2JS I added &lt;a href="http://weblog.infoworld.com/udell/rss.xml"&gt;syndicated content&lt;/a&gt; to my blog web page. Then I used F2JS against my own blog's XML feed. In my webpage I added the code generated by F2JS (for my own blog) and I finally added a cascade style sheet (.css) to &lt;a href="http://jade.mcli.dist.maricopa.edu/feed/index.php?s=style"&gt;nicely format&lt;/a&gt; my syndicated content.&lt;br /&gt;&lt;br /&gt;Now my webpage gets updated automatically with the latest article from my blog. The next step will be to create a new blog just for the purpose of updating my webpage using it's XML feed, think of it as a personal news blog. This way I won't have to touch NVU anymore (even though I have really started to like it) in order to update my site.&lt;br /&gt;&lt;br /&gt;I published my main page (named index.htm) along with supporting files (CSS, images and so on) in my iDisk Sites folder making it my start up page in homepage.mac.com/pcastill. Then,using Yahoo SmallBusiness tools I redirected my domain Rafael-castillo.com to that location.&lt;br /&gt;&lt;br /&gt;To see the final product, &lt;a href="http://rafael-castillo.com/"&gt;click here&lt;/a&gt;. I will definitely do more experimentation with web technologies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-111224162038504966?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/111224162038504966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=111224162038504966' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111224162038504966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111224162038504966'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/03/gluing-up-pieces-of-web-presence.html' title='Gluing Up The Pieces Of Web Presence'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-111169159422938940</id><published>2005-03-24T09:13:00.000-08:00</published><updated>2006-11-09T10:42:53.257-08:00</updated><title type='text'>Rendering RSS/Atom feeds into your web page</title><content type='html'>There are several tools, called aggregators (like &lt;a href="http://www.disobey.com/amphetadesk/"&gt;this one&lt;/a&gt;) that let you keep track of several RSS or Atom feeds using one single envorionment. All that is nice and neat, but what I wanted is to add syndicated content to my web page in a way that freed me from updating it every day (or every minute for that matter).&lt;br /&gt;&lt;br /&gt;And then I found this &lt;a href="http://jade.mcli.dist.maricopa.edu/feed/index.php"&gt;neat tool&lt;/a&gt; called &lt;a href="http://jade.mcli.dist.maricopa.edu/feed/index.php"&gt;F2JS&lt;/a&gt; (Feed 2 Java Script) that let you do so. This web site takes you through a short questionare in order to determine what and how you want to show the syndicated content and then it generates a few lines of HTML/javascript code that you have to paste in your hosting web page.&lt;br /&gt;&lt;br /&gt;Browsers that don't support javascript get a little legend that takes them to another page that shows the syndicated content.&lt;br /&gt;&lt;br /&gt;I find it neat. I already added &lt;a href="http://weblog.infoworld.com/udell/"&gt;Jon Udell's InfoWorld blog&lt;/a&gt; RSS feed and will add some others in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-111169159422938940?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://jade.mcli.dist.maricopa.edu/feed/index.php?s=build' title='Rendering RSS/Atom feeds into your web page'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/111169159422938940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=111169159422938940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111169159422938940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/111169159422938940'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/03/rendering-rssatom-feeds-into-your-web.html' title='Rendering RSS/Atom feeds into your web page'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110947716094108770</id><published>2005-02-26T19:47:00.000-08:00</published><updated>2006-11-09T10:42:53.134-08:00</updated><title type='text'>SatNet blocks access to p2p networks</title><content type='html'>Now this one is hard to believe. Ecuadorian ISP &lt;a href="http://www.satnet.net/"&gt;SatNet&lt;/a&gt; is blocking access to certain ports, intentionally preventing users from connecting to P2P networks like Gnutella, FastTrack, etc.&lt;br /&gt;&lt;br /&gt;They charge US$ 125 for a 256 Kbps link and on top of an unsatisfactory product, disastrous customer service and awful tech support, they just won't let users do what they want to with the bandwidth they pay good money for.  You can check &lt;a href="http://www.pesimoservicio.com"&gt;PersimoServicio.com&lt;/a&gt; for testimonials on SatNet's terrible record.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110947716094108770?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110947716094108770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110947716094108770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110947716094108770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110947716094108770'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/02/satnet-blocks-access-to-p2p-networks.html' title='SatNet blocks access to p2p networks'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110835567529186424</id><published>2005-02-13T19:54:00.000-08:00</published><updated>2006-11-09T10:42:53.078-08:00</updated><title type='text'>Sharing iPhoto Library with other users</title><content type='html'>Yes, you are right. I own a &lt;b&gt;Mac&lt;/b&gt;, actually I own 2 and I love &lt;b&gt;Mac OS X&lt;/b&gt;. And I think &lt;b&gt;iLife&lt;/b&gt; is simply fabulous. However, I have always found kind of uncomfortable the fact that &lt;b&gt;iPhoto&lt;/b&gt; keeps a separate photo library for each user in the same computer. This means that my wife and I can not see the same set of pictures when we are logged in using each our corresponding acconts simply because we had separate libraries in our accounts' &lt;i&gt;Pictures Folder&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Determined to solve that problem I found &lt;a href="http://www.bmannconsulting.com/node/701"&gt;one article&lt;/a&gt; and &lt;a href="http://captnswing.net/howto/iphoto/"&gt;another&lt;/a&gt; but the final solution was really simple and it came in the form of a free utility called &lt;a href="http://homepage.mac.com/bwebster/iphotolibrarymanager.html"&gt;&lt;b&gt;iPhoto Library Manager&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This utility created by &lt;a href="http://homepage.mac.com/bwebster/"&gt;&lt;b&gt;Brian Webster&lt;/b&gt;&lt;/a&gt; was originally conceived to improve the organization of pictures by enabling the creation of multiple libraries instead of a single master library. iPhoto Library Manager lets you split your photos up into several libraries, store them in any accesible location, and switch back and forth between them.&lt;br /&gt;&lt;br /&gt;But you can also use it to share a single master iPhoto Library. To do that, you first move your iPhoto Library to the Shared folder in &lt;span lang=ES-TRAD style='font-family:"Courier New"'&gt;/users/shared&lt;/span&gt;. Then you set the permission for the folder so that everybody can read from and write into it. Finally, you have to log in as every different user and launch IPhoto Library Manager, then add the shared library using the "Add Library" button.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110835567529186424?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://homepage.mac.com/bwebster/iphotolibrarymanager.html' title='Sharing iPhoto Library with other users'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110835567529186424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110835567529186424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110835567529186424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110835567529186424'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/02/sharing-iphoto-library-with-other.html' title='Sharing iPhoto Library with other users'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110814757500656964</id><published>2005-02-11T10:39:00.000-08:00</published><updated>2006-11-09T10:42:53.015-08:00</updated><title type='text'>CSLA: Folders as Queues</title><content type='html'>CSLA business objects encapsulate the logic required to create, read, update and delete corresponding records in a database. Client applications don’t have to deal with the implementation of the database (tables, stored procedures, etc.), they just consume the business objects and perform the corresponding CRUD operations on them. These CRUD operations are performed synchronously. However, this approach doesn’t fit all the scenarios.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Our scenario&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;I worked on a project in which the most important business object was a medical report. Now, this report had to be submitted to our servers to be further processed. The processing consisted in an algorithm that evaluated certain conditions; according to the evaluation results several actions were performed which included not only saving the report in the DB, but also generating new sets of objects called Deliverables. There is much more to it, but to keep this article short, let’s assume that the following diagram describes the operations.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/FolderQ1.GIF" /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;One solution could have been to have the client app call Report.Save and then implement the server-side logic in DataPortal_Update. However that didn’t fit our needs because of 4 things:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Semantically, Save means a totally different operation.&lt;/li&gt;&lt;li&gt;The server side actions were prone to constant changes (workflow modifications). We observed that this workflow was independent from the report business object. Therefore, coding the workflow algorithm into the Report’s DataPortal_Update method didn’t make sense.&lt;/li&gt;&lt;li&gt;The actions executed on the server side where time consuming and we just couldn’t afford to use a synchronous call triggered by the client (like the one invoked by Report.Save).&lt;/li&gt;&lt;li&gt;Several users might submit reports at the same time, but the server side operation was time consuming and sometimes processor intensive. We wanted to have control on the number of reports being processed simultaneously (pooling).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/FolderQ2.GIF" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Using MSMQ&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;We immediately considered using MSMQ. The diagram below describes how that would work. The client application would call Report.Submit, which in turn would invoke DataPortal.Update, triggering the execution of DataPortal_Update on the server side. DataPortal_Update could then queue into MSMQ a serialized version of the Report object. The Processing Engine, which runs as a separate process (possibly on a different server box) would constantly poll the queue for pending jobs (reports to be processed). The number of reports processed simultaneously by the Processing Engine can be controlled by the engine itself.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/FolderQ3.GIF" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;The problem with MSMQ&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;As good as it all seemed to be, after experimenting a little with MSMQ we decided that, well… we didn’t like ActiveDirectory’s involvement. We have already had several unpleasant experiences with ActiveDirectory and although I have no hard feelings to it at all, the SysAdmins that will support our solution are just tired of having to deal with it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;The alternative: Folders&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;This is the idea: Instead of using MSMQ to implement queues, I propose the use of the File System. A folder can be considered a queue. A message could be a file in the folder.&lt;br /&gt;The sender (my client application) can serialize an object into a file using SOAP or XML serialization. The receiver (my server app) can constantly poll into the folder. Whenever a file is found in the folder, the receiver deserializes it into the original object and processes it. If more than one file is found, they get processed one at a time, preventing the uncontrolled consumption of resources.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/FolderQ4.GIF" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Disconnected queues&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;A queue is a communication mechanism between disconnected applications. However, using a folder as a queue means that both the sender and the receiving application require to have access to the folder all of the time, which implies that a connection must be granted all of the time.&lt;br /&gt;&lt;br /&gt;A disconnected queue approach can be implemented by using two folders, one acting as a writing end of the queue to be used by the sender application and another one acting as a reading end of the queue used by the receiving application.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/FolderQ5.GIF" /&gt; &lt;br /&gt;&lt;br /&gt;A script can be scheduled to copy files from the In Folder to the Out Folder in a regular basis or whenever a communication channel is open.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The downside&lt;br /&gt;&lt;/strong&gt;It is not for nothing that products like MSMQ exist. The major downside of implementing queues by using the file system is that the administration becomes complicated. Keeping track of in/out folders as well as copying scripts requires some intervention and as the number of queues grows the number of folders and script can become a burden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110814757500656964?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110814757500656964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110814757500656964' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110814757500656964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110814757500656964'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/02/csla-folders-as-queues.html' title='CSLA: Folders as Queues'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110680560702732578</id><published>2005-01-26T21:47:00.000-08:00</published><updated>2006-11-09T10:42:52.953-08:00</updated><title type='text'>Remote Collaboration using Visual SourceSafe</title><content type='html'>Microsoft's &lt;a href="http://msdn.microsoft.com/ssafe/"&gt;&lt;strong&gt;Visual SourceSafe&lt;/strong&gt;&lt;/a&gt; is probably the source control tool most commonly used by VisualStudio .NET developers. It certainly isn't the most complete solution out there, but it has what it takes to support the operations of small and even midsize development groups. I have personally used it for more than 2 years already with a development group that at some point reached the astonishing size of 4 members :)&lt;br /&gt;&lt;br /&gt;Well, I am now in Ecuador but I still keep collaborating with this development team (which is even smaller now) and of course I didn't pretend to keep my source isolated from the company's &lt;em&gt;VSS&lt;/em&gt; database, but there is a problem with VSS: it is not suitable for remote collaboration.&lt;br /&gt;&lt;br /&gt;The problem is the way VSS access it's databases. VSS' databases consist of a set of files organized in different folders in a mysterios and undecipherable way and of course, it means that every developer has to have access to the folder containing these files in order to be able to use VSS together. This works fine in a LAN but when it comes to remote collaboration, it fails misserably. It takes forever to open VSS from my computer here at home and I am taking 1:00 AM Ecuador time with a 256 MB link. Nobody is up at that time so I have the whole ISP's bandwith form me.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;SourceOffSite&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;So I decided that I had to use something else to work together with my team. I remembered I used a product called &lt;a href="http://www.sourcegear.com/sos/index.html"&gt;SourceOffSite&lt;/a&gt; when one of our team members had an accident and had to work from home for a few weeks. &lt;em&gt;SOS&lt;/em&gt; acts as an intermediary between VSS' database and the remote developer; it has a server side and a client side. The &lt;strong&gt;server side&lt;/strong&gt; needs to have access to VSS' database; it opens a TCP service on your port of choce. The &lt;strong&gt;client side&lt;/strong&gt; needs to be installed in every computer that is supposed to work remotely. Well it worked mostly fine but with a few bumps, some messages on the client suggested that some changes needed to be made in the DB in order to be able to work properly. The problem was after we stopped using it (once my friend recovered and was able to go to the office). Some projects had been modified in such a way that everytime they were opened certain solutions, the solution files (.sln) had to be checkedout. No changes were made whatsoever, but it was annoying to say the least. The good thing however is that licences are &lt;strong&gt;only required for clients working remotely&lt;/strong&gt;, local users could keep accessing the database locally and using VSS which they were already used to. Another good thing about SOS is that it &lt;strong&gt;integrates nicely into VS .NET&lt;/strong&gt; and it works way faster on remote computers than using plan VSS.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;VSS Archives&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;But I didn't want to risk losing control on the source by giving up control to that middle guy (SOS) so I tryied working on my local copy of the source database. First I made a copy of the database (plan copy) to my local computer, of course I had to do it at night when I wouldn't disturb anybody in the office. Then, working on my local copy I checked out the files that I needed to modify, checked in the changes and then made an archive only of the project that I had modified using VSS' Admin utility.&lt;br /&gt;&lt;br /&gt;The archive is a single file with a &lt;strong&gt;.SSA extension&lt;/strong&gt;. One archive file can back up many projects and can be made for a specific version or can also include all the changes made to the code.&lt;br /&gt;&lt;br /&gt;Then I copied the archive file into one of my former office computer (it's still there and I use it regularly through VNC). Then using VNC I connected to that computer and restored the archive I had made into the office's code database. Of course I first made backups (plan copy) of the local database before I restored, just in case. And everything went fine... and it has worked properly several times already.&lt;br /&gt;&lt;br /&gt;The downside of doing this is that now I have to coordinate with the rest of the team so that nobody else checkout the project(s) I am working on at a given time. But that is fine for me, since it is a very small team now and I work almost exclusively in the same projects.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Other options&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;For those that like re-engineering (that extreme-sports-like if-it's-not-broken-break-it approach), switching to a different source control tool is an option. There is the &lt;a href="http://www.cvsnt.com/cvspro/"&gt;&lt;strong&gt;CVS&lt;/strong&gt;&lt;/a&gt; which is an open source solution. There is a &lt;a href="http://cvssccplugin.sourceforge.net/"&gt;&lt;strong&gt;plug-in&lt;/strong&gt;&lt;/a&gt; that allows you to access it directly from Visual Studio.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110680560702732578?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110680560702732578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110680560702732578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110680560702732578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110680560702732578'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/01/remote-collaboration-using-visual.html' title='Remote Collaboration using Visual SourceSafe'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110584079155720323</id><published>2005-01-15T17:38:00.000-08:00</published><updated>2006-11-09T10:42:52.891-08:00</updated><title type='text'>Missing reference to StdFormat</title><content type='html'>&lt;span style="font-size:100%;"&gt;For some reason my &lt;strong&gt;VB .NET 2002&lt;/strong&gt; project started showing an error in the reference to StdFormat after installing a service pack (&lt;strong&gt;SP3&lt;/strong&gt;) update to the framework. I expected to find this assembly registered in the GAC, but it wasn't there. Nor was there any StdFormat.dll in my system. There was however a Microsoft.StdFormat.dll under a folder called &lt;strong&gt;Primary Interop Assemblies&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Well, it turned I was looking in the wrong tab in the Add Reference window according to &lt;a href="http://www.hanselman.com/blog/PermaLink.aspx?guid=331"&gt;this blog&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;&lt;em&gt;"...when referencing your PIAs in Visual Studio.NET via "Add Reference..." you won't find your PIA in the .NET Tab as some may think. Just select the original COM TLB/DLL reference from the COM Tab and Visual Studio will silently search for and use the PIA. You can confirm this by looking at the added reference in the Properties Toolbox and confirming that it's strongly named."&lt;/em&gt;&lt;/blockquote&gt;&lt;/em&gt;&lt;p&gt;The blog is also illustrative on what PIAs are and how they work. Everytime I think I finally have a good grip on the framework something happens that convinces me otherwise :)&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110584079155720323?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.hanselman.com/blog/PermaLink.aspx?guid=331' title='Missing reference to StdFormat'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110584079155720323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110584079155720323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110584079155720323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110584079155720323'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/01/missing-reference-to-stdformat.html' title='Missing reference to StdFormat'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110577056177297213</id><published>2005-01-14T22:20:00.000-08:00</published><updated>2006-11-09T10:42:52.833-08:00</updated><title type='text'>Problem Referencing Managed DirectX Assemblies</title><content type='html'>I had a problem adding references to managed DirectX Assemblies from VS.NET 2002. After working for days trying to fix this problem I came upon &lt;a href="http://www.dotnetforums.net/showthread.php?t=87678"&gt;these message board &lt;/a&gt;containing the following instructions:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;1) Go to the directory where you extracted the SDK Setup files, and then go&lt;br /&gt;to:&lt;br /&gt;Developer Runtimes Managed DirectX Debug (or retail if you want) and&lt;br /&gt;run the short setup file there&lt;br /&gt;&lt;br /&gt;2) Open Regedit(Start run "Regedit")&lt;br /&gt;Navigate to&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.1\AssemblyFolders\Right&lt;br /&gt;clikc the "AssemblyFolders" Icon and select New Keyname it&lt;br /&gt;DirectXAssemblies&lt;br /&gt;&lt;br /&gt;3) go to the DirectXAssemblies folder and double click the key in there&lt;br /&gt;which says "(default)" and type in the path to your DLLs:&lt;br /&gt;C:\WINDOWS\Microsoft.NET\Managed DirectX\v9.02.2904&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;be sure that this path exists.. my friend had 9.02.2902 for some reason&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;Well, I had to do the extra work of actually copying the DLLs to that folder, as the setup program didn't do it and yes, IT WORKED! Hope this is useful to other people.&lt;br /&gt;&lt;br /&gt;Rafael.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110577056177297213?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dotnetforums.net/showthread.php?t=87678' title='Problem Referencing Managed DirectX Assemblies'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110577056177297213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110577056177297213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110577056177297213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110577056177297213'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/01/problem-referencing-managed-directx.html' title='Problem Referencing Managed DirectX Assemblies'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110523697212115187</id><published>2005-01-08T18:14:00.000-08:00</published><updated>2006-11-09T10:42:52.774-08:00</updated><title type='text'>An Admin Utility for my .NET Windows Service</title><content type='html'>The&lt;strong&gt; .NET framework&lt;/strong&gt; includes a &lt;strong&gt;&lt;span style="font-family:courier new;"&gt;ServiceController&lt;/span&gt;&lt;/strong&gt; component which allows you to Start and Stop &lt;strong&gt;Windows Services&lt;/strong&gt;. In addition to that it also enables the sending of non-parameterized commands which can be programmed to trigger a specific action on a running Windows Service. This article explores one way of using a &lt;span style="font-family:courier new;"&gt;ServiceController&lt;/span&gt; to create an &lt;strong&gt;Administrative Utility&lt;/strong&gt; for a Windows Service.&lt;br /&gt;&lt;br /&gt;I won’t explain how to develop a Windows Service but rather expose the approach I use to develop Administrative Utilities for my Windows Services; for a tutorial on how to build a Windows Service &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconcreatingntserviceapplications.asp"&gt;click here&lt;/a&gt;. For a tutorial on how to use &lt;strong&gt;XML serialization&lt;/strong&gt; &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlserializationxmlserializerclasstopic.asp"&gt;click here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Architecture&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;This article builds on a &lt;a href="http://ghostspook.blogspot.com/2004/12/easier-way-for-testing-windows.html"&gt;previous one &lt;/a&gt;in which I propose the use of an architecture based on a Class that encapsulates the required functionality. While we are going to assume that such architecture is going to be used, this is not necessarily required and the discussion is still valid for a Windows Service that is implemented using a different architecture.&lt;br /&gt;&lt;br /&gt;The architectural approach for the interaction between the Admin Utility and the Windows Service is described in the following UML diagram:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/AdminUtility4WinService.GIF" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;In the previous diagram MyWinService represents the Windows Service in question. Notice that it acts only as a host for MyServer. MyServer is the class that actually implements the functionality required. Typically MyServer will have to interact with other more specific classes. AdminUtility is a WinForms application that communicates indirectly with MyWinService; for this communication to take place, two things are required:&lt;br /&gt;&lt;br /&gt;- A ServiceController component, and&lt;br /&gt;- A persisted ServerSettings object&lt;br /&gt;&lt;br /&gt;ServerSettings is a class whose attributes are the parameters for the configuration of the Windows Service. It is serialized into an XML (not SOAP) file, therefore serving the purposes of a configuration file. The use of XML serialization instead of SOAP serialization simplify the task of adding new parameters –data members- to the ServiceController class and keep backwards compatibility of the configuration file. ServerSettings’ attributes are all public and it only contains two methods which are used to write to and read from the XML file (settings persistence).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Assemblies&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;Service Settings are communicated from the Admin Utility to MyServer through a ServerSettings object which is serialized by AdminUtility and then deserialized by the Windows Service in a location in the file system that is well-known to both. Since this ServiceSettings object has to be used by both Admin Utility and the Windows Service, it is better to implement it in a separate project, within a class library assembly (Settings.DLL).&lt;br /&gt;&lt;br /&gt;The Windows Service and AdminUtility have to be implemented in different projects, one Windows Forms Application and a Windows Service Application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/AdminUtility4WinService2.GIF" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Performance considerations&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;As mentioned before, MyServer can have more dependencies that are specific to the implementation of the required functionality. However, these dependencies don’t have to be interpreted as dependencies at a binary level in the form of Referenced DLLs. Loading and releasing assemblies on demand can be a consuming task that takes memory and processor speed.&lt;br /&gt;&lt;br /&gt;Windows Services are expected to be very responsive and their resources usage should be rather light. Therefore, the developer should find a compromise between using many additional DLLs to achieve loosely coupling and guarantee a good performance.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;OnStart and OnStop&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;ServiceBase defines two protected methods that the developer can use to initialize and terminate the service. These methods are invoked by the system when the service is started and stopped respectively and in that sense they can be considered for any practical purpose as event handlers although they don’t implement any Delegate or Event signature.&lt;br /&gt;&lt;br /&gt;The OnStart event is invoked when the service is started and should be used to instantiate, initialize and start the objects and threads that are required. Ideally, all the initialization code can be encapsulated in MyServer.&lt;br /&gt;&lt;br /&gt;The OnStop event in its turn should be used to stop any running threads and release any resource used by the service. The following UML diagram depicts the OnStart and OnStop sequence of events:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://homepage.mac.com/pcastill/GSHM/images/AdminUtility4WinService3.GIF"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/AdminUtility4WinService3_t.GIF" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;The code within the OnStart and OnStop methods can be as simple as this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Protected Overrides Sub OnStart(ByVal args() As String)&lt;br /&gt;Dim MySettings As ServerSettings = ReadSettings()&lt;br /&gt;_myServer = New MyServer()&lt;br /&gt;_myServer.LoadSettings(MySettings)&lt;br /&gt;_myServer.StartServer()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Protected Overrides Sub OnStop()&lt;br /&gt;_myServer.StopServer()&lt;br /&gt;_myServer = Nothing&lt;br /&gt;End Sub &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Serializing and Deserializing the Settings&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;On the Windows Service, the ReadSettings method deserializes the XML file into a ServerSettings object; one good location for saving this XML file is the System Folder:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Private Function ReadSettings() As ServerSettings&lt;br /&gt;Dim Result As ServerSettings&lt;br /&gt;Dim Path As String&lt;br /&gt;Path = Environment.SystemDirectory &amp; _&lt;br /&gt;"\" &amp;amp; "MyServerSettings.xml"&lt;br /&gt;If IO.File.Exists(Path) Then&lt;br /&gt;Result = ServerSettings.GetFromFile(Path)&lt;br /&gt;Else 'load default settings&lt;br /&gt;Result = New ServerSettings()&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Return Result&lt;br /&gt;End Function&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;On the Admin Utility, the serialization consists of performing the inverse process, but this time using MySettings’ PersitAsFile method. ServerSettings GetFromFile and PersistAsFile methods are really simple to implement:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Public Shared Function GetFromFile(ByVal filePath As String) As ServerSettings&lt;br /&gt;Dim MyStream As New IO.FileStream(filePath, IO.FileMode.Open, _&lt;br /&gt;IO.FileAccess.Read)&lt;br /&gt;Dim MySettings As New ServerSettings()&lt;br /&gt;Dim MySerializer As _&lt;br /&gt;New XmlSerializer(MySettings.GetType)&lt;br /&gt;MySettings = CType(MySerializer.Deserialize(MyStream), ServerSettings)&lt;br /&gt;MyStream.Close()&lt;br /&gt;Return MySettings&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Public Sub PersistAsFile(ByVal filePath As String)&lt;br /&gt;Dim MyStream As New IO.FileStream(filePath, IO.FileMode.Create, _&lt;br /&gt;IO.FileAccess.Write)&lt;br /&gt;Dim MySerializer As New XmlSerializer(Me.GetType)&lt;br /&gt;MySerializer.Serialize(MyStream, Me)&lt;br /&gt;MyStream.Close()&lt;br /&gt;End Sub&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sometimes the Settings of the Windows Service need to be modified without ever stopping the Service. The ServiceController’s ExecuteCommand method offers a mechanism to send a numeric command to the windows service from the AdminUtility whenever an update on the settings is performed:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Private Sub cmdApply_Click(ByVal sender As System.Object, _&lt;br /&gt;ByVal e As System.EventArgs) Handles cmdApply.Click&lt;br /&gt;Dim Path As String&lt;br /&gt;Path = Environment.SystemDirectory &amp; _&lt;br /&gt;"\" &amp;amp; " MyServerSettings.xml"&lt;br /&gt;&lt;br /&gt;UpdateSettingsObject() 'copy controls content to _settings&lt;br /&gt;_settings.PersistAsFile(Path)&lt;br /&gt;&lt;br /&gt;If ctlServiceController.Status = _&lt;br /&gt;ServiceControllerStatus.Running Then&lt;br /&gt;ctlServiceController.ExecuteCommand(128)&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In the Admin Utility _settings is a ServerSettings data member. And ctlServiceController is an instance of the ServiceController component. ExecuteCommand sends a system request for the Windows Service’s OnCustomCommand method:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Protected Overrides Sub OnCustomCommand(ByVal command As Integer)&lt;br /&gt;If command = 128 Then&lt;br /&gt;UpdateSettings()&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub UpdateSettings()&lt;br /&gt;Dim MySettings As ServerSettings = ReadSettings()&lt;br /&gt;_myServer.ApplyNewSettings(MySettings)&lt;br /&gt;End Sub&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The ApplyNewSettings and LoadSettings methods are not necessarily identical, since the first one is expected to be executed while the Windows Service is running and the latter is called at start up.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;More possibilities&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;There are as many solutions to a problem as problem solvers. The approach proposed above is only one and it uses a limited set of possibilities provided by the .NET Framework. One of the biggest limitations imposed when using the XML is that the Administrative Utility has to run in the same box as the Windows Service.&lt;br /&gt;&lt;br /&gt;Other possibilities available include the use of .NET Remoting; this option provides an almost unlimited level of control on the running service and can potentially eliminate the use of the XML file opening a chance to manage service remotely.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110523697212115187?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110523697212115187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110523697212115187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110523697212115187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110523697212115187'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2005/01/admin-utility-for-my-net-windows.html' title='An Admin Utility for my .NET Windows Service'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110439414261538389</id><published>2004-12-30T01:02:00.000-08:00</published><updated>2006-11-09T10:42:52.648-08:00</updated><title type='text'>An Easier Way for Testing Windows Services</title><content type='html'>One of the most challenging tasks when developing &lt;strong&gt;Windows Services&lt;/strong&gt; is testing and debugging. Don’t get me wrong, I think that VS .NET does a wonderful job in helping developers debug their applications, but the very nature of Windows Services introduces some complexity to the task. Two of the proposed approaches consist in &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskdebuggingserviceapplications.asp"&gt;adding a delay&lt;/a&gt; to the &lt;span style="font-family:courier new;"&gt;OnStart()&lt;/span&gt; method, and the use of the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskdebuggingserviceapplications.asp"&gt;EventLog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These methods are helpful and useful; however, I think I have found one technique that can be considerably helpful for debugging. I hope it will also be useful to others. It is simple and consists basically in encapsulating the service code in an independent class.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h4&gt;Encapsulating the Service functionality&lt;/h4&gt;&lt;br /&gt;Every Windows Service project starts with a class that inherits from &lt;strong&gt;ServiceBase&lt;/strong&gt;. Although it is totally possible to implement the functionality of a windows service within this class, it is not&lt;br /&gt;advisable. It is better to do it in a separate class.&lt;br /&gt;&lt;br /&gt;I call this class the &lt;strong&gt;Server&lt;/strong&gt;. The class inheriting from &lt;em&gt;ServiceBase&lt;/em&gt; acts only as a &lt;strong&gt;host&lt;/strong&gt; of the &lt;em&gt;Server&lt;/em&gt; by instantiating it on the&lt;span style="font-family:courier new;font-size:85%;"&gt; &lt;span style="font-family:courier new;font-size:100%;"&gt;OnStart()&lt;/span&gt;&lt;/span&gt; method and “releasing” it on the &lt;span style="font-family:courier new;"&gt;OnStop()&lt;/span&gt; method. This makes for a cleaner and more encapsulated code, but most importantly it enables the developer to test the &lt;em&gt;Server&lt;/em&gt; in a richer way by hosting it in a Testing Form (&lt;strong&gt;TestForm&lt;/strong&gt;).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/EasyTestWinServices1.GIF" /&gt;&lt;br /&gt;&lt;br /&gt;It is easier to debug the &lt;em&gt;Server&lt;/em&gt; functionality when it is embedded in a WinForms application. The UI interface of &lt;em&gt;TestForm&lt;/em&gt; can be as simple as this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/EasyTestWinServices2.GIF" /&gt;&lt;br /&gt;&lt;br /&gt;The StartStopButton invokes &lt;span style="font-family:courier new;"&gt;OnStart()&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;OnStop()&lt;/span&gt; methods depending on the status:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Private Sub StartStopButton_Click(ByVal sender As&lt;br /&gt;System.Object, _&lt;br /&gt;ByVal e As System.EventArgs) _&lt;br /&gt;Handles StartStopButton.Click&lt;br /&gt;&lt;br /&gt;If StartStopButton.Text =&lt;br /&gt;"Start" Then&lt;br /&gt;OnStart()&lt;br /&gt;StartStopButton.Text = "Stop"&lt;br /&gt;Else&lt;br /&gt;OnStop()&lt;br /&gt;StartStopButton.Text = "Start"&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This way, &lt;em&gt;TestForm’s&lt;/em&gt; implementation of &lt;span style="font-family:courier new;"&gt;OnStart()&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;OnStop()&lt;/span&gt; can be identical to the ones required in the class that inherits from &lt;em&gt;ServiceBase&lt;/em&gt; (&lt;strong&gt;MyWinService&lt;/strong&gt;). For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Private Sub OnStart()&lt;br /&gt;_serverObj = New MyServer()&lt;br /&gt;_serverObj.LoadSettings(ReadSettings())&lt;br /&gt;_serverObj.Start()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub OnStop()&lt;br /&gt;_serverObj.StopWatcher()&lt;br /&gt;_serverObj = Nothing&lt;br /&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Something similar can be applied to the UpdateSettingsButton.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110439414261538389?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110439414261538389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110439414261538389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110439414261538389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110439414261538389'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/12/easier-way-for-testing-windows.html' title='An Easier Way for Testing Windows Services'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110329531570904097</id><published>2004-12-17T06:36:00.000-08:00</published><updated>2006-11-09T10:42:52.594-08:00</updated><title type='text'>FolderBrowser</title><content type='html'>&lt;strong&gt;FolderBrowser&lt;/strong&gt; consists of a dialog box that allows the user to browse the file system and select a folder from it.  It is different to .NET's &lt;strong&gt;OpenFileDialog&lt;/strong&gt;, which is intended to do the same for files instead of folders.  The solution contains two projects: &lt;strong&gt;FolderBrowser&lt;/strong&gt; (which compiles to FolderBrowser.dll) and &lt;strong&gt;FolderBrowserTester&lt;/strong&gt; (that compiles to Tester.exe).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/FolderBrowser.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;It requires VS .NET 1.0 (I suppose it works fine with newer versions). To get the zip file with the code and compiled assemblies &lt;a href="http://homepage.mac.com/pcastill/GSHM/downloads/FolderBrowser.zip"&gt;&lt;strong&gt;click here&lt;/strong&gt;&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110329531570904097?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://homepage.mac.com/pcastill/GSHM/downloads/FolderBrowser.zip' title='FolderBrowser'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110329531570904097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110329531570904097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110329531570904097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110329531570904097'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/12/folderbrowser.html' title='FolderBrowser'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110254068314294855</id><published>2004-12-08T13:07:00.000-08:00</published><updated>2006-11-09T10:42:52.538-08:00</updated><title type='text'>IIS_default.htm6 missing when adding IIS to XP</title><content type='html'>I have &lt;strong&gt;Windows XP Pro in Spanish&lt;/strong&gt; and needed to install &lt;strong&gt;IIS&lt;/strong&gt;. I had a &lt;em&gt;Windows XP Pro English&lt;/em&gt; disk handy and I thought that maybe that would make it. Well, it didn't; but the curious thing is that instead of getting a "Wrong language version" message, I got a &lt;strong&gt;missing file&lt;/strong&gt; dialog box prompting for a Windows XP installation disk at about 70% into the installation process. The missing filename was IIS_default.htm6.&lt;br /&gt;&lt;br /&gt;Later I found the installation disk of the spanish version and it worked fine. Doing a search on the Internet I found no reference to this by anybody else, except for &lt;a href="http://www.forum-microsoft.org/ftopic34357.html"&gt;some guys from France&lt;/a&gt;. I presume they were using the wrong version too.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110254068314294855?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110254068314294855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110254068314294855' title='39 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110254068314294855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110254068314294855'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/12/iisdefaulthtm6-missing-when-adding-iis.html' title='IIS_default.htm6 missing when adding IIS to XP'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>39</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110240032933471870</id><published>2004-12-06T21:52:00.000-08:00</published><updated>2006-11-09T10:42:52.456-08:00</updated><title type='text'>TV Cable-SatNet broadband Internet stinks</title><content type='html'>It is 1 AM local time (Ecuador) and the data transfer rate I get from my ISP, &lt;a href="http://www.satnet.net/"&gt;TVCable-SatNet&lt;/a&gt;,  is pretty good. But that will change tomorrow, around 9 and 10 AM.  The rate goes down 6 times and sometimes even more! Really bad for Internet via Cable modem.  I have &lt;a href="http://www.satnet.net/frame.php?cuerpo=html/servicios/cablemodemnocorporativo.htm"&gt;the "best" plan&lt;/a&gt; that offers 256/128 Kbps and costs US$ 125&lt;br /&gt;&lt;br /&gt;Obviously they haven't hired enough bandwith to satisfy the number of clients that they have. I have heard good comments about Ecuador-Telecom. Maybe I will try it. I will give TVCable a few more weeks and if it doesn't deliver (looks like it won't) I will switch.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110240032933471870?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.satnet.net/frame.php?cuerpo=html/servicios/cablemodemnocorporativo.htm' title='TV Cable-SatNet broadband Internet stinks'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110240032933471870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110240032933471870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110240032933471870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110240032933471870'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/12/tv-cable-satnet-broadband-internet.html' title='TV Cable-SatNet broadband Internet stinks'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110234750065998765</id><published>2004-12-06T07:19:00.000-08:00</published><updated>2006-11-09T10:42:52.389-08:00</updated><title type='text'>Mounting ISO files (disk images) in WinXP</title><content type='html'>When I download an &lt;strong&gt;ISO-9660&lt;/strong&gt; image, I proceed to burn it in a disk using Nero or some other utilities, but sometimes all I need is to obtain something quickly from the download and spending a CD in it is a waste. There are several utilities that let you mount/extract files from a disk image, but &lt;a href="http://www.microsoft.com"&gt;Microsoft &lt;/a&gt;is offering one free unsupported utility called &lt;strong&gt;Virtual CD-ROM Control Panel&lt;/strong&gt; that can mount an image file as a &lt;strong&gt;Windows XP&lt;/strong&gt; drive.&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe"&gt;link&lt;/a&gt; to the self-extracting file.&lt;br /&gt;&lt;br /&gt;It contains 3 files: A driver, an executable utility and a readme file. Following I am quoting the readme file:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Readme for Virtual CD-ROM Control Panel v2.0.1.1&lt;br /&gt;&lt;br /&gt;THIS TOOL IS UNSUPPORT BY MICROSOFT PRODUCT SUPPORT SERVICES&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;System Requirements&lt;br /&gt;===================&lt;br /&gt;- Windows XP Home or Windows XP Professional&lt;br /&gt;&lt;br /&gt;Installation instructions&lt;br /&gt;=========================&lt;br /&gt;1. Copy VCdRom.sys to your %systemroot%\system32\drivers folder.&lt;br /&gt;2. Execute VCdControlTool.exe&lt;br /&gt;3. Click "Driver control"&lt;br /&gt;4. If the "Install Driver" button is available, click it. Navigate to&lt;br /&gt;the %systemroot%\system32\drivers folder, select VCdRom.sys, and click&lt;br /&gt;Open.&lt;br /&gt;5. Click "Start"&lt;br /&gt;6. Click OK&lt;br /&gt;7. Click "Add Drive" to add a drive to the drive list. Ensure that the&lt;br /&gt;drive added is not a local drive. If it is, continue to click "Add&lt;br /&gt;Drive" until an unused drive letter is available.&lt;br /&gt;8. Select an unused drive letter from the drive list and click "Mount".&lt;br /&gt;9. Navigate to the image file, select it, and click "OK". UNC naming&lt;br /&gt;conventions should not be used, however mapped network drives should be&lt;br /&gt;OK.&lt;br /&gt;&lt;br /&gt;You may now use the drive letter as if it were a local CD-ROM device.&lt;br /&gt;When you are finished you may unmount, stop, and remove the driver from&lt;br /&gt;memory using the driver control.&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110234750065998765?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe' title='Mounting ISO files (disk images) in WinXP'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110234750065998765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110234750065998765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110234750065998765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110234750065998765'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/12/mounting-iso-files-disk-images-in.html' title='Mounting ISO files (disk images) in WinXP'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-110213600120629318</id><published>2004-12-03T20:46:00.000-08:00</published><updated>2006-11-09T10:42:52.263-08:00</updated><title type='text'>Back in Ecuador</title><content type='html'>I have been quite busy moving back to my country, Ecuador. Which is why I haven't posted anything lately. Stariting next week I intend to make up for that.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-110213600120629318?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/110213600120629318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=110213600120629318' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110213600120629318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/110213600120629318'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/12/back-in-ecuador.html' title='Back in Ecuador'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109910819266101219</id><published>2004-10-29T20:34:00.000-07:00</published><updated>2006-11-09T10:42:52.137-08:00</updated><title type='text'>PanelViews</title><content type='html'>A while ago I started working on a project for which I wanted to implement a user interface similar to the one used by &lt;span style="font-weight: bold;"&gt;MS Outlook&lt;/span&gt;. The defining elements are: &lt;span style="font-weight: bold;"&gt;Toolbar&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Navigation bar&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;status bar&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;menu &lt;/span&gt;and the &lt;span style="font-weight: bold;"&gt;work area&lt;/span&gt;, which is how I call the part of the UI that changes as the user moves to different &lt;span style="font-weight: bold;"&gt;“views”&lt;/span&gt;, like the Calendar view, Email view, Contacts view, etc.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/PanelViews5.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I found two great products developed by &lt;span style="font-weight: bold;"&gt;Tim Dawson&lt;/span&gt; that were free and consisted of fully managed code: &lt;a href="http://www.divil.co.uk/net/controls/outlookbar/"&gt;OutlookBar &lt;/a&gt;and &lt;a href="http://www.divil.co.uk/net/controls/dotnetwidgets/"&gt;DotNetWidgets&lt;/a&gt;. These components provided me with all the elements that I needed, except for the work area.&lt;br /&gt;&lt;br /&gt;That’s how I ended up developing my own solution to this problem which I named &lt;span style="font-weight: bold;"&gt;PanelViews&lt;/span&gt;. Ok, I admit it, it is not the best name I could come up with; after all, I didn’t use Panels or ListView controls of any kind. I will spare you the rhetoric, this is what PanelViews is:&lt;br /&gt;&lt;br /&gt;·    It is a small &lt;span style="font-weight: bold;"&gt;framework &lt;/span&gt;to assist you in the development of Outlook-like GUIs.&lt;br /&gt;·    It is implemented using custom controls, two actually: &lt;span style="font-weight: bold;"&gt;ViewBase &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;ViewContainer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/PanelViews1.gif" /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Every &lt;span style="font-style: italic;"&gt;custom view&lt;/span&gt; (Calendar view, for example) is implemented by an &lt;span style="font-style: italic;"&gt;Inherited Control&lt;/span&gt;, that inherits from &lt;span style="font-family:courier new;"&gt;ViewBase&lt;/span&gt;. That means that the programmer can use the designer to place other elements like textboxes, lists, etc in the same way as he/she would do it in a Windows Form.&lt;br /&gt;&lt;br /&gt;There most be one form, let’s call it &lt;span style="font-weight: bold;font-family:courier new;"&gt;MainForm&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;. MainForm &lt;/span&gt;must contain one &lt;span style="font-family:courier new;"&gt;ViewContainer &lt;/span&gt;object and should programmatically load the &lt;span style="font-style: italic;"&gt;views &lt;/span&gt;as it needs them using &lt;span style="font-family:courier new;"&gt;ViewContainer&lt;/span&gt;’s &lt;span style="font-family:courier new;"&gt;LoadView &lt;/span&gt;method. &lt;span style="font-style: italic;"&gt;Views &lt;/span&gt;can be loaded all at start up or by demand, as they are needed. To display a loaded &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;, use the &lt;span style="font-family:courier new;"&gt;SetActiveView &lt;/span&gt;method.&lt;br /&gt;&lt;br /&gt;I am publishing &lt;span style="font-style: italic;"&gt;PanelViews &lt;/span&gt;along with a &lt;span style="font-weight: bold;"&gt;PanelView Demo&lt;/span&gt;, a Windows Form that serves as a sample of what can be done and as a tutorial on how to do it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; PanelView Demo&lt;/span&gt; contains 3 views: &lt;span style="font-weight: bold;font-family:courier new;"&gt;SecurityView&lt;/span&gt;,&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;FileView&lt;/span&gt; &lt;/span&gt;and &lt;span style="font-weight: bold;font-family:courier new;"&gt;WebsiteView&lt;/span&gt;. Every view is a custom control that inherits from &lt;span style="font-family:courier new;"&gt;ViewBase&lt;/span&gt;. &lt;span style="font-family:courier new;"&gt;WebsiteView &lt;/span&gt;also holds a browser object.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/PanelViews4.gif" /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There are two forms: &lt;span style="font-weight: bold;font-family:courier new;"&gt;MainForm &lt;/span&gt;and &lt;span style="font-weight: bold;font-family:courier new;"&gt;AboutForm&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MainForm contains a &lt;span style="font-family:courier new;"&gt;ViewContainer &lt;/span&gt;object. This object acts as a broker of &lt;span style="font-style: italic;"&gt;Views &lt;/span&gt;as well as the trigger for the &lt;span style="font-family:courier new;"&gt;ViewLoadEvent, ViewUnloadEvent, ViewActivatedEvent, ViewDeactivatedEvent&lt;/span&gt;, which are events common to all the &lt;span style="font-style: italic;"&gt;views&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/PanelViews2.gif" /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Custom views&lt;/span&gt; communicate with &lt;span style="font-family:courier new;"&gt;MainForm &lt;/span&gt;via &lt;span style="font-weight: bold;"&gt;Events&lt;/span&gt;. Every view is responsible of triggering its own custom events. &lt;span style="font-family:courier new;"&gt;MainForm &lt;/span&gt;communicates messages to the &lt;span style="font-style: italic;"&gt;views &lt;/span&gt;through the views’ &lt;span style="font-weight: bold;"&gt;public methods&lt;/span&gt;. Due to this, &lt;span style="font-style: italic;"&gt;Views &lt;/span&gt;are very loosely coupled and can be implemented in separate assemblies opening the possibility of sharing &lt;span style="font-weight: bold;"&gt;common views&lt;/span&gt; on different Windows Form Projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;PanelViews &lt;/span&gt;can be used, copied and modified freely, no licensing required whatsoever. Maybe mentioning my name in your app would be cool, but still not a requirement. To downlaod PanelViews and PanelView Demo, &lt;a href="http://homepage.mac.com/pcastill/GSHM/images/PanelViews.zip" style="font-weight: bold;"&gt;click here&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109910819266101219?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://homepage.mac.com/pcastill/GSHM/images/PanelViews.zip' title='PanelViews'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109910819266101219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109910819266101219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109910819266101219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109910819266101219'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/10/panelviews.html' title='PanelViews'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109830991650440535</id><published>2004-10-20T14:49:00.000-07:00</published><updated>2006-11-09T10:42:52.079-08:00</updated><title type='text'>The case for CSLA.Security attributes</title><content type='html'>&lt;span style="font-size:100%;"&gt;There is a &lt;a href="http://groups.msn.com/CSLANET/general.msnw?action=get_message&amp;mview=0&amp;amp;ID_Message=12996"&gt;new discussion&lt;/a&gt; on the &lt;a href="http://www.lhotka.net/ArticleIndex.aspx?area=CSLA%20.NET"&gt;CSLA&lt;/a&gt; &lt;a href="http://groups.msn.com/CSLANET/"&gt;community &lt;/a&gt;based on a proposal for implementing attributes that could simplify security checks. Here is a transcription of my post regarding this:&lt;br /&gt;&lt;br /&gt;Ben and Selersd. I think that a combination of your approaches would be right on the spot. Ben, your idea of using &lt;span style="font-weight: bold;"&gt;declarative attributes &lt;/span&gt;on &lt;span style="font-style: italic;"&gt;DataPortal &lt;/span&gt;methods would simplify our task at development time. Now, Selersd idea of allowing to change the security checks by the means of the &lt;span style="font-weight: bold;"&gt;config file&lt;/span&gt; would also make our lifes easier, as it would make this an administrative task instead of a developer task. The ideal scenario would be to come up with something that is at the same time simple and flexible.&lt;br /&gt;&lt;br /&gt; How about using the following attributes as suggested by Ben to set the roles that have granted permission on a particular &lt;span style="font-family: courier new;"&gt;DataPortal_xxx&lt;/span&gt; method:&lt;br /&gt;&lt;/span&gt;  &lt;span style="font-family: courier new;font-size:100%;"&gt;PermissionAllow(&lt;span style="font-style: italic;"&gt;roleName&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;PermissionDeny(&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;font-size:100%;"&gt;roleName&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;, and also use the following attributes to determine if the method's security declaratives can be "overriden" by settings stablished in the .config file:&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; PermissionCustomEnable()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; Permission&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Custom&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt;Disable()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These attributes can be grouped under the CSLA.Security namespace.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Now, we most take a few things into consideration:&lt;br /&gt;&lt;/span&gt; &lt;ol&gt;   &lt;li&gt;&lt;span style="font-size:100%;"&gt; Only one of the &lt;span style="font-family: courier new;"&gt;PermissionAllow &lt;/span&gt;or &lt;span style="font-family: courier new;"&gt;PermisionDeny &lt;/span&gt;attributes can be used on any particular method.&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="font-size:100%;"&gt; Only one of the &lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;PermissionCustomEnable&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;or&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Permission&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Custom&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt;Disable&lt;/span&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;attributes can be used in any particular method.&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="font-size:100%;"&gt; By default, if no security customization attribute is declared, &lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Permission&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Custom&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Disable  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;should apply. This would be a security meassure that sacrifices flexibility in exchange for security.&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style="font-size:100%;"&gt; Programmatic adds to declarative security. It is not overriden.&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;span style="font-size:100%;"&gt;&lt;br /&gt;For example, the following code would enable only "Manager" users to update the business object:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; &amp;lt;PermissionAllow("Manager")&amp;gt; _&lt;/span&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Protected Overrides Sub DataPortal_Update()&lt;br /&gt;&lt;/span&gt; &lt;span style="font-size:100%;"&gt;&lt;br /&gt;this would be equivalent to the snippet above:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt; &amp;lt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;PermissionAllow("Manager"), PermissionCustom&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Disable&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;()&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt; _&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; Protected Overrides Sub DataPortal_Update()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this other sample, we prevent "Sales" users from creating a new business object, but enable further customization through the means of the config file:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt; &amp;lt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;PermissionDeny("Sales"), PermissionCustom&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;Enable&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;()&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt; _&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; Protected Overrides Sub DataPortal_Create(ByVal Criteria As Object)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-size:100%;"&gt;&lt;br /&gt;The entries in the .config file can be something like this:&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;add key="PA:Product.DataPortal_Create" value="Manager"/&lt;/span&gt;&lt;span style="font-family: courier new;font-size:100%;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt;  &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;that would mean that "Manager" users are the only ones enabled to create new products.  You get the point.&lt;br /&gt;&lt;br /&gt;May be we need to work a bit on the config file. For instance, how would we define using the config file that two different roles have permissions allowed (&lt;span style="font-family: courier new;"&gt;PA&lt;/span&gt;) or denied (&lt;span style="font-family: courier new;"&gt;PD&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;But I think we may have something here.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109830991650440535?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109830991650440535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109830991650440535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109830991650440535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109830991650440535'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/10/case-for-cslasecurity-attributes.html' title='The case for CSLA.Security attributes'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109779519620004833</id><published>2004-10-14T16:02:00.000-07:00</published><updated>2006-11-09T10:42:51.962-08:00</updated><title type='text'>CSLA- based Software Update (Part I) </title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;The Case For a Software Update Mechanism Based On &lt;/strong&gt;&lt;a href="http://www.lhotka.net/ArticleIndex.aspx?area=CSLA%20.NET"&gt;&lt;strong&gt;CSLA .NET&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In his &lt;a href="http://www.apress.com/book/bookDisplay.html?bID=198"&gt;book&lt;/a&gt;, &lt;a href="http://www.lhotka.net/Content.aspx?Area=About"&gt;Rocky&lt;/a&gt; proposed &lt;strong&gt;NetRun&lt;/strong&gt; as a way to enable the automatic update of a .NET application in a way that is simple, straightforward and consistent. NetRun makes use of no-touch deployment, a .NET feature that enables the loading of WinForms applications from a URL in a dynamic way.&lt;br /&gt;While NetRun simplifies software update to the point of making it a trivial task, it has some limitations:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The users are not notified when a new version of a file is being downloaded. This results in and undesirable delay when the bandwidth is not high enough and the file being downloaded is large.&lt;/li&gt;&lt;li&gt;The user does not get any feedback on the status of the download process.&lt;/li&gt;&lt;li&gt;Since DLL files are downloaded by demand, if the application makes use of a considerable number of DLLs these download will take place whenever the user makes use of the features associated to those DLLs, which impacts the user experience. Instead of going through a single software update process, the user has to bear with the delays associated with the downloading of the required files, as they are needed.&lt;/li&gt;&lt;li&gt;It forces all the users to get updated to the new version. Sometimes it is desirable to have the software performed on certain users (beta testers, for example) before it becomes available to everybody else.&lt;/li&gt;&lt;li&gt;Since NetRun is based on no-touch deployment and this in its turn is based on reflection, the update is limited to .NET assemblies. NetRun does not support the update of other elements like text files (think of dictionary files –as in word definitions- for example) or COM-based DLLs.&lt;/li&gt;&lt;/ol&gt;There are other alternatives to NetRun that address most of the issues listed above. One of them is Microsoft’s Software Update Application Block. However, it only works on version 1.1 of the .NET Framework; those like me, who are engaged in a large project that uses version 1.0 of the framework, cannot consider it as an option in the short term. Switching to 1.1 could be a small project in its own right.&lt;br /&gt;&lt;br /&gt;Therefore, our team decided to develop our own Software Update feature. After analyzing the requirements and considering some options for its implementation, we arrived to the conclusion that it could be made using the elements that we already had at hand: CSLA business objects. Since business objects can be used to represent/contain BLOBs (needed for binary files like .DLL or .EXE), and to reinforce security rules based on users roles, they might as well be used to model a software update mechanism flexible enough to serve as an alternative to NetRun and address the points described above.&lt;br /&gt;&lt;br /&gt;Timeline constraints in our project forced us to implement the Software Update feature in a way that works perfectly for us, but is not portable enough to be released publicly. In any way, I have decided to redesign it and implement it all over again in order to share with the CSLA .NET community. This article is the first one in a series of four posts in which I expect to describe the concept, design and implementation of the Software Update feature, as well as a short sample showing how to use it. Maybe the community will like to discuss it furthermore, in which case I will say in advance that any comment, suggestion or bug report is most-welcome and appreciated.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Requirements &lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;First, lets define some roles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Administrator&lt;/strong&gt; users are responsible for version management.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Software Tester&lt;/strong&gt; users are responsible for beta testing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Developer&lt;/strong&gt; users are responsible for creating, modifying and debugging the targeted application&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Regular User&lt;/strong&gt; is a meta-role that represents a user that is not associated to any of the previously described roles.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Second, lets define some terms:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An &lt;strong&gt;Updateable Component&lt;/strong&gt; is an application, file or set of files for which we want to enable the auto-update feature. It is not a Component in the .NET or CSLA sense of the word. An Updatable Component can be an application defined by a set of binary files (.EXE, .DLL), or an independent and/or shared constitutive of an application that we may want to be able to update separately, like a small database intended to be deployed locally to the client station, or custom setting files or word definitions (dictionary), etc.&lt;/li&gt;&lt;li&gt;A &lt;strong&gt;Component Version&lt;/strong&gt; (or simply &lt;strong&gt;Version&lt;/strong&gt;) is a released instance of an Updateable Component. Every Updateable Component has an associated list of Versions.&lt;/li&gt;&lt;li&gt;For every Updateable Component there is one Version in its list of versions that is marked as the &lt;strong&gt;Current Version&lt;/strong&gt; at any given time. The Current Version is the one that is intended to be in production at a given time.&lt;/li&gt;&lt;li&gt;For every Updateable Component at any given time there can be up to one Version in its list of versions that is marked as a &lt;strong&gt;Testing Version&lt;/strong&gt;. The Testing Version is not ready to be in production but is ready to be tried by beta testers.&lt;/li&gt;&lt;li&gt;The &lt;strong&gt;Administrative Utility&lt;/strong&gt; enables the management of Updateable Components and Versions.&lt;/li&gt;&lt;li&gt;The &lt;strong&gt;Update Engine&lt;/strong&gt; is an active element of software (a class or the instance of a class) that is invoked in run time to evaluate the need of and ultimately perform the software update for a given updateable component or set of updateable components.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;Administrators should be able to define and &lt;strong&gt;upload&lt;/strong&gt; new Versions of any updateable component and make them available to Software Testers and to Regular Users. The Administrator can &lt;strong&gt;flag&lt;/strong&gt; any version in the list as the Current Version. There must always be one and no more than one Current Version in the list at any given time. The Administrator can flag any version in the list as the Testing Version. There can be up to one Testing Version at any given time. Finally, Administrators should be able to &lt;strong&gt;define&lt;/strong&gt; new Updateable Components. We most design and implement a set of business objects and the Administrative Utility to enable the administrators to do this.&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/softupd1.gif" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;After authenticating into the targeted application, a &lt;strong&gt;verification&lt;/strong&gt; is performed by the application’s Update Engine at run time to determine if it corresponds to the Current Version (Updateable Component). If the user is a Regular User, and the application does not correspond to the version marked as Current Version, it needs to be &lt;strong&gt;updated&lt;/strong&gt; before proceeding with any other operation. If the authenticated user is a Software Tester and there is an available version flagged as Testing Version, the user should be given the choice of using whether the Current Version or the Testing Version. &lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/softupd2.gif" /&gt;&lt;/p&gt;&lt;p align="left"&gt;If the authenticated user is a Developer the version &lt;strong&gt;verification is skipped&lt;/strong&gt; and the application runs without executing any software update. This is necessary to support debugging. Members of the development team should all use Developer accounts when debugging future new versions of the application. &lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/softupd3.gif" /&gt;&lt;/p&gt;&lt;p align="left"&gt;The Developer role &lt;strong&gt;precedes&lt;/strong&gt; the Software Tester role, which means that users that have both roles are considered as having the Developer role only.&lt;br /&gt;From a purely static model point of view, we can already identify some of the objects involved. &lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://homepage.mac.com/pcastill/GSHM/images/softupd4.gif" /&gt;&lt;/p&gt;&lt;p align="left"&gt;In Part II of this series we will discuss the design of the business objects and other elements required. Stay tuned.&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109779519620004833?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109779519620004833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109779519620004833' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109779519620004833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109779519620004833'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/10/csla-based-software-update-part-i_14.html' title='CSLA- based Software Update (Part I) '/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109727766425652430</id><published>2004-10-08T16:12:00.000-07:00</published><updated>2006-11-09T10:42:51.849-08:00</updated><title type='text'> Auto-completing Combo Box Revisited</title><content type='html'>In a &lt;a href="http://ghostspook.blogspot.com/2004/09/auto-completing-combo-box.html"&gt;previous log&lt;/a&gt; I described my implementation of an inherited combo box whose extended feature consisted of auto-compleating the user input with matching entries from it's list. It worked fine for me and for other users that had version 1.0 of the .NET Framework installed in our computers, but not for those using version 1.1 exclusively. While I don't know the reason for this behavior I have to say that it is not the first time that I experience it, and I have a feeling that the order in which the events are triggered have a lot to do.&lt;br /&gt;&lt;br /&gt;Anyway, I modified the auto-compleating combo box with an alternative implementation that fixes this bug and works on both version of the .NET Framework 1.0 and 1.1 here is the code:&lt;br /&gt;&lt;br /&gt;   &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;span style=";font-size:85%;color:blue;" &gt;Public&lt;/span&gt;&lt;span style=";font-size:85%;" &gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; AutoCompletingComboBox&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; ComboBox&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                         &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; _proceedWithAutoComplete &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; = &lt;span style="color:blue;"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; OnKeyDown( _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.Windows.Forms.KeyEventArgs)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; e.KeyCode = Keys.Back &lt;span style="color:blue;"&gt;Or&lt;/span&gt; e.KeyCode = Keys.Delete &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;_proceedWithAutoComplete = &lt;span style="color:blue;"&gt;False&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;_proceedWithAutoComplete = &lt;span style="color:blue;"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.OnKeyDown(e)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                                                                                     &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; AutoCompletingComboBox_TextChanged(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;, _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:blue;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color:blue;"&gt;Handles&lt;/span&gt; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.TextChanged&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; _proceedWithAutoComplete &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Exit&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; TypedText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; FoundIndex &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; FoundItem &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; FoundText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; AppendText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:green;"&gt;'Get the Typed Text and Find it in the list&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;TypedText = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Text&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;FoundIndex = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.FindString(TypedText)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:green;"&gt;'If we found the Typed Text in the list then Autocomplete&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; FoundIndex &amp;gt;= 0 &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;'Get the Item from the list (Return Type depends if Datasource was bound &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;' or List Created)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;FoundItem = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Items(FoundIndex)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;'Use the ListControl.GetItemText to resolve the Name in case the Combo &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;' was Data bound&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;FoundText = &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.GetItemText(FoundItem)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;'Append then found text to the typed text to preserve case&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;AppendText = FoundText.Substring(TypedText.Length)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;     &lt;/span&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Text = TypedText &amp; AppendText&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:green;"&gt;'Select the Appended Text&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.SelectionStart = TypedText.Length&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.SelectionLength = AppendText.Length&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt;End&lt;/span&gt;&lt;span style=";font-size:85%;" &gt; &lt;span style="color:blue;"&gt;Class&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109727766425652430?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109727766425652430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109727766425652430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109727766425652430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109727766425652430'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/10/auto-completing-combo-box-revisited.html' title=' Auto-completing Combo Box Revisited'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109719777433197521</id><published>2004-10-07T16:58:00.000-07:00</published><updated>2006-11-09T10:42:51.788-08:00</updated><title type='text'>Issue with large BLOBs embeded in CSLA biz objs</title><content type='html'>In a &lt;a href="http://ghostspook.blogspot.com/2004/09/handling-blobs-in-csla-net-business.html"&gt;previous blog&lt;/a&gt; I described a way of handling &lt;span style="font-weight: bold;"&gt;Binary Large Objects (BLOBs) &lt;/span&gt;using &lt;a href="http://www.lhotka.net/ArticleIndex.aspx?area=CSLA%20.NET"&gt;&lt;span style="font-weight: bold;"&gt;CSLA&lt;/span&gt; .NET&lt;/a&gt;.  That article only dealt with the details of &lt;span style="font-style: italic;"&gt;persisting &lt;/span&gt;the BLOBs into a DB as well as the &lt;span style="font-style: italic;"&gt;fetching &lt;/span&gt;of those objects from the DB.  Besides that, there was no much more to do: Basically the BLOBs where read into a &lt;span style="font-family:courier new;"&gt;byte[]&lt;/span&gt; array, which acted as a &lt;span style="font-style: italic;"&gt;private data member&lt;/span&gt; of my &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt;... or so I thought.&lt;br /&gt;&lt;br /&gt;Once in production I noticed that my &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt; triggered an exception when the the BLOB was larger than 4 MB. The exception was triggered when the object was transmitted (data portal operation) and it had the following message:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;BinaryFormatter Version incompatibility. Expected Version 1.0. Received Version 1008738336.1684104552&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Doing some research I found some articles &lt;a href="http://www.thinktecture.com/Resources/RemotingFAQ/BINARYVERSIONMISMATCH.html"&gt;here&lt;/a&gt; and there and learned that the error message was rather misleading, that If I wanted to find the real cause of the problem I had to use &lt;a href="http://www.pocketsoap.com/tcptrace/" style="font-weight: bold;"&gt;tcpTrace&lt;/a&gt; or another similar utility to actually see the HTTP messages being exchanged between my client app and IIS. Then I found that the reason was the default value of the &lt;span style="font-weight: bold;"&gt;maxRequestLength &lt;/span&gt;parameter in the &lt;span style="font-weight: bold;"&gt;&amp;lt;httpRuntime&amp;gt; &lt;/span&gt;section of the &lt;span style="font-weight: bold;"&gt;Machine.config&lt;/span&gt; file. This is not an bug,  it is just that by default that value is set to 4 MB which is a fact documented in a &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;295626"&gt;MS Knowledge Base article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The solution, as described in &lt;a href="http://support.softartisans.com/kbview_825.aspx"&gt;another site&lt;/a&gt;, consists in adding or modifying a parameter in the &lt;span style="font-weight: bold;"&gt;Web.config&lt;/span&gt; or to Maching.config. I went with Web.config, that way the change would only affect my &lt;span style="font-style: italic;"&gt;DataPortal&lt;/span&gt;, not the whole system.  The entry described below needs to be added to the &amp;lt;system.web&amp;gt; section of the config file:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;httpRuntime &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      executionTimeout="1200" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      maxRequestLength="102400" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      useFullyQualifiedRedirectUrl="false" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      minFreeThreads="8" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      minLocalRequestFreeThreads="4" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      appRequestQueueLimit="100" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This would increment the limit to 10 MB (102400 bytes).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;httpruntime style="font-weight: normal;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/httpruntime&gt;&lt;/strong&gt;&lt;strong style="font-family: courier new;"&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109719777433197521?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109719777433197521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109719777433197521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109719777433197521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109719777433197521'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/10/issue-with-large-blobs-embeded-in-csla.html' title='Issue with large BLOBs embeded in CSLA biz objs'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109648865259136247</id><published>2004-09-29T13:04:00.000-07:00</published><updated>2006-11-09T10:42:51.670-08:00</updated><title type='text'>Display INS, CAPS, NUM LOCK status using VB.NET</title><content type='html'>I found this @ &lt;span style="font-style: italic;"&gt;Experts-Exchange.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It provides a method for reading the &lt;span style="font-weight: bold;"&gt;CAPS &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;NUM LOCK&lt;/span&gt; status, and the &lt;span style="font-weight: bold;"&gt;INS/OVR&lt;/span&gt; status. The code needs to be called by a timer in order to have this info updated in a Status Bar.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Public Declare Function GetKeyState Lib "User32" (By Val nVirtKey as Long) as Integer &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    Public Function MainGetKeyState() &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        Dim intKeyState1 As Integer &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        Dim intKeyState2 As Integer &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        Dim intKeyState3 As Integer &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        With FormLog.frmMain &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            intKeyState1 = GetKeyState(Keys.CapsLock) &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Select Case intKeyState1 'CAPS Lock &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Case 1, 65409 'On &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                    .StatusBarPanel2.Text = "CAPS" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Case Else &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                    .StatusBarPanel2.Text = "" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            End Select &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            intKeyState2 = GetKeyState(Keys.NumLock) &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Select Case intKeyState2 'NUM Lock &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Case 1, -127 'On &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                    .StatusBarPanel3.Text = "NUM" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Case Else &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                    .StatusBarPanel3.Text = "" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            End Select &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            intKeyState3 = GetKeyState(Keys.Insert) &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Select Case intKeyState3 'INSERT/OVERWRITE &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Case 0, -128 'On &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                    .StatusBarPanel4.Text = "OVR" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Case Else &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                    .StatusBarPanel4.Text = "" &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            End Select &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        End With &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        intKeyState1 = Nothing &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        intKeyState2 = Nothing &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        intKeyState3 = Nothing &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    End Function &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With thanks to              Iouri Boutchkine.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109648865259136247?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.experts-exchange.com/Programming/Programming_Languages/Dot_Net/Q_20832292.html' title='Display INS, CAPS, NUM LOCK status using VB.NET'/><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109648865259136247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109648865259136247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109648865259136247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109648865259136247'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/display-ins-caps-num-lock-status-using.html' title='Display INS, CAPS, NUM LOCK status using VB.NET'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109631344320131316</id><published>2004-09-27T13:11:00.000-07:00</published><updated>2006-11-09T10:42:51.611-08:00</updated><title type='text'>Changing Text Case Using VB.NET</title><content type='html'>The .NET framework includes funcitions to switch the contents of  a string variable into &lt;span style="font-weight: bold;"&gt;UPPERCASE &lt;/span&gt;or &lt;span style="font-weight: bold;"&gt;lowercase&lt;/span&gt;.  However, I needed to implement something like &lt;span style="font-style: italic;"&gt;MS Word&lt;/span&gt;'s "Change Case..." menu option wich, in addition to UPPERCASE and lowercase,  also includes &lt;span style="font-weight: bold;"&gt;Title Case&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Sentence case&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;tOGGLE cASE&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;   So I had to create new functions to do that:&lt;br /&gt;&lt;br /&gt;                                               &lt;p class="MsoNormal" style=""&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Private&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Function&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; ApplySentenceCase(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;ByVal&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; originalText &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;String&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;)&lt;/span&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;        &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; OutputText &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;        &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; i &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Integer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;        &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; ParticularChar &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Char&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;        &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; FoundSentenceSeparator &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;Boolean&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt; = &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; i = 0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; Len(originalText) - 1&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;ParticularChar = originalText.Chars(i)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; FoundSentenceSeparator _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;AndAlso&lt;/span&gt; ParticularChar &lt;&gt; &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(" ") _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;And&lt;/span&gt; ParticularChar &lt;&gt; &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(vbCrLf) _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                 &lt;/span&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;span style="color:blue;"&gt;And&lt;/span&gt; ParticularChar &lt;&gt; &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(vbLf) _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;And&lt;/span&gt; ParticularChar &lt;&gt; &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(".") &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.ToUpper(ParticularChar).ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;FoundSentenceSeparator = &lt;span style="color:blue;"&gt;False&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.ToLower(ParticularChar).ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(".") &lt;span style="color:blue;"&gt;Or&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(vbCrLf) _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                            &lt;/span&gt;&lt;span style="color:blue;"&gt;Or&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(vbLf) &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                    &lt;/span&gt;FoundSentenceSeparator = &lt;span style="color:blue;"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;                                                                                                   &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;span style=";font-size:85%;color:blue;" &gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Return&lt;/span&gt; OutputText&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; ApplyTitleCase(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; originalText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; OutputText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; i &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; ParticularChar &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Char&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; FoundWordSeparator &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; = &lt;span style="color:blue;"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; i = 0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; Len(originalText) - 1&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;ParticularChar = originalText.Chars(i)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; FoundWordSeparator &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.ToUpper(ParticularChar).ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;FoundWordSeparator = &lt;span style="color:blue;"&gt;False&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.ToLower(ParticularChar).ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(" ") &lt;span style="color:blue;"&gt;Or&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(".") _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=""&gt;                      &lt;/span&gt;&lt;span style="color:blue;"&gt;Or&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(vbCrLf) _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                        &lt;/span&gt;&lt;span style="color:blue;"&gt;Or&lt;/span&gt; ParticularChar = &lt;span style="color:blue;"&gt;CChar&lt;/span&gt;(vbLf) &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;FoundWordSeparator = &lt;span style="color:blue;"&gt;True&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Return&lt;/span&gt; OutputText&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; ApplyToggleCase(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; originalText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; OutputText &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; i &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; ParticularChar &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Char&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;For&lt;/span&gt; i = 0 &lt;span style="color:blue;"&gt;To&lt;/span&gt; Len(originalText) - 1&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;ParticularChar = originalText.Chars(i)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.IsLower(ParticularChar) &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.ToUpper(ParticularChar).ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;ElseIf&lt;/span&gt; &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.IsUpper(ParticularChar) &lt;span style="color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += &lt;span style="color:blue;"&gt;Char&lt;/span&gt;.ToLower(ParticularChar).ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;                &lt;/span&gt;OutputText += ParticularChar.ToString&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;" &gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:85%;" &gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Return&lt;/span&gt; OutputText&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109631344320131316?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109631344320131316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109631344320131316' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109631344320131316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109631344320131316'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/changing-text-case-using-vbnet.html' title='Changing Text Case Using VB.NET'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109580997307775607</id><published>2004-09-21T17:42:00.000-07:00</published><updated>2006-11-09T10:42:51.490-08:00</updated><title type='text'>CSLA SmartDate BrokenRules</title><content type='html'>In a &lt;a href="http://ghostspook.blogspot.com/2004/09/csla-smartdate-on-sql-server.html"&gt;previous blog&lt;/a&gt; I documented a problem when &lt;span style="font-weight: bold;"&gt;SQL Server&lt;/span&gt; was used with &lt;a href="http://www.lhotka.net/ArticleIndex.aspx?area=CSLA%20.NET" style="font-weight: bold;"&gt;CSLA&lt;/a&gt; and a &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt;'s &lt;span style="font-weight: bold;font-family:courier new;"&gt;SmartDate&lt;/span&gt; property was out of the SQL Server's range.&lt;br /&gt;&lt;br /&gt;First I thought that the best way to solve it would be to modify the &lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;class to reject the values that fall out of SQL Server's range. But then I though that I would be constraining my &lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt; properties based on my choice of DBMS... who knows if tomorrow I move to &lt;span style="font-weight: bold;"&gt;Oracle&lt;/span&gt; (asuming Oracle doesn't have this limitation). So I decided that the best way to go was to enforce a &lt;span style="font-style: italic; font-weight: bold;"&gt;business rule&lt;/span&gt; by using the &lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;BrokenRules&lt;/span&gt; &lt;/span&gt;object from within the &lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt; property defined in my &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I did that and after testing it I noticed that it didn't work. The rule was not being evaluated and the &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt;'s &lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;IsValid&lt;/span&gt; &lt;/span&gt;property returned &lt;span style="font-weight: bold;"&gt;True&lt;/span&gt;. Then I figured it out the reason: Since I am using &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;databinding&lt;/span&gt; &lt;/span&gt;on the client app and &lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt; properties are binded through their &lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;Text&lt;/span&gt; &lt;/span&gt;property, there is no way my &lt;span style="font-family:courier new;"&gt;BrokenRules&lt;/span&gt; check would ever be evaluated from within my &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Now, it sounds like no big deal, I can still fix this problem at the CSLA level by changing some code in the &lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt; class. But what if tomorrow I have a more complex rule, imagine a &lt;span style="font-style: italic;"&gt;business rule&lt;/span&gt; like this: "return date has to be a value within 30 days after buying date". The place to implement this rule would be within a ficticious &lt;span style="font-weight: bold;font-family:courier new;"&gt;ReturnDate&lt;/span&gt; property (&lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt; object) of my also ficticious &lt;span style="font-weight: bold;font-family:courier new;"&gt;ReturnReceipt&lt;/span&gt; &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt;. If I am going to enforce these rule, I would have to give up &lt;span style="font-style: italic;"&gt;data-binding&lt;/span&gt; (at least for this property) and hope that the user of my &lt;span style="font-style: italic;"&gt;business object&lt;/span&gt; doesn't "bypass it" by updating &lt;span style="font-family:courier new;"&gt;ReturnDate.Text&lt;/span&gt; or &lt;span style="font-family:courier new;"&gt;ReturnDate.Date&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;As another approach, I could also override &lt;span style="font-family:courier new;"&gt;ReturnReceipt.Save()&lt;/span&gt; to make a &lt;span style="font-family:courier new;"&gt;BrokenRules&lt;/span&gt; assertion and then verify &lt;span style="font-family:courier new;"&gt;ReturnReceipt.IsValid&lt;/span&gt; before proceeding to actually  save the data. But then again, it would be something I would have to do for all those &lt;span style="font-style: italic;"&gt;business objects&lt;/span&gt; that implement any sort of rule on &lt;span style="font-family:courier new;"&gt;SmartDate&lt;/span&gt; properties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109580997307775607?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109580997307775607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109580997307775607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109580997307775607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109580997307775607'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/csla-smartdate-brokenrules.html' title='CSLA SmartDate BrokenRules'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109581279098443516</id><published>2004-09-21T17:17:00.000-07:00</published><updated>2006-11-09T10:42:51.551-08:00</updated><title type='text'>CSLA SmartDate on SQL Server limitation</title><content type='html'>After a user reported a bug, I realized that although &lt;span style="font-weight: bold;"&gt;.NET&lt;/span&gt;'s &lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;Date&lt;/span&gt; &lt;/span&gt;datatype can hold values ranging from 1/1/0001 through 12/31/9999, &lt;span style="font-weight: bold;"&gt;SQL Server&lt;/span&gt;'s &lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:courier new;"&gt;datetime&lt;/span&gt; &lt;/span&gt;fields can only hold values starting 1/1/1753. User typos were the cause of the error that was triggered when the &lt;span style="font-weight: bold; font-style: italic;"&gt;business object&lt;/span&gt; was saved (&lt;span style="font-weight: bold;font-family:courier new;"&gt;DataPortal_Update&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;I am using &lt;span style="font-style: italic; font-weight: bold;"&gt;databinding&lt;/span&gt; with my &lt;a href="http://www.lhotka.net/ArticleIndex.aspx?area=CSLA%20.NET"&gt;CSLA&lt;/a&gt; business object, wich binds through it's &lt;span style="font-weight: bold;font-family:courier new;"&gt;Text&lt;/span&gt; property:&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;      &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Public&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Property&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; Text() &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;As&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;String&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Get&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Return&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; DateToString(mDate, mFormat, mEmptyIsMin)&lt;/span&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;End&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Get&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Set&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;(&lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;ByVal&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; Value &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;As&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;String&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;mDate = StringToDate(Value, mEmptyIsMin)&lt;/span&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;End&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;color:blue;"&gt;Set&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;&lt;span style=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; In order to force the user to enter valid values, the &lt;span style="font-weight: bold;font-family:courier new;"&gt;StringToDate()&lt;/span&gt; method needs to be modified as follows:&lt;br /&gt;&lt;br /&gt;                        &lt;p class="MsoNormal" style=""&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Public&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Shared&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Function&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; StringToDate(&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;ByVal&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; Value &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;As&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;String&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;, &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Optional&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;ByVal&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; EmptyIsMin &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Boolean&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; = &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;True&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;) &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;As&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Date&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;If&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; Len(Value) = 0 &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;If&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; EmptyIsMin &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;        &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Return&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Date&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;.MinValue&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;        &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Return&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Date&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;.MaxValue&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;End&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Dim&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; NewDate &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;As&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Date&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; = &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;CDate&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;(Value)&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;If&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; NewDate.CompareTo(&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;CDate&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;("1/1/1753")) &amp;gt; 0&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Then&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;        &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Throw&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;New&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; System.ArgumentOutOfRangeException()&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;End&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;      &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;Return&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; NewDate&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;o:p style="font-family: courier new;"&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;End&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;color:blue;"&gt;If&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"&gt;&lt;span style=""&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109581279098443516?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109581279098443516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109581279098443516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109581279098443516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109581279098443516'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/csla-smartdate-on-sql-server.html' title='CSLA SmartDate on SQL Server limitation'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109547022388792108</id><published>2004-09-17T17:35:00.000-07:00</published><updated>2006-11-09T10:42:51.423-08:00</updated><title type='text'>Handling BLOBs in CSLA .NET business objects</title><content type='html'>      &lt;p class="MsoNormal"&gt;I have been using CSLA .NET since the book came out and I think it is just great, especially when it’s used in combination with CodeSmith.&lt;span style=""&gt;  &lt;/span&gt;It is indeed a very consistent framework.&lt;span style=""&gt;  &lt;/span&gt;There is a well tested and very structured mechanism to update/fetch data and it’s code is generated automatically using CodeSmith. However, if SQL Server is being used and you need to handle Binary Large Objects (BLOBs), you can not use the standard mechanism due to stored procedure limitations.&lt;br /&gt;&lt;/p&gt;       &lt;p class="MsoNormal"&gt;One way I found to overcome this problem is by using a SqlDataAdapter.&lt;/p&gt; &lt;p class="MsoNormal"&gt;In the code below, I am updating a table called &lt;span style=""&gt;DownloadableFile &lt;/span&gt;in the &lt;span style=""&gt;Global&lt;/span&gt; database. The table contains only 2 fields: &lt;span style=""&gt;FileID &lt;/span&gt;(uniqueidentifier data type) and &lt;span style=""&gt;BinaryContents&lt;/span&gt; (image data type). My business object contains a private data member _&lt;span style=""&gt;binaryContent&lt;/span&gt; defined as an array of bytes.&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;                                                     &lt;p class="MsoNormal" style=""&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; DataPortal_Update()&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; con &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlConnection(db("Global"))&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; da &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlDataAdapter("Select * From DownloadableFile WHERE (FileID IS NULL)", con)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; MyCB &lt;span style="color:blue;"&gt;As&lt;/span&gt; SqlCommandBuilder = &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlCommandBuilder(da)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; ds &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; DataSet()&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;da.MissingSchemaAction = MissingSchemaAction.AddWithKey&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;con.Open()&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;da.Fill(ds, "DownloadableFile")&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; myRow &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataRow&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;myRow = ds.Tables("DownloadableFile").NewRow&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;myRow("FileID") = _fileID&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;myRow("BinaryContents") = _binaryContent&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;ds.Tables("DownloadableFile").Rows.Add(myRow)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;da.Update(ds, "DownloadableFile")&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Finally&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;MyCB = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;ds = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;da = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;con.Close()&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;con = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;Notice that when instantiating the SqlDataAdapter (&lt;span style=""&gt;da&lt;/span&gt;) the SQL query includes a condition that makes sure that no data is returned. This is important, otherwise, the data adapter will populate the DataSet (&lt;span style=""&gt;ds&lt;/span&gt;) with records that could contain huge amounts of data (image fields!) on the line &lt;span style=""&gt;da.Fill(ds, "DownloadableFile")&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;!--[endif]--&gt; In the next snippet, I am fetching a particular record, given a &lt;span style=""&gt;FileID&lt;/span&gt;:&lt;/p&gt;                   &lt;p class="MsoNormal" style=""&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Protected&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; DataPortal_Fetch(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; criteriaObj &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; MyCriteria &lt;span style="color:blue;"&gt;As&lt;/span&gt; Criteria = &lt;span style="color:blue;"&gt;CType&lt;/span&gt;(criteriaObj, Criteria)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; con &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlConnection(db("Global"))&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; da &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlDataAdapter( _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;"Select * From DownloadableFile WHERE FileID='" _&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&amp; MyCriteria.FileID.ToString &amp;amp; "'", con)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; MyCB &lt;span style="color:blue;"&gt;As&lt;/span&gt; SqlCommandBuilder = &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlCommandBuilder(da)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; ds &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; DataSet()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                               &lt;p class="MsoNormal" style=""&gt;&lt;span style=""&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;con.Open()&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;da.Fill(ds, "DownloadableFile")&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; myRow &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataRow&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;myRow = ds.Tables("DownloadableFile").Rows(0)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;_fileID&lt;span style="color:blue;"&gt; &lt;/span&gt;= MyCriteria.FileID&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;_binaryContent = myRow("BinaryContents")&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;_sizeInBytes = UBound(_binaryContent)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;Finally&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;MyCB = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;ds = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;            &lt;/span&gt;da = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal" style=""&gt;&lt;span style="color:blue;"&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;/span&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;con.Close()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;con = &lt;span style="color:blue;"&gt;Nothing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;                 &lt;p class="MsoNormal" style=""&gt;&lt;span style="color:blue;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;/span&gt;As you can see, the business object also has a _&lt;span style=""&gt; sizeInBytes &lt;/span&gt;data member, which is calculated from the size of the array of bytes in _&lt;span style=""&gt; binaryContent&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;Just for the records, these is are the business object’s data members:&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; _fileID&lt;span style="color:blue;"&gt; As&lt;/span&gt; Guid = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Guid()&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; _binaryContent() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Byte&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; _sizeInBytes &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt; = 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109547022388792108?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109547022388792108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109547022388792108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109547022388792108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109547022388792108'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/handling-blobs-in-csla-net-business.html' title='Handling BLOBs in CSLA .NET business objects'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109546679707921516</id><published>2004-09-17T16:42:00.000-07:00</published><updated>2006-11-09T10:42:51.363-08:00</updated><title type='text'>Auto-completing Combo Box</title><content type='html'>I needed to implement a few auto-completing combo boxes in my application. I was able to find a few good examples on the Internet, but all of them involved adding code to handle the KeyPress event for each one of the combos I wanted to add.  Then, I decided to rather create my own custom combo box with this added functionality. Here is the code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;Public Class AutoCompletingComboBox&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    Inherits ComboBox&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    Protected Overrides Sub OnKeyPress( _&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            ByVal e As System.Windows.Forms.KeyPressEventArgs)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        If Char.IsLetterOrDigit(e.KeyChar) Then&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Dim TypedText As String&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Dim FoundIndex As Integer&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Dim FoundItem As Object&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Dim FoundText As String&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            Dim AppendText As String&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            'Get the Typed Text and Find it in the list&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            TypedText = Me.Text&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            FoundIndex = Me.FindString(TypedText)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            'If we found the Typed Text in the list then Autocomplete&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            If FoundIndex &gt;= 0 Then&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                'Get the Item from the list (Return Type depends if Datasource was bound &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                ' or List Created)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                FoundItem = Me.Items(FoundIndex)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                'Use the ListControl.GetItemText to resolve the Name in case the Combo &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                ' was Data bound&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                FoundText = Me.GetItemText(FoundItem)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                'Append then found text to the typed text to preserve case&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                AppendText = FoundText.Substring(TypedText.Length)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Me.Text = TypedText &amp; AppendText&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                'Select the Appended Text&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Me.SelectionStart = TypedText.Length&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;                Me.SelectionLength = AppendText.Length&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;            End If&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        End If&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        MyBase.OnKeyPress(e)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    End Sub&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;End Class&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Save it as AutoCompletingComboBox.vb (or any other name you might like) and get ready to reuse it. Since I prefer to reuse at the binary level, I put it in its own separate solution, compiled and reuse by adding a reference to AutoCompletingComboBox.dll&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109546679707921516?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109546679707921516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109546679707921516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109546679707921516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109546679707921516'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/auto-completing-combo-box.html' title='Auto-completing Combo Box'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8223661.post-109450770940101007</id><published>2004-09-06T14:42:00.000-07:00</published><updated>2006-11-09T10:42:51.294-08:00</updated><title type='text'>Batch XSL transformation using scripts</title><content type='html'>One of our clients provide information to our systems in an XML format that differs from the one our solution accepts. The best way to solve the problem is to use an XSL transformation. Since we are using a queue-based approach that uses folders as queues and XML files as messages, I thought that a good way of applying this transformation could be just to write a short script and make it run as a scheduled task in Win2K.&lt;br /&gt;&lt;br /&gt;Here is the code of the script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;'What:     Applies XSL transformation to all the files in a specific folder&lt;br /&gt;'Created:  7/27/2004 by Rafael Castillo&lt;br /&gt;'Modified: 9/13/2004 by Rafael Castillo&lt;br /&gt;'&lt;br /&gt;'Params:&lt;br /&gt;'          sInFolder:   The full path to the folder containing the XML files on which the stylesheet most be applied&lt;br /&gt;'          sOutFolder:  The full path to the folder on which the generated XML files will be placed.&lt;br /&gt;'          sXSLTFile:   Full path to the file that contains the XSL stylesheet to be applied.&lt;br /&gt;'          nxsltPath:   Full path to NXSLTPATH utility (thanks to Oleg Tkachenko. http://www.tkachenko.com/dotnet/nxslt.html)&lt;br /&gt;'          sFilePrefix: Prefix to be applied to the generated files.&lt;br /&gt;'&lt;br /&gt;'Notes:    Folder paths must not include backslash (\) character at the end&lt;br /&gt;'          All the files in sInFolder are expected to be XML files. Recognizable by the XSL Stylesheet.&lt;br /&gt;'          Incoming and outgoing folders most exist and be accessible.&lt;br /&gt;'          File name format is pfxYYMMDDHHNN.XML (pfx is the file prefix).&lt;br /&gt;'          .NET Framework, NXSLTPATH.EXE utility, are required.&lt;br /&gt;'          This script can be scheduled to run on a regular basis using the 'Scheduled Tasks' feature in Win2K or above&lt;br /&gt;&lt;br /&gt;    const sInFolder = "C:\Documents and Settings\rcastillo\My Documents\Visual Studio Projects\PHOENIX\ServerSide\JRN\Scripts\In"&lt;br /&gt;    const sOutFolder = "C:\Documents and Settings\rcastillo\My Documents\Visual Studio Projects\PHOENIX\ServerSide\JRN\Scripts\Out"&lt;br /&gt;    const sXSLTFile = "C:\Documents and Settings\rcastillo\My Documents\Visual Studio Projects\PHOENIX\ServerSide\JRN\Scripts\HLToVia.xsl"&lt;br /&gt;    const nxsltPath = "C:\Documents and Settings\rcastillo\My Documents\Visual Studio Projects\PHOENIX\ServerSide\JRN\Scripts\nxslt.exe"&lt;br /&gt;    const sFilePrefix = "TNC"&lt;br /&gt;&lt;br /&gt;    Dim dTempDate&lt;br /&gt;    Dim sYear&lt;br /&gt;    Dim sMonth&lt;br /&gt;    Dim sDay&lt;br /&gt;    Dim sHours&lt;br /&gt;    Dim sMinutes&lt;br /&gt;    Dim iYear&lt;br /&gt;    Dim iMonth&lt;br /&gt;    Dim iDay&lt;br /&gt;    Dim iHour&lt;br /&gt;    Dim iMinutes&lt;br /&gt;    Dim oFSO&lt;br /&gt;    Dim oFolder&lt;br /&gt;    Dim sFilename&lt;br /&gt;    Dim oParticularFile&lt;br /&gt;    Dim i&lt;br /&gt;    Dim objShell&lt;br /&gt;    Dim Run&lt;br /&gt;    Dim sProposedFileName&lt;br /&gt;&lt;br /&gt;    'read input folder&lt;br /&gt;    Set oFSO = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;    Set oFolder = oFSO.GetFolder(sInFolder)&lt;br /&gt;&lt;br /&gt;    'for every file in the input folder&lt;br /&gt;    For Each oParticularFile In oFolder.Files&lt;br /&gt;&lt;br /&gt;        'Build outgoing filename&lt;br /&gt;        dTempDate = Now&lt;br /&gt;        iYear = Year(dTempDate)&lt;br /&gt;        sYear = Right(CStr(iYear), 2)&lt;br /&gt;        iMonth = Month(dTempDate)&lt;br /&gt;        sMonth = Right("0" &amp; CStr(iMonth), 2)&lt;br /&gt;        iDay = Day(dTempDate)&lt;br /&gt;        sDay = Right("0" &amp; CStr(iDay), 2)&lt;br /&gt;        iHours = Hour(dTempDate)&lt;br /&gt;        sHours = Right("0" &amp; CStr(iHours), 2)&lt;br /&gt;        iMinutes = Minute(dTempDate)&lt;br /&gt;        sMinutes = Right("0" &amp; CStr(iMinutes), 2)&lt;br /&gt;        sProposedFileName = sFilePrefix &amp; sYear &amp;amp; sMonth &amp; sDay &amp;amp; sHours &amp; sMinutes&lt;br /&gt;        i = 1&lt;br /&gt;        While oFSO.FileExists(sOutFolder &amp; "\" &amp;amp; sProposedFileName &amp; ".xml")&lt;br /&gt;            i = i + 1&lt;br /&gt;            sProposedFileName = sFilePrefix &amp; sYear &amp;amp; sMonth &amp; sDay &amp;amp; sHours &amp; sMinutes &amp;amp; "-" &amp; CStr(i)&lt;br /&gt;        Wend&lt;br /&gt;        sFilename = sOutFolder &amp; "\" &amp;amp; sProposedFileName &amp; ".xml"&lt;br /&gt;&lt;br /&gt;        'Execute transformation&lt;br /&gt;        set objShell = CreateObject("Wscript.Shell")&lt;br /&gt;        sCommand = """" &amp; nxsltPath &amp;amp; """ """ &amp; sInFolder &amp;amp; "\" &amp; oParticularFile.Name &amp;amp; """ """ &amp; sXSLTFile &amp;amp; """ -o """ &amp; sFilename &amp;amp; """"&lt;br /&gt;        Run = objShell.Run(sCommand, 1, True)&lt;br /&gt;&lt;br /&gt;        'Delete file&lt;br /&gt;        oParticularFile.Delete&lt;br /&gt;    Next&lt;br /&gt;&lt;br /&gt;    Set oParticularFile = Nothing&lt;br /&gt;    Set oFolder = Nothing&lt;br /&gt;    Set oFSO = Nothing&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Save it as a .VBS file, set the necessary constants (read Params and Notes) and schedule it to run as often as you want.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8223661-109450770940101007?l=ghostspook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ghostspook.blogspot.com/feeds/109450770940101007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8223661&amp;postID=109450770940101007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109450770940101007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8223661/posts/default/109450770940101007'/><link rel='alternate' type='text/html' href='http://ghostspook.blogspot.com/2004/09/batch-xsl-transformation-using-scripts.html' title='Batch XSL transformation using scripts'/><author><name>Ghostspook</name><uri>http://www.blogger.com/profile/06360847091077085037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://homepage.mac.com/pcastill/GSHM/images/Rafa_tmb.jpg'/></author><thr:total>0</thr:total></entry></feed>
