# Sunday, 30 September 2007

Seems I wasn't the only disappointed person who found out WLinstaller sucks on x64. No worries though, I won't have to hack the WLinstaller to get the .msi on my machine. The installer for Windows Liver Writer Beta 3 can be found here, along with those for the other products in the Live Suite.

Almost makes you wonder if the Live Team messed up the installer, or intentionally excluded x64 to promote SkyDrive.

Technorati tags: ,
Sunday, 30 September 2007 15:33:13 (W. Europe Daylight Time, UTC+02:00)
# Saturday, 22 September 2007

No big deal really and since I already toke some time to work on my server, I figured I might do the other outstanding chore too; upgrading the blog-engine to dasBlog 2.0.7226. I did a test upgrade on my (virtual) dev-server first. No real problems, just the an overzealous DasBlogUpgrader.exe (but you can prevent that by taking a good look at the badWords in DasBlogUpgrader.exe.config and removing the appropriate words from that list (like where free set out to delete some referrer-url’s that were okay)). Upgrade instructions are pretty straight forward, but when hitting the uploading section you need to run the difference check on the /config/site.config file too (and not just on the /web.config). ASP.NET issues were not applicable in my case, as I was already running dasBlog 1.9.7067 on ASP.NET 2.0.

One other nice feature, dasBlog now comes with a Windows Live Writer manifest file (wlwmanifest.xml), giving you some admin shortcuts from Live Writer (or take a look before you try).

Speaking of WLW, it seems a new version (Beta 3) was released at September 5th ... save this post as draft ... download new version ... well forget just about that for a moment ... I get the message stating no Windows Live products can be installed on my OS (x64 Windows Vista).

Also Microsoft's web servers are trying to be smart again about the version you should download; Dutch version: http://g.live-int.com/1rebeta/nl-nl/WLInstaller.exe , US-English version: http://g.live-int.com/1rebeta/en-us/WLInstaller.exe. So just download the language-culture you want by substituting the path... now just waiting for the confirmation of the problem on x64 (which you can find here, semi-official).

Technorati tags: ,
Saturday, 22 September 2007 20:53:39 (W. Europe Daylight Time, UTC+02:00)

Okay, I had the occasional SPAM message hitting my inbox, like every 1 out of 10 e-mails. But over the last couple of weeks that ratio seemed to flip. I had to do something in order to take back control; take some time for it now in order to save some time in the future. Since I don't believe in filtering in the inbox (or server based filtering of content for that matter), it had to be a solution at the receiving end of the server. Also, blocking at the receiver alerts the sender of a false positive that the e-mail they send will not be read (non-delivery error) which on the long run is far less intrusive to communication than silently dropping the false positive.

Building on past experience as systems administrator (I'm talking about the year 2003 now), we had about 97% of all incoming mails being either SPAM or addressed to no-existing mailboxes. For e-mail security we used MIMEsweeper, but it first received the mail (receiver service) and then processed it according its policies (security service). This way of working was both overloading the server and producing silent false positives (not many, but still). In order to fight SPAM more efficiently and be able to better spot false positives, we needed a solution capable of denying access to the server... and we found just the product to do that: Open Relay Filter by Vamsoft. This enabled to both block blacklisted servers at the door and reject mail for non-existing recipients, and instead of having to add another mail-gateway to support the overloaded server, utilization levels of the mail-gateway dropped to an acceptable level.

About 2 years back, Vamsoft invited MCT's to sign up for ORF for free, I jumped on the offer ;-) and today that offer really helped me out!!! Installation and configuration on my Small Business Server just toke a few minutes (about 25% of time compared to blogging about it).

Technorati tags: ,
Saturday, 22 September 2007 15:36:36 (W. Europe Daylight Time, UTC+02:00)
# Wednesday, 12 September 2007

The IDENTITY property on a column in SQL Server allows to easily create a new number for each row added (INSERT). As a side effect, the column with the IDENTITY property also shows the natural order of records... until something is forgotten and is INSERTed at a later stage. The natural order of things is now disturbed (or has become fragmented, if you like).

CREATE TABLE OrderOfThings_1(
   Ident int IDENTITY(1,1) NOT NULL,
   OrderedSteps varchar(50) NOT NULL)
INSERT OrderOfThings_1 (OrderedSteps) VALUES ('The first step.')
INSERT OrderOfThings_1 (OrderedSteps) VALUES ('The second step.')
INSERT OrderOfThings_1 (OrderedSteps) VALUES ('The fourth step.') -- Notice the forgotten third step.
INSERT OrderOfThings_1 (OrderedSteps) VALUES ('The fifth step.')
SELECT * FROM OrderOfThings_1 ORDER BY Ident
INSERT OrderOfThings_1 (OrderedSteps) VALUES ('The third step.') -- The forgotten third step is added.
SELECT * FROM OrderOfThings_1 ORDER BY Ident
Ident OrderedSteps   Ident OrderedSteps
1 The first step.   1 The first step.
2 The second step.   2 The second step.
3 The fourth step.   3 The fourth step.
4 The fifth step.   4 The fifth step.
      5 The third step.

Naturally we could have anticipated this scenario and set IDENTITY(10,10). But still if the thid step is to be inserted in natural order, this can only be done with significantly more effort. It requires the use of SET IDENTIY_INSERT dbo.OrderOfThings_1 ON, after which the third step can be INSERTed "in order". As the front-end application likely isn't coded for this scenario, it will require the intervention of a dba.

So it would be nice to be able to specify the natural order if needed only, and the best thing in SQL Server to just allow that is the DEFAULT. But the DEFAULT is quite limited; it can neither hold references to columns in the table nor make use of user-defined functions. So any flexibility should come from system functions, literals and operations. By using the IDENTITY property on one column and deriving the natural order from the IDENTITY with a DEFAULT based on IDENT_CURRENT, a flexible and transparent solution is available;

CREATE TABLE OrderOfThings_2(
   Ident int IDENTITY(1,1) NOT NULL,
   OrderOfSteps bigint NOT NULL
     CONSTRAINT df_OveridebleIdentity
       DEFAULT (IDENT_CURRENT('OrderOfThings_2') * 10),
   OrderedSteps varchar(50) NOT NULL)
INSERT OrderOfThings_2 (OrderedSteps) VALUES ('The first step.')
INSERT OrderOfThings_2 (OrderedSteps) VALUES ('The second step.')
INSERT OrderOfThings_2 (OrderedSteps) VALUES ('The fourth step.') -- Notice the forgotten third step.
INSERT OrderOfThings_2 (OrderedSteps) VALUES ('The fifth step.')
SELECT * FROM OrderOfThings_2 ORDER BY Ident
INSERT OrderOfThings_2 (OrderedSteps, OrderOfSteps) VALUES ('The third step.', 25) -- The forgotten third step is added.
SELECT * FROM OrderOfThings_2 ORDER BY OrderOfSteps
Ident OrderOfSteps OrderedSteps   Ident OrderOfSteps OrderedSteps
1 10 The first step.   1 10 The first step.
2 20 The second step.   2 20 The second step.
3 30 The fourth step.   3 25 The third step.
4 40 The fifth step.   4 30 The fourth step.
        5 40 The fifth step.

Note that the OrderOfSteps column is based on bigint, which can hold any int multiplied by 10.

Wednesday, 12 September 2007 19:05:57 (W. Europe Daylight Time, UTC+02:00)