<?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'><id>tag:blogger.com,1999:blog-7291915</id><updated>2009-07-27T10:52:00.126+01:00</updated><title type='text'>Muddy clouds</title><subtitle type='html'>Feet in the mud and head in the clouds...</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.geurtsrus.com/gerke/atom.xml'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7291915.post-784165390680532379</id><published>2007-04-05T00:09:00.000+01:00</published><updated>2007-04-05T00:18:18.496+01:00</updated><title type='text'>NHive project launched</title><content type='html'>Following on from my &lt;a href="http://www.geurtsrus.com/gerke/2007/01/about-net-collection-libraries.html"&gt;previous&lt;/a&gt; post, there seem to be more people who'd like a .NET collection library that has the rich functionality and liberal license of the &lt;a href="http://www.itu.dk/research/c5/"&gt;C5 Collections&lt;/a&gt; and the .NET Framework integration of the &lt;a href="http://www.wintellect.com/PowerCollections.aspx"&gt;PowerCollections&lt;/a&gt;. Enough to start &lt;a href="http://code.google.com/p/nhive"&gt;NHive&lt;/a&gt;, a new open-source project to achieve that vision. It is very early days yet, but you need to start somewhere!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-784165390680532379?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/784165390680532379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=784165390680532379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/784165390680532379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/784165390680532379'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2007/04/nhive-project-launched.html' title='NHive project launched'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-2903090196501770706</id><published>2007-01-18T00:28:00.000Z</published><updated>2007-01-18T00:29:58.874Z</updated><title type='text'>About .NET Collection Libraries (PowerCollections and C5)</title><content type='html'>&lt;span style="font-style: italic;"&gt;Summary: Some positive and negative points of the PowerCollections and C5 .NET collection libraries from early experience.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;It is no secret that the .NET Base Class Library (BCL) is not overly generous when it comes to collection classes. Though generics have improved life a lot, there still are considerable holes. Fairly well known examples are the lack of set implementations and read-only wrappers around collections/dictionaries.&lt;br /&gt;&lt;br /&gt;There are various more or less open-source .NET collection library projects that try to fill the gap of which the &lt;a href="http://www.wintellect.com/PowerCollections.aspx"&gt;Wintellect PowerCollections&lt;/a&gt; and the &lt;a href="http://www.itu.dk/research/c5/"&gt;C5 Collections&lt;/a&gt; seem to be mentioned most. Of the possible other alternatives,  the &lt;a href="http://www.codeplex.com/ncollection"&gt;NCollection&lt;/a&gt; project at CodePlex has barely started and the &lt;a href="http://ngenlib.sourceforge.net/"&gt;NGenLib&lt;/a&gt; project on SourceForge has not seen any activity for two years.&lt;br /&gt;&lt;br /&gt;The philosophy behind PowerCollections and C5 differs a lot. The PowerCollections approach is pragmatic and aims to stay as close as possible to the existing BCL collections programming model and interfaces, filling the gaps where necessary. A very appealing part of PowerCollections is the static Algorithms class, which defines tens of generic methods for algorithms such as searching and sorting any object that supports &lt;span style="font-family:courier new;"&gt;IEnumerable&lt;t&gt;&lt;/t&gt;&lt;/span&gt;&lt;t&gt;. This class is very useful, because the implementation of similar methods on the BCL collections is either missing or inconsistent.&lt;br /&gt;&lt;br /&gt;Contrary to this the C5 Collection classes have been designed from scratch and show how a more academic approach has resulted in a set of very powerful and consistently implemented collections.  Examples of out-of-the-box functionality are fine-grained events and read-only wrappers for all collections. To get the most from the C5 collections, it pays to have a look at the &lt;a href="http://www.itu.dk/research/c5/Release1.0/ITU-TR-2006-76-2up.pdf"&gt;technical paper&lt;/a&gt; that outlines their design and also provides a full  API reference.&lt;br /&gt;&lt;br /&gt;Based on approach, I would consider PowerCollections first if I needed a patch for missing BCL functionality.  However, the one thing I don't like about the PowerCollections is its non-standard license, which seems to prohibit use in applications that are distributed under GPL/LGPL-like licenses. As Wintellect (recently bought by Microsoft) invited community participation, I feel this would have deserved a more liberal license. For example, a BSD style license, such as used for the C5 collections. For me, this has tipped the balance in favour of C5.&lt;br /&gt;&lt;br /&gt;Having said that, the C5 library needs a bit of nurturing to gain most of its power in day-to-day applications. Offering an implementation of the BCL &lt;span style="font-family:courier new;"&gt;IDictionary&lt;k,v&gt;&lt;/k,v&gt;&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;IList&lt;t&gt;&lt;/t&gt;&lt;/span&gt; interfaces is an important facet of this. Otherwise it can be hard to interface with other modules (&lt;a href="http://www.hibernate.org/"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://www.castleproject.org/"&gt;Castle&lt;/a&gt; or &lt;a href="http://www.springframework.net/"&gt;Spring.NET &lt;/a&gt; for example) that work with the BCL collection interfaces.&lt;br /&gt;&lt;br /&gt;So far, my experience in modifying the C5 code has been promising. After some refactoring of the C5 code, I have been able to implement the &lt;/t&gt;BCL &lt;span style="font-family:courier new;"&gt;IDictionary&lt;k,v&gt;&lt;/k,v&gt;&lt;/span&gt; &lt;t&gt; &lt;/t&gt;interface &lt;t&gt;on all C5 dictionaries. It is too early to start posting code yet, but feel free to leave a comment on this post if you're interested!&lt;br /&gt;&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-2903090196501770706?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/2903090196501770706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=2903090196501770706' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/2903090196501770706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/2903090196501770706'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2007/01/about-net-collection-libraries.html' title='About .NET Collection Libraries (PowerCollections and C5)'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-115399393803907310</id><published>2006-07-27T10:39:00.000+01:00</published><updated>2006-07-27T10:55:12.133+01:00</updated><title type='text'>Hypocrisy of Anti-virus Software Vendors</title><content type='html'>After using McAfee's VirusScan product for the consumer market for a while, I still get very annoyed that it can only update itself if you're logged on as administrator. Given that running as a normal user is one of the better security measures to take, this seems plain hypocrisy to me: "Please use the most unsecure user account possible to keep your PC protected..." Especially because the business version of VirusScan does update itself without any need for admin logons. And it's not just McAfee. The story is the same for CA's e-Trust and Norton's consumer offering.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-115399393803907310?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/115399393803907310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=115399393803907310' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/115399393803907310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/115399393803907310'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2006/07/hypocrisy-of-anti-virus-software.html' title='Hypocrisy of Anti-virus Software Vendors'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-115169899144921957</id><published>2006-06-30T21:12:00.000+01:00</published><updated>2006-09-07T13:21:03.570+01:00</updated><title type='text'>From Microsoft Virtual PC/Server to VMWare?</title><content type='html'>Finally bought my own laptop two days ago and decided to give &lt;a href="http://www.vmware.com/products/server/"&gt;VMWare Server&lt;/a&gt; RC2 a try.&lt;br /&gt;&lt;br /&gt;I had used VMWare Workstation in the past, but since VirtualPC and Server were available in our MSDN Subscription it didn't make sense to pay more than necessary to maintain virtual development and testing environments. Now that VMWare has taken the initiative to release their more mature product for free, it was time to see whether it was worth switching back.&lt;br /&gt;&lt;br /&gt;So far, I am pretty impressed. The VMWare server management console (a fat client) is much friendlier to use than the Microsoft Virtual Server web application. And to my amazement, VMWare supports running Virtual PC/Server environments within seconds as well as converting them into a proper VMWare environment. The only snag I encountered is that the VMWare Virtual Machine Importer wizard must be run under an admin account...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;: And be aware that any Windows installations may need to be reactivated because of the change in virtual hardware environment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-115169899144921957?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/115169899144921957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=115169899144921957' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/115169899144921957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/115169899144921957'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2006/06/from-microsoft-virtual-pcserver-to.html' title='From Microsoft Virtual PC/Server to VMWare?'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-113697895078080575</id><published>2006-01-11T11:24:00.000Z</published><updated>2006-01-11T11:29:10.790Z</updated><title type='text'>Skype Video</title><content type='html'>We have &lt;a href="http://www.geurtsrus.com/gerke/2005/05/skype.html"&gt;continued to use &lt;/a&gt; &lt;a href="http://www.skype.com"&gt;Skype&lt;/a&gt; in a virtual team setting and it works admirably well. This morning I installed the latest version which supports video as well as voice, and the video link worked right away! That is very different from my experience with MSN Messenger video.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-113697895078080575?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/113697895078080575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=113697895078080575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/113697895078080575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/113697895078080575'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2006/01/skype-video.html' title='Skype Video'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-113415994339962143</id><published>2005-12-09T20:14:00.000Z</published><updated>2005-12-09T23:09:17.766Z</updated><title type='text'>Fowler on Validation</title><content type='html'>I just read &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;'s &lt;a href="http://martinfowler.com/bliki/ContextualValidation.html"&gt;ContextualValidation&lt;/a&gt; entry in which the following statements triggered me:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;"one thing that constantly trips people up is when they think object validity on a context independent way such as an &lt;code&gt;isValid&lt;/code&gt; method implies."&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"Alan Cooper advocated that we shouldn't let our ideas of valid states prevent a user from entering (and saving) incomplete information."&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Martin indicates he prefers the use of contextual validation methods such as &lt;code&gt;isValidForCheckIn&lt;/code&gt; rather than a single &lt;code&gt;isValid&lt;/code&gt; method. I would agree it is wise to separate out various types of validation, but I am far from sure whether that should be in the form of multiple &lt;code&gt;isValidForXXX&lt;/code&gt; methods on say a Customer class.&lt;br /&gt;&lt;br /&gt;I am a &lt;a href="http://www.geurtsrus.com/gerke/2004/06/anatomy-of-business-logic.html"&gt;strong believer&lt;/a&gt; in separating information management, business process management and UI dialog management responsibilities. In my book information management is about enforcing context-free constraints on business data, to ensure that this data has and maintains certain semantics (e.g. weight is a positive number, end data cannot be less than start date, total volume of packages in a warehouse cannot be more than volume of warehouse).&lt;br /&gt;&lt;br /&gt;Business process management is about coordinating the automated and manual activities required to gather a piece of meaningful information. Though a business process may take a long time to get all the data it needs, it either finishes with a commit of the gathered information into an information management system (or service/component/object, whichever term you prefer) or it gets cancelled. A business process management system may well store information itself, but it is of a different nature and/or with different semantics. While a business process is running, the collected information only has meaning to the participants in the business process. &lt;br /&gt;&lt;br /&gt;For example, while a customer is on the phone to an energy supplier to set up a direct debit, only the customer and the customer service person on the other end of the phone line can (to a certain degree) assess the validity of the information collected so far. It is only when both the customer and the customer service representative both agree that all the required information is there and of sufficient quality that this information is committed to the customer database of the energy supplier and becomes relevant and meaningful to the rest of the organisation. So business information systems manage data that is regarded as 'fact' by the whole organisation. Business process management systems manage (the collection and storing of) work-in-progress data with limited meaning to anyone else than the people directly involved.&lt;br /&gt;&lt;br /&gt;An object-oriented implementation of these ideas would involve the creation of &lt;span style="font-style:italic;"&gt;business workflow classes/component/services&lt;/span&gt; that coordinate business process execution and &lt;span style="font-style:italic;"&gt;business entity classes/components/services&lt;/span&gt; that are responsible for information management (terminology borrowed from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/distapp.asp"&gt;Application Architecture for .NET&lt;/a&gt;: Designing Applications and Services). A &lt;code&gt;CustomerCheckIn&lt;/code&gt; class would provide a natural home for the &lt;code&gt;IsValidForCheckIn&lt;/code&gt; method, whereas the &lt;code&gt;CustomerEntity&lt;/code&gt; class would solely have context-free information management reponsibilities, and one &lt;code&gt;isValid&lt;/code&gt; method could well do the job. That is context-free as in not business process state dependent. A Customer object may still have a limited number of states (such as active/non-active/archived) that reflect the long-term life cycle of customer data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-113415994339962143?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://martinfowler.com/bliki/ContextualValidation.html' title='Fowler on Validation'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/113415994339962143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=113415994339962143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/113415994339962143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/113415994339962143'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/12/fowler-on-validation.html' title='Fowler on Validation'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-113117659281883270</id><published>2005-11-05T07:23:00.000Z</published><updated>2005-12-09T22:59:44.936Z</updated><title type='text'>Upgrading Applications with Microsoft Installer (MSI)</title><content type='html'>Once we had mastered building a Microsoft Windows Installer (MSI) file (&lt;a href="http://www.geurtsrus.com/gerke/2005/10/installers-plug-for-wix.html"&gt;using WiX&lt;/a&gt;) and got our application successfully installed, it was time to consider upgrades. We quickly found out that our MSI file would not install if the application already had been installed. It did not matter whether the new install had a higher product version or product id (in which case we want an automatic upgrade) or a lower version (automatic upgrade not desirable).&lt;br /&gt;&lt;br /&gt;It turns out that a MSI file in itself cannot bootstrap an automatic upgrade process. When you execute a MSI file (myapp-v0.msi for example) directly the following command get executed: &lt;blockquote&gt;&lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/msiexec.mspx"&gt;msiexec.exe&lt;/a&gt; /i "myapp-v0.msi"&lt;/blockquote&gt; This will install nicely on a clean machine. To allow for upgrades the myapp-v0.msi must specify an upgrade code. &lt;br /&gt;&lt;br /&gt;Now let's see what happens when we release a next version of the application and try to install it on the same machine using a myapp-v1.msi installation file. Doubleclicking on the msi file in the Windows shell will result in a &lt;blockquote&gt;&lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/msiexec.mspx"&gt;msiexec.exe&lt;/a&gt; /i "myapp-v1.msi"&lt;/blockquote&gt; command. Because there exists an application on the machine that was installed with an installer that had the same upgrade code as we are using now, the default behaviour of Microsoft Installer is to &lt;span style="font-weight:bold;"&gt;not&lt;/span&gt; use the myapp-v1.msi file we started in the first place! Instead it uses a cached version of the MSI file with the same upgrade code. The cached version is a copy of myapp-v0.msi that tends to be saved with a pretty random name in the %windir%\installer directory.  So the installation file for a newer product version can never bootstrap the upgrade of a previous version.&lt;br /&gt;&lt;br /&gt;Automatically bootstrapping a complete product upgrade requires execution of something like the following command line:&lt;blockquote&gt;&lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/msiexec.mspx"&gt;msiexec&lt;/a&gt; /i myapp-v1.msi REINSTALLMODE=vomus REINSTALL=ALL&lt;/blockquote&gt;This command will use the myapp-v1.msi rather than the cached version of myapp-v0.msi to perform a (in MSI-speak small or minor) update on the installed product and it will replace the cached copy of myapp-v0.msi with a copy of myapp-v1.msi.&lt;br /&gt;&lt;br /&gt;It does not make sense to send end users through command line hell in order to reach installation nirvana, so what else can be done to automatically upgrade older product versions to new versions? The common answer is to use a wrapper executable that invokes Windows Installer (msiexec.exe) with the correct parameters. Commercial installation products such as Installshield tend to provide this functionality. However, open source installer solutions such as WiX (or the NAnt MSI task) don't.&lt;br /&gt;&lt;br /&gt;This is where the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/platform_sdk_components_for_windows_installer_developers.asp"&gt;Microsoft Windows Installer SDK&lt;/a&gt; comes to the rescue. The installer SDK can be downloaded as part of the Windows platform SDK and contains the C++ sample code for two utilities that allow you to build your own MSI wrapper executables:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;setup.exe is the a wrapper executable whose installation behaviour is encoded in a number of string resources.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msistuff_exe.asp"&gt;msistuff.exe&lt;/a&gt; is a command-line utility to modify the string resources in setup.exe.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Using a command such as &lt;blockquote&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msistuff_exe.asp"&gt;msistuff&lt;/a&gt; setup.exe /d myapp-v1.msi /n "My Great App 1.0" /o INSTALLUPD /v 200 /w InstMsiW.exe'&lt;/blockquote&gt; we get a setup.exe wrapper executable that will both install our application on a clean machine or upgrade a previous version when available. It is pretty easy to add this command to a build script, in our case using a &lt;a href="http://nant.sourceforge.net/release/latest/help/tasks/exec.html"&gt;NAnt exec task&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-113117659281883270?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/113117659281883270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=113117659281883270' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/113117659281883270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/113117659281883270'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/11/upgrading-applications-with-microsoft.html' title='Upgrading Applications with Microsoft Installer (MSI)'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-112950062495832529</id><published>2005-10-16T22:34:00.000+01:00</published><updated>2005-10-17T16:35:04.916+01:00</updated><title type='text'>Installers (a plug for WiX)</title><content type='html'>I know, it has been very quiet here in the past months. Consider it a symptom of a lot of work in progress. The last week of that work I spent a considerable amount of time debugging and (re-)building our installation package.&lt;br /&gt;&lt;br /&gt;We started of a while ago with an evaluation version of Installshield. That seemed to do the trick. However, success has an expiry date. An early one of course when you depend on an evaluation version. Reluctant to spend a lot of money on a tool with little reputation of user-friendliness and that does not seem to fit well into our development and build processes, I started looking at the alternatives.&lt;br /&gt;&lt;br /&gt;First try was a look at the &lt;a href="http://nantcontrib.sourceforge.net/release/latest/help/tasks/msi.html"&gt;NAnt MSI task&lt;/a&gt;, as we are using NAnt already to build C++ and VB6 code. Google didn't highlight much usage of this task and its documentation is pretty terse as well, so that inspired insufficient confidence to pursue this option any further.&lt;br /&gt;&lt;br /&gt;While searching for info on the MSI task a &lt;a href="http://weblogs.asp.net/lorenh/archive/2004/04/06/108811.aspx"&gt;post from Loren Halvorson&lt;/a&gt; mentioned &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt; (Windows Installer XML), a toolkit that was open-sourced by Microsoft just over a year ago. Together with the reminiscence of a positive &lt;a href="http://bloggingabout.net/blogs/ramon/archive/2005/07/20/8592.aspx"&gt;post from Ramon Smits&lt;/a&gt; a few months ago, this was enough incentive to give it a further look. &lt;br /&gt;&lt;br /&gt;The &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt; documentation is not completely there yet, but was certainly enough to get started. Using Gabor Deak Jahn's &lt;a href="http://www.tramontana.co.hu/wix/"&gt;WiX tutorial&lt;/a&gt;, I built and debugged a MSI file that deploys 50+ COM components, a number of system dll's and an ODBC data source within a couple of days. Along the way I learnt more about the Microsoft Installer and its rules and weaknesses, than I would have done using higher level tools such as InstallShield and Wise. I consider that a good thing. Smooth deployment (and upgrade/patching) is too important too leave to chance and there are plenty of pitfalls on the way.&lt;br /&gt;&lt;br /&gt;I also like the philosophy behind &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt; to make deployment authoring a development task. The deployment definition is captured in a (XML) text format that can be updated as soon as components are added or removed by the responsible developer (me). Changes in the deployment script are easily traced using standard version control tools. Two command line tools transform the installation script into the desired MSI file, which was very easy to integrate into our build scripts using &lt;a href="http://nant.sourceforge.net/release/latest/help/tasks/exec.html"&gt;NAnt Exec tasks&lt;/a&gt;. We are now at a point that we can build from source code to MSI in one go. I already look forward to the day that we can automatically run the installer in one or more clean environments for automated testing!&lt;br /&gt;&lt;br /&gt;Finally, &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt; seems a pretty safe bet for the future: if WiX is good enough to build MS Office (and a number of other MS products), it certainly should be good enough for us. Active use within Microsoft is a reasonable warranty that the toolkit will remain up-to-date. And the growing open-source community around it is likely to shave off any rough edges that still exist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-112950062495832529?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/112950062495832529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=112950062495832529' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/112950062495832529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/112950062495832529'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/10/installers-plug-for-wix.html' title='Installers (a plug for WiX)'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-112003762047643695</id><published>2005-06-29T10:15:00.000+01:00</published><updated>2006-01-18T06:00:45.853Z</updated><title type='text'>FirefoxView</title><content type='html'>I have been using Firefox for a good while now and like it. So much, that I even set it as my default browser.&lt;br /&gt;&lt;br /&gt;However, that seemed a step to far for MS applications such as the Virtual Server Administration Site, which depend on Internet Explorer to provide a decent user interface. The Firefox &lt;a href="http://ieview.mozdev.org/"&gt;IEView&lt;/a&gt; extension can come to the rescue here, but in the end I decided to return to Internet Explorer as default browser to accomodate the culprits and reduce the number of clicks on my way to productivity.&lt;br /&gt;&lt;br /&gt;That worked well, until I got fed up with the &lt;a href="http://toolbar.google.com/gmail-helper/"&gt;gmail notifier&lt;/a&gt; launching the gmail site in IE as well. That is where the &lt;a href="http://www.iosart.com/firefox/firefoxview/"&gt;FirefoxView&lt;/a&gt; extension for IE now seems to come in handy to launch Firefox pages from IE (&lt;em&gt;&lt;strong&gt;update:&lt;/strong&gt; or just switch the browser setting in the gmail notifier...&lt;/em&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-112003762047643695?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://www.iosart.com/firefox/firefoxview/' title='FirefoxView'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/112003762047643695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=112003762047643695' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/112003762047643695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/112003762047643695'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/06/firefoxview.html' title='FirefoxView'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111636808340036432</id><published>2005-05-17T22:59:00.000+01:00</published><updated>2005-05-17T23:14:43.406+01:00</updated><title type='text'>First weeks in business</title><content type='html'>I have been rather silent since leaving LogicaCMG, but starting up on my own has taken more time than expected. First of all the amount of DIY involved to turn our study into a decent office took a few days a considerable number of trips to and from IKEA. And setting up computer equipment always seems to take longer than one expects as well. Last but unfortunately not least there is a considerable amount of red tape to get familiar with (VAT anyone?) and the administrative consequences.&lt;br /&gt;&lt;br /&gt;Afin, all that is pretty much settled now. So I hope to be able to blog again about some technical topics in the future. Early candidates are experiences with using and running &lt;a href="subversion.tigris.org"&gt;Subversion&lt;/a&gt; in a Microsoft operating and development environment, using &lt;a href="nant.sourceforge.net"&gt;NAnt&lt;/a&gt; and &lt;a href="http://www.nunit.org"&gt;NUnit&lt;/a&gt; to build and test VB6 en C++ projects, and migrating VB6/C++ apps to .NET.&lt;br /&gt;&lt;br /&gt;Having said that, there is a still a business web site to be developed, business cards to be printed and regular work to be done... The future will tell!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111636808340036432?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111636808340036432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111636808340036432' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111636808340036432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111636808340036432'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/05/first-weeks-in-business.html' title='First weeks in business'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111558830199717903</id><published>2005-05-08T22:21:00.000+01:00</published><updated>2006-09-07T13:28:15.220+01:00</updated><title type='text'>Skype</title><content type='html'>I last tried &lt;a href="http://www.skype.com"&gt;Skype&lt;/a&gt; about a year ago, but kicked it off my home system after I started getting random calls from strangers. Bogus and/or commercial calls on my landline are bad enough. More of the same via the internet was one step to far. And my Skype contact list at that time was pretty small anyway.&lt;br /&gt;&lt;br /&gt;Lately I have been using MSN Messenger for voice and a bit of video conferencing. However, to get this to work I have to reconfigure the NAT services on my ADSL router to a much less secure configuration (unfortunate lack uPnP implementation on the ADSL router). Messenger traffic is not secured either, so it was time to reconsider alternatives.&lt;br /&gt;&lt;br /&gt;So I am back with Skype. Only just. As soon as I installed it on my new AMD Athlon 64 box, it reliably crashed immediately on startup with some sort of memory access violation reported in the Windows event log. As pointed out by &lt;a href="http://www.tongfamily.com/guide/pcs/2005/04/05/athlon_64_dep_and_skype.html"&gt;this article&lt;/a&gt;, the reason turned out to be an aggressive data execution prevention (DEP) configuration. Turning DEP off for Skype solved the problem. Tomorrow I'll find out whether it really works across my symmetric NAT configuration.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update [17/05/2005]&lt;/b&gt;: Unlike MSN Messenger Skype seems pretty happy with my NAT configuration. After some initial problems with my contact list it now works reliably and is likely to stay as my voice client.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111558830199717903?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://www.skype.com' title='Skype'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111558830199717903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111558830199717903' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111558830199717903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111558830199717903'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/05/skype.html' title='Skype'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111260604008427536</id><published>2005-04-04T10:08:00.000+01:00</published><updated>2006-01-18T06:13:54.276Z</updated><title type='text'>Scary</title><content type='html'>An interesting &lt;a href="http://martinfowler.com/bliki/RoysSocialExperiment.html"&gt;description&lt;/a&gt; of a company culture to be avoided:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;You can't have a company that entirely consists of high ability people, you need a mix of less able people that the high ability people leverage.&lt;br /&gt;&lt;li&gt;Intellectuals aren't interested in making money, so a company built around them won't stay viable.&lt;br /&gt;&lt;li&gt;It's a harsh world where nice guys finish last - so you can't afford to be nice to employees and customers without an ulterior business reason.&lt;br /&gt;&lt;li&gt;High ability people can't collaborate effectively, they intellectualize and self-destruct.&lt;br /&gt;&lt;li&gt;Large companies need a strong management structure to avoid falling apart.&lt;br /&gt;&lt;li&gt;Intellectuals must be run by B students since intellectuals are idealist and only greedy B students are pragmatic enough to make real decisions&lt;br /&gt;&lt;li&gt;Doing things for the long term doesn't work.&lt;br /&gt;&lt;li&gt;Being transparent about economics and operations is bad internally, worse externally and certainly won't scale.&lt;br /&gt;&lt;li&gt;Don't reveal your weaknesses, especially to outsiders.&lt;br /&gt;&lt;li&gt;The purpose of being international is to take advantage of people in weaker countries.&lt;br /&gt;&lt;li&gt;Don't give production people powers that can be abused and hurt the company.&lt;br /&gt;&lt;li&gt;Culture is secondary - it cannot be a sustainable advantage - you need a superior business model&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111260604008427536?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111260604008427536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111260604008427536' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111260604008427536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111260604008427536'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/04/scary.html' title='Scary'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111167905429196410</id><published>2005-03-24T15:36:00.000Z</published><updated>2005-03-26T11:10:39.286Z</updated><title type='text'>Going Independent</title><content type='html'>I have notified LogicaCMG that I intend to start my own business by the end of April 2005. I am sad to leave a large and international network of professional relationships. I am happy to take the opportunity to do the things that I enjoy and be able to write more about it in the process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111167905429196410?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111167905429196410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111167905429196410' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111167905429196410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111167905429196410'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/going-independent.html' title='Going Independent'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111165686575947773</id><published>2005-03-24T09:29:00.000Z</published><updated>2005-03-24T09:36:18.680Z</updated><title type='text'>More Rich Internet Application  Frameworks (3)</title><content type='html'>An AJAX &lt;a href="http://www.theserverside.net/news/thread.tss?thread_id=32688#162220"&gt;thread&lt;/a&gt; on the TheServerSide.NET has resulted in another smart browser framework supplier: &lt;a href="http://www.isomorphic.com/"&gt;Isomorphic&lt;/a&gt;. The same thread also contains some posts on developing online/offline functionality with AJAX.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111165686575947773?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://www.isomorphic.com/' title='More Rich Internet Application  Frameworks (3)'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111165686575947773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111165686575947773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111165686575947773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111165686575947773'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/more-rich-internet-application_24.html' title='More Rich Internet Application  Frameworks (3)'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111159893924377782</id><published>2005-03-23T17:28:00.000Z</published><updated>2005-03-24T00:13:21.736Z</updated><title type='text'>IoC in .NET</title><content type='html'>The &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;Inversion of Control virus&lt;/a&gt; seems to have mutated sufficiently to make the jump from Java to .NET developers. Olaf Conijn writes about his &lt;a href="http://bloggingabout.net/olaf/archive/2005/03/23/2565.aspx"&gt;beginning excursion&lt;/a&gt; into this territory. However, before writing a new framework it might be worthwhile to have a look at &lt;a href="http://csharp-source.net/open-source/containers"&gt;existing .NET efforts&lt;/a&gt;. &lt;a href="http://www.theserverside.net/news/thread.tss?thread_id=27409"&gt;This thread&lt;/a&gt; on TheServerSide.net tackles the subject as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111159893924377782?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://bloggingabout.net/olaf/archive/2005/03/23/2565.aspx' title='IoC in .NET'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111159893924377782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111159893924377782' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111159893924377782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111159893924377782'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/ioc-in-net.html' title='IoC in .NET'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111140094420820348</id><published>2005-03-21T10:21:00.000Z</published><updated>2005-03-24T09:37:47.666Z</updated><title type='text'>AJAX (2)</title><content type='html'>Sam Ruby has started to write about AJAX best practices. A comment in &lt;a href="http://www.intertwingly.net/blog/2005/03/16/AJAX-Considered-Harmful"&gt;one of his posts&lt;/a&gt; referred to a &lt;a href="http://del.icio.us/tag/ajax"&gt;del.icio.us AJAX list&lt;/a&gt; which provided a pointer to the &lt;a href="http://www.ajaxian.com/"&gt;Ajaxian blog&lt;/a&gt;, which has a good amount of useful info about JavaScript libraries and more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111140094420820348?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://del.icio.us/tag/ajax' title='AJAX (2)'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111140094420820348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111140094420820348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111140094420820348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111140094420820348'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/ajax-2.html' title='AJAX (2)'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111136112962605497</id><published>2005-03-20T21:25:00.000Z</published><updated>2005-03-20T23:27:24.256Z</updated><title type='text'>More Rich Internet Application Frameworks (2)</title><content type='html'>I like irony and coincidence. I like it even more when the two come together.&lt;br /&gt;&lt;br /&gt;At the beginning of this year I &lt;a href="http://www.geurtsrus.com/gerke/2005/01/good-start-of-year.html"&gt;wrote&lt;/a&gt; that a MVP award and a GMail account had provided a good start, but that their benefits still had to be determined. Last Friday I received a  MVP related message in my gmail account which came with the following sponsored link:&lt;br /&gt;&lt;blockquote&gt;Longhorn Can Wait - Learn to build the future now with the open source Laszlo platform. &lt;a href="http://www.laszlosystems.com"&gt;www.laszlosystems.com&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;I had not heard about &lt;a href="http://www.openlaszlo.org"&gt;Laszlo&lt;/a&gt; before, but it turns out to be another rich internet application platform. It uses its own XML document structure in combination with JavaScript and XPath, which at first sight looks pretty intuitive and powerful. A Java backend compile the Laszlo XML documents into Flash 5+ compatible SWF files that can be displayed in any browser that supports Flash plug-ins. It seems that other display formats could be targeted by the backend, but so far Flash is the only option. I guess XAML/Avalon would be a conceivable option once Longhorn is out.    &lt;br /&gt;&lt;br /&gt;Laszlo is open source, released under the Common Public License, which allows use in commercial products. Tool support is available as an Eclipse plug-in. For more info and demos see &lt;a href="http://www.openlaszlo.org"&gt;www.openlaszlo.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Synergy or what?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111136112962605497?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111136112962605497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111136112962605497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111136112962605497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111136112962605497'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/more-rich-internet-application_20.html' title='More Rich Internet Application Frameworks (2)'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111105777580989343</id><published>2005-03-17T11:04:00.000Z</published><updated>2005-03-17T11:09:35.816Z</updated><title type='text'>More Rich Internet Application Frameworks</title><content type='html'>More people seem to be interested in smart browser applications (my preferred term for rich internet applications...). A colleague pointed to &lt;a href="http://www.bindows.net"&gt;Bindows&lt;/a&gt; as a rich browser-side UI framework. It does some impressive things, but I am still far from convinced about its support for Mozilla browsers. Many of the samples don't seem to work as intended in Firefox 1.0.1, but I trust that will change over time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111105777580989343?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='related' href='http://www.bindows.net' title='More Rich Internet Application Frameworks'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111105777580989343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111105777580989343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111105777580989343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111105777580989343'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/more-rich-internet-application.html' title='More Rich Internet Application Frameworks'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-111075478313937700</id><published>2005-03-13T22:12:00.000Z</published><updated>2005-03-13T22:59:55.873Z</updated><title type='text'>AJAX</title><content type='html'>Though I have had a weak spot for the Dutch football &lt;a href="http://www.ajax.nl"&gt;club&lt;/a&gt; for a long time, I expect to spend more time on the "&lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;technology&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;I saw a &lt;a href="http://bloggingabout.net/dennis/archive/2005/02/24/2301.aspx"&gt;first reference&lt;/a&gt; to the term AJAX (Asynchronous JavaScript with XML) in Dennis van der Stelt's blog. Shortly afterwards followed by a remark in an &lt;a href="http://www.infoworld.com/article/05/03/05/HNpaneljava_1.html"&gt;InfoWorld article&lt;/a&gt; on the Java vs .NET debate (referenced by &lt;a href="http://www.theserverside.net/news/thread.tss?thread_id=32421"&gt;TheServerSide.net&lt;/a&gt;) where AJAX is mentioned as a likely new feature in JSF 1.2/J2EE 5.&lt;br /&gt;&lt;br /&gt;Finally it seems we are getting some traction for the development of rich browser applications. Though browser nowadays provide a strong platform (DHTML, CSS, XML, JavaScript) to build such applications, there is still a lack of supporting browser-side frameworks and associated development tools that will allow for productive development of such interfaces. However, it seems this is starting to change.&lt;br /&gt;&lt;br /&gt;I can see this work in the Java world through the community process and open-source organisations like Apache supporting it. Unfortunately, I still have to see whether similar traction can be formed in the Microsoft world, because Microsoft currently has no direct benefit from promoting richer browser applications. It would go at the cost of the momentum they are trying to build for development of smart clients based on XAML/Avalon and Office. Developing a browser-side framework would be a risk for Microsoft partners (or any other commercial party), because it is practically impossible to protect browser-side script. So I guess it will have to come from either the open-source community or a MS partner who is willing to build both framework and VS.NET integrated toolset.&lt;br /&gt;&lt;br /&gt;A business model based on providing the toolset seems to be feasible: in the Netherlands &lt;a href="http://www.backbase.com"&gt;BackBase&lt;/a&gt; is a company with a very interesting offering in this area (based on a open-source, Java-based backend).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-111075478313937700?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/111075478313937700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=111075478313937700' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111075478313937700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/111075478313937700'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/03/ajax.html' title='AJAX'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-110548855230835182</id><published>2005-01-11T23:44:00.000Z</published><updated>2006-01-27T07:58:39.640Z</updated><title type='text'>Microsoft SharePoint roadmap absence</title><content type='html'>Nobody but the Microsoft product team seems to know where the next release of SharePoint Services/Portal Server will be heading. Customers don't, Partners don't, MVPs don't, and even Microsoft's own portal guru's/evangelists such as &lt;a href="http://markharrison.co.uk/blog/default.aspx"&gt;Mark Harrison&lt;/a&gt; don't.&lt;br /&gt;&lt;br /&gt;Having had a closer look at the SharePoint externals and internals to find out how to get my way with it after all I finally dived into the web service interfaces and the related &lt;a href="http://msdn.microsoft.com/library/en-us/spptsdk/html/tscamlovIntroduction.asp"&gt;CAML&lt;/a&gt; (Collaborative Application Markup Language) documentation in the SharePoint SDK. CAML first of all provides a flexible schema definition facility that underpins SharePoint's ability to create/modify tables (lists in SharePoint speak) at run-time and thus works around the limitations of SQL Server (and any other RDBMS that I know of). The second part of CAML seems to focuses on the rendering of list content.&lt;br /&gt;&lt;br /&gt;So SharePoint defines a data schemas and flexible data storage mechanism, as well as rendering and searching of the this data. Is it just me, or does there seem a lot of overlap between the core SharePoint infrastructure and the functionality that was originally intended to be delivered by &lt;a href="http://msdn.microsoft.com/data/winfs/"&gt;WinFS&lt;/a&gt; in Longhorn. Before Microsoft's announcement of WinFS delay, it would make sense for a next version of SharePoint to use WinFS instead of its current data typing and storage mechanisms. If the SharePoint product team was indeed heading that way, they are now faced with some serious questions about how to go forward. That would certainly explain the complete lack of clarity about SharePoint's future direction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-110548855230835182?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/110548855230835182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=110548855230835182' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/110548855230835182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/110548855230835182'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/01/microsoft-sharepoint-roadmap-absence.html' title='Microsoft SharePoint roadmap absence'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-110363021250572636</id><published>2005-01-09T22:22:00.000Z</published><updated>2006-02-18T20:13:50.316Z</updated><title type='text'>Proxy (Auto-)Configuration Blues</title><content type='html'>I got seriously fed up with switching proxy settings when switching location of my laptop between company, home and client/partner networks. For some reason or another automatic configuration would not work everywhere, so I decided to write my own PAC (proxy autoconfiguration) script.&lt;br /&gt;&lt;br /&gt;The authoritative &lt;a href="http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html"&gt;reference documentation for PAC scripts&lt;/a&gt; by Netscape was easily found by &lt;a href="http://www.google.co.uk/search?hl=en&amp;q=proxy+autoconfiguration+script&amp;amp;btnG=Google+Search&amp;meta="&gt;googling&lt;/a&gt; for "proxy autoconfiguration script" (Interestingly, the same search on &lt;a href="http://toolbar.search.msn.com/results.aspx?q=proxy+autoconfiguration+script&amp;amp;first=11&amp;count=10&amp;amp;FORM=PORE"&gt;MSN&lt;/a&gt; did not even return this URL on the first page of search results). A PAC script is nothing more a bit of JavaScript code that must define a FindProxyForURL function.&lt;br /&gt;&lt;br /&gt;My initial script looked like this:&lt;br /&gt;&lt;pre&gt;function FindProxyForURL(url, host)&lt;br /&gt;{&lt;br /&gt; if(isInNet(myIpAddress(), "158.234.0.0", "255.255.0.0"))&lt;br /&gt; {&lt;br /&gt;   // Connected to company intranet&lt;br /&gt;   return "PROXY proxy1.intra.example.org:80; PROXY proxy2.intra.example.org:80";&lt;br /&gt; }&lt;br /&gt; return "DIRECT";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;If current IP address of machine is in the company intranet subnet, use the proxies that provide internet access from the intranet (company network scenario), otherwise assume direct access is possible (home network scenario).&lt;br /&gt;&lt;br /&gt;Unfortunately this script did not work straight away. Writing it was pretty easy, debugging not. An &lt;a href="http://www.microsoft.com/mind/0599/faq/faq0599.asp"&gt;old MIND article&lt;/a&gt; provided some help in this area. Attaching a debugger to Internet Explorer didn't seem to work for me - the auto configuration script block didn't show up in the Running Documents. JavaScript alerts in the PAC file helped highlight the problem however (IE6 shows the alerts in popup windows, Firefox writes the alerts to its JavaScript console). It turned out that the myIpAddress function returned the IP Address of a loopback adapter (installed for more complex VirtualPC networking scenarios) instead of the IP Address of the Ethernet adapter connected to the LAN.&lt;br /&gt;&lt;br /&gt;Credits to Oliver Presland (Microsoft UK) for pointing out that this problem could be tackled by changing the priority of the network connections. Something that is much more obscure now (open Network Connections applet from Control Panel, Advanced/Advanced Settings... menu, Adapters &amp; Bindings tab, Connections list) than it was in NT4 days. Once the LAN adapter had top priority, the PAC script worked as intended both in the office and at home. That is, until I set up a VPN connection to the company intranet...&lt;br /&gt;&lt;br /&gt;The VPN software creates a temporary network adapter that gets an IP address in the company intranet subnet and always seems to claim top connection priority. The result was that once a VPN connection had been setup, all internet traffic would be routed via the company intranet and its proxies. To prevent unnecessary use of company resources I adjusted the PAC script:&lt;br /&gt;&lt;pre&gt;function FindProxyForURL(url, host)&lt;br /&gt;{&lt;br /&gt; if (isResolvable("myhomepc"))&lt;br /&gt; {&lt;br /&gt;   // Can resolve DNS queries without proxy&lt;br /&gt;   return "DIRECT";&lt;br /&gt; }&lt;br /&gt; else if(isInNet(myIpAddress(), "158.234.0.0", "255.255.0.0"))&lt;br /&gt; {&lt;br /&gt;   // Connected to company intranet&lt;br /&gt;   return "PROXY proxy1.intra.example.org:80; PROXY proxy2.intra.example.org:80";&lt;br /&gt; }&lt;br /&gt; return "DIRECT";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This seems to have done the trick. &lt;span style="font-weight:bold;"&gt;Update:&lt;/span&gt; Only problem now is that resolving host names that cannot be found takes an awful long time. Using subnet tests only is a lot faster, so I will do a bit more work to find out which company subnets are used for VPN clients and which are used for company LAN clients.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-110363021250572636?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/110363021250572636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=110363021250572636' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/110363021250572636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/110363021250572636'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/01/proxy-auto-configuration-blues.html' title='Proxy (Auto-)Configuration Blues'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-110523278921004314</id><published>2005-01-09T01:57:00.000Z</published><updated>2005-01-09T01:06:29.210Z</updated><title type='text'>Good start of the year</title><content type='html'>It has been an interesting first week. I got a gmail account and became a Microsoft &lt;a href="http://mvp.support.microsoft.com/"&gt;MVP&lt;/a&gt;  (Visual Developer - Solutions Architect)! I need to further explore the benefits of both, but it's already becoming clear that the latter provides another, pretty powerful route into the Microsoft organisation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-110523278921004314?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/110523278921004314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=110523278921004314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/110523278921004314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/110523278921004314'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2005/01/good-start-of-year.html' title='Good start of the year'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-109909475859467298</id><published>2004-10-30T01:42:00.000+01:00</published><updated>2004-10-30T01:21:39.396+01:00</updated><title type='text'>Some .NET Regular Expressions for HTML parsing</title><content type='html'>Despite the observations in &lt;a href="http://www.geurtsrus.com/gerke/2004/10/html-parsingscreen-scraping-in-net.html"&gt;my previous post&lt;/a&gt;, my intranet publishing solution is based on a combination of the ASP.NET approach to obtain web content and regular expressions coded in C#. Here are some regular expressions that worked well for me to get specific meta and input tags regardless of letter case and attribute quoting style (single, double or no quotes):&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Content attribute of meta tag with name &lt;i&gt;content-type&lt;/i&gt;:&lt;br /&gt;&lt;code&gt;(?insx)&lt;br /&gt;&amp;lt;meta\s([^&gt;]*?\s*)?&lt;br /&gt;&amp;nbsp;&amp;nbsp;content\s*=\s*&lt;br /&gt;&amp;nbsp;&amp;nbsp;( '(?&amp;lt;Result&amp;gt;[^']*)'&lt;br /&gt;&amp;nbsp;&amp;nbsp;| "(?&amp;lt;Result&amp;gt;[^"]*)"&lt;br /&gt;&amp;nbsp;&amp;nbsp;| (?&amp;lt;Result&amp;gt;[^\s&gt;]*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;[^&amp;gt;]*&amp;gt;&lt;br /&gt;(?&amp;lt;=\sname\s*=\s*['"]?&lt;i&gt;content-type&lt;/i&gt;['"]?[^&amp;gt;]*&amp;gt;)&lt;br /&gt;&lt;/code&gt;  &lt;/li&gt;  &lt;br /&gt;&lt;li&gt;Value of input element with name &lt;i&gt;input-name&lt;/i&gt;:&lt;br /&gt;&lt;code&gt;(?insx)&lt;br /&gt;&amp;lt;input\s([^&gt;]*?\s*)?&lt;br /&gt;&amp;nbsp;&amp;nbsp;value\s*=\s*&lt;br /&gt;&amp;nbsp;&amp;nbsp;( '(?&amp;lt;Result&amp;gt;[^']*)'&lt;br /&gt;&amp;nbsp;&amp;nbsp;| "(?&amp;lt;Result&amp;gt;[^"]*)"&lt;br /&gt;&amp;nbsp;&amp;nbsp;| (?&amp;lt;Result&amp;gt;[^\s&gt;]*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;[^&amp;gt;]*&amp;gt;&lt;br /&gt;(?&amp;lt;=\sname\s*=\s*['"]?&lt;i&gt;input-name&lt;/i&gt;['"]?[^&amp;gt;]*&amp;gt;)&lt;br /&gt;&lt;/code&gt;  &lt;/li&gt;  &lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-109909475859467298?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/109909475859467298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=109909475859467298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/109909475859467298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/109909475859467298'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2004/10/some-net-regular-expressions-for-html.html' title='Some .NET Regular Expressions for HTML parsing'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-109908950485389964</id><published>2004-10-29T23:38:00.000+01:00</published><updated>2004-10-30T00:39:45.300+01:00</updated><title type='text'>HTML Parsing/Screen Scraping in .NET</title><content type='html'>In an e-mail conversation with &lt;a href="http://sphear.demon.nl/weblogs/pascal"&gt;Pascal Naber&lt;/a&gt; the topic of HTML "screen scraping" came up. I dabbled a bit with this a few months ago to when writing a command line utility to alleviate the pain of manually publishing content to our intranet. So far I have considered the following solutions to do HTML screen scraping in .NET, the first two of which I have looked at in detail and the third one I will test-drive on the next occasion:&lt;br /&gt;&lt;ul&gt;     &lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcreatingclientsthatparsecontentofotherwebpages.asp"&gt;ASP.NET web page parsing&lt;/a&gt;: The ASP.NET web service infrastructure supports WSDL extensions that parse the result of HTTP-GET requests using regular expressions. The WSDL has to written and/or edited by hand and can be compiled using the wsdl.exe tool into a web service proxy. I honestly cannot recommend this approach. Regular expressions on their own are already a nightmare to decipher. Having to XML-escape them to get a valid XML attribute is a solid recipe for no sleep at all. Documentation besides the occasional MSDN page is absent. The few articles that exist on this feature seem to rehash the oversimplified example on MSDN.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=B90FDDCE-E60D-43F8-A5C4-C3BD760564BC"&gt;SgmlReader&lt;/a&gt;: Provides XmlReader interface over arbitrary SGML documents and has native support for HTML DTDs. Most elegant solution I have seen so far:&lt;br /&gt;&lt;ol&gt;       &lt;li&gt; It allows for processing of HTML streams - it is not necessary to load complete documents into memory.&lt;/li&gt;       &lt;li&gt;It is easy to layer an XPathNavigator on top to extract content.&lt;/li&gt;&lt;/ol&gt;Disadvantages are the lack of preservation of the original HTML and it seems there are not many people who (are able to) support the code. When I encountered problems with complex embedded JavaScript blocks I decided to look for alternatives.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/smourier/archive/2003/06/04/8265.aspx"&gt;.NET HTML agility Pack&lt;/a&gt;: Reads HTML into custom object model en is able to convert HTML to XML. Seems to be the most pragmatic approach for its ease of use and ability to deal with invalid HTML (tag soup).&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7291915-109908950485389964?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/109908950485389964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=109908950485389964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/109908950485389964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/109908950485389964'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2004/10/html-parsingscreen-scraping-in-net.html' title='HTML Parsing/Screen Scraping in .NET'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7291915.post-109831438578271270</id><published>2004-10-21T01:14:00.000+01:00</published><updated>2004-10-21T00:19:45.783+01:00</updated><title type='text'>Visual Studio and C# Multi-line Build Event Editing</title><content type='html'>I sometimes use build events to invoke tools such as xsd.exe and wsdl.exe for code generation purposes. Typically this requires a build event script with multiple lines. An annoying 'feature' of Visual Studio 2005 is that if you press the Enter key to create a new line in a build script, the OK button is activated and the dialog is closed. Ctrl+Enter seems to do the trick however.&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/7291915-109831438578271270?l=www.geurtsrus.com%2Fgerke%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/109831438578271270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7291915&amp;postID=109831438578271270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/109831438578271270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7291915/posts/default/109831438578271270'/><link rel='alternate' type='text/html' href='http://www.geurtsrus.com/gerke/2004/10/visual-studio-and-c-multi-line-build.html' title='Visual Studio and C# Multi-line Build Event Editing'/><author><name>Gerke Geurts</name><uri>http://www.blogger.com/profile/05555450726344964705</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17896446122599076168'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>