Tuesday, December 15, 2009

Problem with Acrobat Reader Active X control on a Notes 8.5.1 Form

Whenever I add an Adobe Acrobat Reader ActiveX control to a Notes form, save the form, then try to open it, I get an error. I can't actually use the control. I get the same error if I load the database in the Notes 8.5.1 client and try to create or load a document based on the form. No other ActiveX control gives me this problem. Anyone have any suggestions?

UPDATE: I can use the Acrobat Reader control from Access 2003, VB 6, VB.Net and C#. I am working on setting up Notes 7 so I can see if this problem is specific to 8.5.1.

UPDATE #2: Confirmed it is also a problem on 7.0.4. Opening a PMR now.

Thursday, November 05, 2009

Gone fishing

I'll be on vacation for the next two weeks.

The fishing trip will be in Panama.

SnTT: tracking down space hogs in Notes

You all have them. People who keep every stinking e-mail they ever received for the past 10 years. They can't possibly delete that e-mail response that simply says "thanks" because it would destroy their CYA audit trail. Your storage budget looks like the national deficit so finally management is asking why you need that much space. You want to give them a clean report showing who is using their mail as a vast garbage dump.

Creating a Notes agent to loop through the mail directory, open each database, and extract the space used and percent free is trivial. But on your server with 1000+ mail databases and dozens or hundreds that are over a gig, it takes a while to run and bogs down the server. So what can you do?

Enter the Lotus C API. Notes doesn't use the same entry point you do when it's working with databases. Notes uses the spiffy C API, which runs at a lower level. LotusScript code has to be interpreted, so there is some lag. And once it's interpreted it ends up calling the C API. You can bypass the middle man and hit the C API directly.

In this case you only need three C API calls: NSFDbOpen, NSFDbClose and NSFDbSpaceUsed. Add in a NotesDBDirectory and a loop and you're good to go. The following will create documents and put them into a view that has the first column set to "# in view". The second column is the dbsize. It then walks the view to write the position in the view to each record.

Declare Function NSFDbOpen Lib "nnotes.dll" Alias "NSFDbOpen" (Byval dbName As String, hDb As Long) As Integer
Declare Function NSFDbClose Lib "nnotes.dll" Alias "NSFDbClose" (hDb As Long) As Integer
Declare Function NSFDbSpaceUsage Lib "nnotes.dll" Alias "NSFDbSpaceUsage" (ByVal hDB As Long, retAllocatedBytes As Long, retFreeBytes As Long) As Integer

Sub Initialize
Dim s As New NotesSession
Dim rdoc As NotesDocument
Dim mfile As String
Dim success As Variant
Dim pmail As String
Dim dbdir As New NotesDbDirectory("server/domain")
Dim db As NotesDatabase
Dim thisDb As NotesDatabase
Dim view As NotesView
Dim nvec As NotesViewEntryCollection
Dim eOne As NotesViewEntry
Dim eTWo As NotesViewEntry
Dim dbHandle As Long
Dim usedBytes As Long
Dim freeBytes As Long

'Using NotesDBDirectory gives us a handle to the database
'and limited information about it. The rest of the
'information, such as PercentUsed, won't be populated until
'db.Open is called, which we don't want to do because
'that's what drags the server down. Instead we'll combine
'information from the closed database and some Notes C API
'calls to get the specific information we want.

Set db = dbdir.GetFirstDatabase(DATABASE)

While Not db Is Nothing
mfile = db.FilePath
'Only get databases in the mail subdirectory
If Left$(mfile, 4) = "mail" Then
'Get a handle to the database. The NotesDatabase object
'has a LotusScript handle, we need a C API handle.

Call NSFDbOpen ("server/domain!!" + mfile, dbHandle)
If dbHandle <> 0 Then
'Peek inside and get the used bytes and free bytes
Call NSFDbSpaceUsage(dbHandle, usedBytes, freeBytes)
'We have what we need so close the C API handle to prevent a memory leak
Call NSFDbClose(dbHandle)
End If

Set rdoc = New NotesDocument(s.CurrentDatabase)
rdoc.form = "EmailRecord"
rdoc.dbFilename = FilePath
rdoc.title = db.title
rdoc.mailfile = db.FilePath
rdoc.dbsize = db.size
rdoc.pctused = Round((usedBytes / db.size, 2) * 100
rdoc.server = db.Server
rdoc.Username = db.Title
Call rdoc.Save(True,False)
mfile = ""
End If

Set db = dbdir.GetNextDatabase

' Next we walk the all docs view and write the user's ranking to their document
Set thisDB = s.CurrentDatabase
Set view = thisDb.GetView("AllDocs")

Set nvec = view.AllEntries
Set eOne = nvec.GetFirstEntry
Do Until eOne Is Nothing
Set doc = eOne.Document
Print "On doc " + Cstr( eOne.GetPosition("."))
doc.Ranking = Cstr( eOne.GetPosition("."))
Call doc.Save(True, False)
Set eTwo = eOne
Set eOne = nvec.GetNextEntry( eTwo )
End Sub

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.

[UPDATED 11/5/2009 9:25 AM to include the NSFDbClose code to prevent a memory leak.]

Wednesday, November 04, 2009

Another resource for the Notes community

There are several online communities for the Notes community: developerWorks forums, BleedYellow Sametime, PlanetLotus, and IdeaJam just to name a few. There is another one that not as many people visit, the #notes channel on IRC. Consider this your invitation to join the discussion there. In case you don't have an IRC client or even know what IRC is, here is a widget that will get you going quickly

Chat here

This is all AJAX, no Java or ActiveX required. Just open the link, enter a nickname, and join the conversation. If it looks like nobody is active just say hi or ask a question. Someone will probably respond. :-)

Tuesday, November 03, 2009

What do you do when Notes 8.5.1 just won't install?

My friend Adam has a problem. He can't install Notes 8.5.1. Every time he tries he gets the following error:
0x1B1 - Version mismatch between executable and preexisting shared memory versions! EXITING. You may need to stop RTVSCAN or reboot.

It is documented as SPR# DDES7L9SEV, and IBM thought they had it fixed in 8.0.2 FP2 and 8.5 FP1. SPR #TONN7WTQQE was opened based on reports this is happening in 8.5.1, which I can confirm it really is.

Adam called Lotus support and they had him uninstall Notes, manually remove all the directories and Registry entries, and try again. It still failed with the same error. He sent in NSD's and other logs and there was no resolution. The final response he received was that it is under investigation. At this point he is stuck not being able to install 8.5.1 at all on his computer, which means he can't test his applications for compatibility.

This morning the same thing happened to me. I upgraded a test VM from 8.5 FP1 to 8.5.1 and got the same 0x1B1 error as Adam. I tried the same cleanup he did but it didn't help me, either. I'm writing this while I'm waiting for Windows to install in a new VM so I can see if it was just a fluke. Whether it is or not, this hardly inspires confidence.

Thursday, October 29, 2009

Lotus Center for Advanced Collaboration

IBM opened one in Pune, India. Is there one in the US? I'm not being snarky, I'm genuinely curious. I have never heard of such a thing from IBM. I know other vendors, such as Avaya and Cisco, have customer-focused campuses, but I am not aware of anything like that from IBM.

Thursday, October 01, 2009

SnTT: How to tell if the Notes client is Standard or Basic

A lot of people have been asking on the forums lately how to tell whether the Notes client is running in Basic or Standard configuration. You can use @IsEmbeddedInsideWCT or NotesUIWorkspace.IsEmbeddedInsideWCT. The Workplace Client the help refers to morphed into Lotus Expeditor, which is the framework for the Notes 8 Standard client.

Saturday, September 19, 2009

Windows 7 Enterprise first look

Those of you who are Facebook friends might recall me talking about problems with my home computer's motherboard. In particular the audio drivers would crash and I'd have to reboot to restore sound. I also could not get it to recognize 4GB RAM, and I had to do all sorts of strange things just to get Windows XP to install.


A few weeks ago I finally bought an open box Asus M3N-HT. It was about this time that Microsoft offered a 90-day trial license of Windows 7 Enterprise for IT professionals. I have two Western Digital 1TB drives and one was mostly empty, so I decided to go for it.

I swapped out the motherboard rather easily, with only three small problems. First, while I was pulling the CPU out of my old motherboard I smeared CPU thermal grease across the pins on one side. I wasn't sure if it was conductive or not, but to be on the safe side a toothbrush and some rubbing alcohol took care of that. The second was figuring out which SATA port was #1. I needed to know because the #1 port is where you connect the boot drive. The six SATA ports are on the edge of the motherboard, in three columns of two ports each. Was the bottom #1 or the top? It turns out it's the top.

Finally, many new motherboards have what's called AHCI mode, which is used to enable some advanced features including more SATA ports. My motherboard has 6 SATA ports total, but I can only use 4 of them unless I enable AHCI or RAID mode. When did this I could not get my computer to boot from my SATA DVD drive. It turns out that this is not a supported configuration for this motherboard. If I want to install an OS with AHCI enabled from the start I would have to boot from an IDE optical drive. I'm not particularly concerned because I'm only using 4 SATA ports right now amd Windows Vista and Windows 7 support enabling AHCI later.


I had already burned the Windows 7 Enterprise 64-bit ISO to a DVD, so after I had all the above sorted out I popped that in and fired up the installer. It was completely painless. The installer loads in a graphical screen instead of the old DOS style like Windows XP used, and it loads much faster. I deleted the partition already on the drive I was installing to and let the installer recreate it. It added a 100MB system partition whose purpose I don't know yet, then created the primary partition on the remainder of the drive. The entire installation process took about 30 - 45 minutes. I left it running while I loaded the dishwasher so I'm not sure of the exact time. I heard my computer reboot twice during the process, and I came back and it was at a login screen.

Finishing Installation

The very first thing I noticed was Windows had automatically set itself to my monitors' native resolution, which is 1440x900, and both monitors were working. That was interesting. When I logged in my computer made a noise and I had to ask Myron if that was my computer or his. It was mine, so apparently my sound was working, too. With Windows XP I always had to install video and audio drivers before anything worked, so I wondered what else had the Windows 7 installation done automatically?

I finally tracked down the device manager and was stunned to see that everything had a driver. My audio worked, my video worked, and my network worked. I didn't have to install a single driver. It listed my video card as an nVidia GeForce 9800GTX+, my keyboard as a Saitek Eclipse and my mouse as a Logitech TrackMan Marble. It even loaded the nVidia Control Panel software.

First impressions

The first thing I did from here was install Thunderbird so I could get to my e-mail. IE8 prompted me to make sure I wanted to download the file, then Windows prompted me again when I ran the installer. This was the first time I had gotten any security prompts. Thunderbird installed fine, I copied the contents of my Thunderbird profile to the clipboard... then couldn't find where to put it. A quick search (using Bing) showed they had moved it to a folder called Roaming in my user profile. I found the Thunderbird folder there, pasted in my old profile, loaded Thunderbird, and e-mail started flowing in.

While I was working with the new Windows Explorer I noticed it wasn't showing me file extensions. And I didn't have toolbars. I tried right-clicking the area where the toolbars should be and nothing happened. Another Internet search and I learn I have to go through the Control Panel to set folder options. I changed those and they took place immediately in my open Explorer window.

Wrap up

As you may have guessed, I haven't worked with Windows Vista yet, so there is going to be a bit of a learning curve. So far I really like Windows 7. It's fast, it looks nice, andit's not so different that I want to scream in frustration (yet). My initial impression is Windows 7 is to Windows Vista what Notes 8.5.1 is to Notes 8: what it should have been from the beginning.

Sunday, September 06, 2009

My impressions of Lotus Notes and Domino 8.5.1 beta

For those of you looking for my food-oriented writing, keep moving. This isn't going to make much sense. :-)

Why Am I Here?

You might be thinking "Hey... I know you... aren't you that formerly relevant guy who hates Notes and Domino and now just pokes fun at Ed Brill and taunts Nathan?"

It is no secret that in my day job I work with Visual Studio, Access and SQL Server and we use Outlook and Exchange for e-mail. But we don't have a collaboration platform. We tried Sharepoint and it became apparent it wasn't for us when I couldn't even get a demo environment set up in a reasonable amount of time. I tried out Notes and Domino 8, but I have been very disappointed with the performance and overall build quality of every release so far.

The worst bugs were in Domino Designer, and I happen to be a developer. Since the other user populations -- end users and administrators -- were getting lots of new features that actually mostly worked, I finally decided that IBM simply didn't care. Here's how the cycle would go: we would yell at them at Lotusphere and they'd make a promise to do better and we'd cheer. Several months later they'd give us something half-baked, we'd yell, they'd make a promise to do better at Lotusphere and we'd cheer. Lather, rinse, repeat.

As if to prove this point, the first Domino Designer in Eclipse is an atrocity. It just doesn't work. Period. There are scores of regression bugs and much of the new functionality is not complete. Things that were promised and demoed at Lotusphere 2008 were not shipped in this release, which came out in January 2009. I had participated in usability sessions during which I was told the functionality I was working with would be in 8.5, but it wasn't. I took it very personally. I felt like Lotus looked me in the eye and lied.

So when I heard that supposedly one of the primary goals in 8.5.1 was to fix was was left undone in 8.5 and to finally make Domino Designer a usable development environment, my first reaction was look back at the long history of broken promises and broken software and be dismissive. I finally decided that after harping about this for the better part of a decade I had to see if they were really doing it or just giving more lip service. I requested to participate in the 8.5.1 managed beta. I had to know.

Notes Client

The first thing I noticed is performance is much improved. From the time I double-click the Lotus Notes icon until I get the password prompt is consistently 3 - 5 seconds. After I enter my password the time to load my "My Work" home page is another 15 - 20 seconds. I used to have startup times of over 45 seconds so this is a huge improvement.

Working with mail, calendar, to-do's, and follow-up items is smooth and efficient. In previous releases I had pauses of up to 20 seconds while the calendar or e-mail loaded, but that's completely gone. Now it's a second or two and it's loaded. I really like the new UI for mail and the improvements made to the icons and visual clutter since 8.0. I have not had any weird errors or application hangs and so far the toolbars haven't been moving around randomly like they used to. I haven't had a single crash yet, either. The performance and stability of the Notes client by itself has improved tremendously across the board.

Domino Designer

How about Domino Designer, the application I hated so much I changed jobs to get away from it? DDE 8.5.1 is much more responsive and much more stable than 8.5. It's still not as speedy as the old Domino Designer, but it also doesn't make me want to claw my eyes out (yet). I haven't had code go missing, and I have only had one crash. The Eclipse LotusScript editor is a little quirky and isn't what was promised, but still an improvement over what was available in previous releases. Code assist works for custom classes and will autocomplete method and property names. You can type out a function or object name, hover your mouse over it, and help pops up in a little window. I'm definitely impressed. This is close to what I expected when release 8.0 came out in August 2007.

What? No Sturm and Drang?

Some of you may be shocked to see me saying mostly positive things about Notes and Domino. I've always liked the idea of the products, I just haven't liked the implementation. 8.5.1 is a game changer. It's showing the promise of the platform and is a great jumping off point. Sure it's two years late, but at least it's finally here.

I do have a list of issues with 8.5.1, some of which are quite serious. Originally I started writing a vitriolic exposé of these as well as what's been left on the cutting room floor.
The license on the latest beta build dropped the secrecy requirement, so I could do that. After taking a step back and looking at the whole picture, I came to the conclusion that ultimately there is more good than bad in 8.5.1. Sure there are problems, but after screwing around for two years IBM/Lotus finally came up with something that doesn't make baby Jesus cry.

And let's not forget this is beta software and there are several weeks of development between the last beta release and the final gold build.
Some of the problems I have reported may be resolved. There are a few things I already know are being deferred or simply aren't going to be available, so you can be sure a more critical writeup is coming.

Final Thoughts

Coming full circle, the reason I'm writing this is because I am shocked by what I have seen in 8.5.1. I have been one of the harshest critics of R8 and I'm not a raving fan yet, but there is finally hope. I wrote off R8 as a lost release, one that was basically an entire beta cycle between 7 and 9. I never expected any R8 release to be usable. If you did the same you owe it to yourself to give 8.5.1 a try. It has issues and there is a lot left to be done, but is head and shoulders above any previous R8 release.

Disclaimer: IBM Lotus Notes/Domino and Lotus Notes Traveler 8.5.1 is prerelease code and there are no guarantees from IBM that the functionality presented or discussed will be in the final shipping product.

Thursday, September 03, 2009

Problem with Windows Server 2003 NIC's after running VMware Converter

When you convert a physical machine to virtual, VMware Converter will create VMware-compatible network interfaces. It does not delete the old hardware interfaces that are no longer used, it simply hides them from Device Manager. When you try to assign an IP address to the new interface, you may find yourself in one of these situations:
  • You get the error "The IP address is assigned to another adapter which is hidden. In order to allocate the actual IP address of the server to the network adapter/s you'll need to remove the hidden adapters."
  • You can assign the IP address, but the Network Properties dialog shows it is DHCP. ipconfig will show the static IP. Resetting the static IP in the Network Properties doesn't stick.

If the first one happens it's pretty shocking because you can't give your server the IP address you want, and you can't find the interface that has it assigned. In the second case it doesn't hurt anything because it still works, it's just inconsistent and can cause some issues when troubleshooting.

To fix this follow these steps:
  • Open a command prompt on the affected VM
  • Type set devmgr_show_nonpresent_devices=1 and press Enter
  • Open Device Manager by typing devmgmt.msc and pressing Enter from the same command prompt
  • In Device Manager click View > Show Hidden Devices
  • Find the old devices and delete them
  • Restart the server
I found most of these steps in the VMware Forums. The downside is it doesn't always work. I've had about a 50% success rate with getting it to actually delete the incorrect NIC.

Tuesday, July 21, 2009

Monday, June 15, 2009

Lotus Support is clearly overwhelmed

My friend Ninke logs PMR's with Lotus Support on an almost weekly basis. He checked one of his PMR's today and found this note:

Called client and explained the reason for the delay. Enormous
amount of PMR's currently opened and ongoing, impacting
unfortunately all, especially lower prior/sev 4/4.

There are two things this brings to mind. First, Ed Brill keeps saying that there have been fewer issues reported for R8 than previous releases. That being the case it's odd that both I and the four Domino admins I talk to almost daily, including Ninke, have all opened more PMR's for R8 than they did for any others. I'm sure Ed's statistics are more representative than my limited sample, but it's still hard for me to reconcile the official reports with what I see firsthand.

Second, why would one customer having a large number of PMR's open slow down resolution on all their PMR's? I didn't think IBM dedicated staff to resolving individual customers' problems. Even if they did that should speed things up, not slow it down. If they don't, why would the volume of open PMR's have any impact on resolution? Something seems to be broken besides Notes and Domino 8.x.

Monday, April 27, 2009

VMWare ESX, virtualized DNS and an ISCI SAN

Since the fire we had last year we have replaced all our old servers with a new virtualized infrastructure. We're running VMware ESX 3.5, an HP BLc-3000 blade chassis with six blades, and an HP AiO1200R ISCSI SAN. It is working great and I have a writeup about that decision-making process that I will be publishing shortly.

Today I wanted to bring up one of the potential pitfalls when you're creating a fully virtualized environment. This past weekend we had to cut building power for an extended period of time, so the network administrator brought down everything in our server room. As he brought everything back online he realized that Virtual Center, the control console for VMware ESX, could not talk to the SAN because it required DNS resolution.

The Problem

Our DNS servers are virtualized with storage on the SAN. He ran into a chicken-and-egg situation where he had dependent services that relied on each other.

It took him a while to realize that DNS was the issue. The logs on the SAN side simply said "Could not connect ISCSI LUN". On the VMware side the virtual machines said "storage not available". Figuring out why the two were unable to connect took some careful analysis. Solving it proved difficult because our departmental wiki also used SAN storage, so he had no access to our documentation. In a flash he found himself back in the same situation he was in after the fire, when he could not access critical documentation because the servers with it were not available.

The Solution

So how did he solve it? Luckily he still had the old primary domain controller hanging out, which had all the DNS information. He was extremely lucky, and he knows it. To keep from having to rely on luck, how should you configure your VMware environment so this doesn't happen to you? There are a couple of ways to tackle it.

Use local storage for your virtualized name servers.

  • Name servers will load without SAN access.
  • Resilient to SAN outages.
  • Cannot mix guest VM's that require SAN storage. The ISCSI initiator in VMware ESX loads when ESX boots. By having your DNS server on the same physical host as another VM that requires SAN storage, the guest on SAN storage will not be able to start.

Use a non-virtualized DNS server.

  • Resilient to SAN outages.
  • If using a Windows server, also requires you run Active Directory services.

Use hosts files.

  • Resilient to SAN outages.
  • May improve performance slightly since lookups will always be from local cache.
  • Requires you add hosts files to the Virtual Center server, SAN server, and every ESX host server.
  • Can be a maintenance burden if your environment changes frequently and you have to constantly add/remove ESX hosts.

We have opted for the last option. Our VMware host environment is fairly static, so maintaining hosts files will be a minimal maintenance issue. The resilience we gain from it make it very worthwhile. Oh, and we printed a copy of our wiki page that has all the hostnames and IP addresses of every server we have, and put it in the safe. :-) You do have a similar list, and a fireproof safe... right?

Monday, April 20, 2009

A script to check remote computers for directories

At work we needed a way to check servers to see if certain software had been installed. The easiest way was to check for the software's installation directory. There isn't an easy way to do this remotely, though, so I wrote a script to take care of it: dircheck.vbs.

While I was writing this tool I learned a lot about VBScript. For starters, you can't interact with stdin or stdout using the default VBS command interpreter. If you try to write information to the user's console it will display everything in a popup. To fix this, you can use the special cscript interpreter:

cscript dircheck.vbs

If you execute the above command you will get command line help for the utility. Full source code is obviously included, so please feel free to use it however you need to.

Monday, April 13, 2009

How to copy SQL Server DBMail configuration to another server

I'm setting up a new SQL Server from scratch and wanted to copy the existing DBMail configuration from the old server. I did some searches and the best I could find were pointers to the msdb.dbo.sysmail_* system tables. I did some trial and error and got everything copied over, so here's how I did it.
  1. Log into the new server
  2. Create a server link from the new server to the old server
  3. Copy the DBMail configuration
I had to log into the new server and do the server link there. From my workstation SQL Server considered it a redirection, and that is a security violation. Save yourself some headaches and just start at the new server. Note that the following SQL script will delete any existing DBMail configuration in the target SQL Server. If you want to keep the existing configuration you'll need to take out the DELETE and SET IDENTITY_INSERT statements and manipulate the account_id and profile_id in the related tables.

SET IDENTITY_INSERT sysmail_account ON
INSERT INTO sysmail_account (account_id, [name], [description], email_address, display_name, replyto_address, last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_account

DELETE sysmail_configuration
INSERT INTO sysmail_configuration (paramname, paramvalue, [description], last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_configuration

DELETE FROM sysmail_profile
SET IDENTITY_INSERT sysmail_profile ON
INSERT INTO sysmail_profile (profile_id, [name], [description], last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_profile

DELETE FROM sysmail_principalprofile
INSERT INTO sysmail_principalprofile (profile_id, principal_sid, is_default, last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_principalprofile

DELETE FROM sysmail_profileaccount
INSERT INTO sysmail_profileaccount (profile_id, account_id, sequence_number, last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_profileaccount

DELETE FROM sysmail_servertype
INSERT INTO sysmail_servertype (servertype, is_incoming, is_outgoing, last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_servertype

DELETE FROM sysmail_server
INSERT INTO sysmail_server (account_id, servertype, servername, port, username, credential_id, use_default_credentials,
enable_ssl, flags, last_mod_datetime, last_mod_user)
SELECT * FROM oldserver.msdb.dbo.sysmail_server

Monday, March 23, 2009

free alternative to defrag.nsf

My friend Adam asked me recently about defrag.nsf. In case you don't know, this is a Windows-only tool for Domino that will do a file-level defragmentation of Domino databases. According to the product page the theory is this will increase performance. I haven't tried the product so I can't state whether this is true or not, but I do know that you can get the same results for free.

defrag.nsf is using the Windows defragmentation API to do file-specific defragmentation. Microsoft baked this into Windows NT 4 and the same API has been in Windows 2000, XP and Server 2003 and 2008. It is robust, stable, and has been proven over time. Because all the necessary libraries are included with Windows you could write this application yourself if you wanted to.

But you don't have to. Sysinternals, a division of Microsoft, has the free contig tool that does the exact same thing. You can defrag a single file, a directory, or recurse directories. And it accepts wildcards, so you could defrag "c:\program files\ibm\lotus\domino\data\mail\*.nsf".

If you decide you want to find out if file fragmentation is an issue for your Domino server it wouldn't hurt to try out the free contig tool and compare it to the results from defrag.nsf.

P.S. While I was researching this I came across Ulrich Kraus' write up of contig. The comments there include links to more free defragmentation utilities.

Sunday, March 15, 2009

blueberry lime sauce

You can use this with anything that needs a slightly sweet, fruity, and citrusy pop of flavor. I served this with braised pork belly.

1 C Riesling wine
1 C unsweetened blueberry juice
2 cardamom pod, or 1/4 teaspoon ground cardamom
2 kaffir lime leaves, or the zest of 2 limes
juice from 1 lime
sugar to taste
salt to taste
2 small saucepans

Put the Riesling in a small saucepan. Heat over medium-high heat until it reduces to 1/4 to 1/3 of a cup.
Remove from the heat
Thinly slice the kaffir lime leaves and stir the ribbons into the Riesling reduction, or add the lime zest
Add a pinch of salt, stir, and let sit.

Put the blueberry juice and cardamom pod (if using, ground cardamom later would be added later) into a second sauce pan. Heat over medium-high heat until it reduces by about 1/2.
Add the Riesling reduction to the blueberry reduction. Add the ground cardamom now, if you're not using a whole pod.
Reduce the entire mixture to about 1/2 a cup
Stir in sugar to taste. How much you need depends on how sweet the Riesling and blueberry juice was to begin with.
Add salt to taste
Continue cooking until sugar and salt are fully dissolved, about 1 minute

Allow to completely cool, then strain into a storage container. Stir in the lime juice.

Tuesday, March 10, 2009

buttermilk cake with spiced vanilla icing

This is the buttermilk cake I have been making for dinner parties recently. It's delicious, easy, and a little unexpected with the buttermilk and butternut squash. I organized the ingredients into the groups you will need to prepare this recipe.

For the cake

  • 10 cup bundt pan
  • 1T unsalted butter, softened
  • 1/4 cup unbleached all-purpose flour
  • 4 oz (1/2 cup) unsalted butter, softened
  • 1 1/2 cups granulated sugar
  • 1/2 cup canola oil
  • 2 large eggs
  • 1 Tbs distilled white vinegar
  • 2 tsp pure vanilla extract
  • 13 1/2 oz (3 cups) unbleached all-purpose flour
  • 1 tsp baking soda
  • 1 tsp table salt
  • 1/2 tsp ground ginger
  • 1/4 tsp freshly grated nutmeg
  • 3/4 cup buttermilk
  • 2 1/4 cups peeled and grated butternut squash (about 8 oz)

For the icing and garnish

  • 9 oz (2 1/4 cups) confectioners' sugar
  • 3 Tbs buttermilk; more as needed
  • 1 tsp pure vanilla extract
  • 1/4 tsp freshly grated nutmeg
  • 1/4 tsp table salt
  • 1/4 cup finely chopped crystallized ginger

Make the cake

  • Position a rack in the center of the oven and heat the oven to 325. Butter and flour a 10 cup bundt pan, tap out excess flour
  • Using a hand mixer or a stand mixer with a paddle attachment beat the butter and sugar on medium speed in a large bowl until well combined, about 1 minute
  • Add the oil and beat until combined, about 15 seconds
  • Add the eggs one at a time, mixing well on low speed
  • Add the vinegar and vanilla and mix until just combined
  • Add half the flour and the baking soda, salt, ginger and nutmeg, mixing on low speed until just combined
  • Add half the buttermilk and mix until just combined
  • Add the remainder of the flour and buttermilk, mixing until combined
  • Stir the squash into the batter
  • Transfer the batter into your prepared bundt pan and smooth the top with a rubber spatula
  • Bake the cake until a tester comes out clean, about 1 hour
  • Remove from the oven and cool the cake in the pan for 30 minutes
  • Carefully invert the cake onto a wire rack. You want to do this while the cake is still slightly warm to minimize sticking.
  • When the cake is completely cool transfer to a serving plate

Make the icing

  • In a medium bowl using a whisk or hand mixer on low speed blend the sugar, buttermilk, vanilla, nutmeg and salt until smooth
  • Continue mixing and add more buttermilk a few drops a time until the icing is still quite thick but pourable
  • Pour the icing back and forth over the cake in thick ribbons, or drizzle using a spatula
  • Sprinkle with crystallized ginger
  • Let the iced cake sit at room temperature for about 45 minutes before serving

Sunday, February 22, 2009

Rufous, the red-lored Amazon

In September 1989 Myron got a new parrot. It was a red-lored Amazon that he named Rufous. Myron got Rufous when he was so young Myron had to hand feed him three times a day. Over the next twenty years Rufous learned to speak, saying "what are you doing", "bye", "hello birdie". In the last year or so he started mimicking my laugh.

Tonight as we were getting our dinner party underway we went into the kitchen and Rufous was in the bottom of his cage with his wings spread and his beak open. Myron picked him up and Rufous bit him, which Myron took as a good sign. Myron gave Rufous some water with a spoon, which he drank, and Myron returned him to his cage. Within a few minutes he was sprawled with his wings spread, panting.

Myron called the emergency vet, which did not have an avian vet on staff but said they would do what the could. By the time he got there Rufous was barely breathing. Rufous died shortly afterwards. The cause of death is unknown.

I can't imagine what Myron is going through right now. Having a pet for 20 years and losing it so suddenly is an unthinkable horror.

R.I.P Rufous, 1989 - 2009

Tuesday, February 17, 2009

Dining in the Vail area

In Colorado we stayed in Avon, which is about 8 miles from Vail proper. This is a playground for the super rich and the dining scene follows suit. That's not to say that the old Colorado cowboy culture has been completely subverted, though. During our stay we enjoyed everything from rustic cowboy fare at The Gashouse to the ultimate in fine dining at Kelly Liken's eponymous restaurant. In between we had soft-shelled crab po boy's, tenderloin sandwiches, amazingly good Chinese, and a spectacular dinner at a slopeside mountain cabin. Our least expensive meal was breakfast at Daylight Donuts in Breckenridge ($17) and the most expensive was at Kelly Liken in Vail ($440).

The Good

Our first night in town we looked through the dining guides and came up with a few ideas, then asked the front desk staff which one they liked. They all raved about Fiesta Jalisco's, which you may have guessed is a Mexican restaurant. It was a short (but very cold) walk to the restaurant, where we had to wait about 15 minutes for a table. The restaurant was packed and insanely crowded, and we heard several locals who were leaving say they had never seen it that busy.

The (American) traditional chips and salsa was served with a coleslaw made from shredded cabbage dressed in lime juice. It was incredibly good, and our waiter said it was a traditional accompaniment with fish tacos in Puerto Vallarta, a coastal town in the Mexican state of Jalisco.

The food was very good but the standout was the Original Margaritas. They consisted simply of tequila, cointreau, and lime juice. That's it. They were also shaken with ice and served in a martini glass, not on the rocks or frozen. It was a delicious concoction and one I'll be sure to work hard to perfect. Do I have any taste testers who will volunteer?

The Better

Colorado is known for wild game. They hunt everything that walks, flies, swims or crawls, and you can find it on a menu somewhere. Many restaurants specialize in wild game, so we sought one out. We were very happy to find The Gashouse in Edwards, about 15 minutes away from Avon. The decor features mounted animal heads of everything from deer and antelope to cape buffalo.

The must-have dishes were the buffalo carpaccio, which was lightly smoked but still served raw, and the truffle and parmesan cheese fries. Both were superb.

The Even Better

One night Myron booked us at Zach's Cabin, which is located behind the Ritz Carlton in Bachelor's Gulch, a part of the Beaver Creek ski resort. We arrived a few minutes early and had wonderful pre-dinner drinks at Spago's bar. At the designated time we went out to a sled that was drawn by a snow cat (for those unfamiliar think bulldozer, but lower to the ground and wider), which took us up the mountain to a cabin in the woods.

The restaurant is a classic log cabin, complete with a double-sided fireplace. We were seated in a cozy corner table and the magic unfolded. The decor and ambience were wonderful and the service spectacular. The elk tenderloin was butter tender, and baklava cheesecake was to die for. It was a dollop of delicious cheesecake filling in a fillo dough shell, drizzled with honey. Sublime.

The only disappointment was that the wine list was shockingly overpriced. Bottles I have bought for $20 were over $100. The least expensive wines were still over $30 and I wouldn't even buy them at $6, which is what they are in Charleston.

The Best

Kelly Liken has been called rising star among female chefs and she has been featured in magazines ranging from Bon Appetit to Sky Magazine. I'm not sure where I first learned of her, but I was reminded of her presence in Vail by the in-flight magazine. We had done dinner at Zach's Cabin, which was fairly pricey, so we weren't sure we wanted to do something even higher end. Finally I decided that since we were there I was going to splurge and worry about paying for it later. That's the American way, right?

One of the options was a custom tasting menu with custom wine pairings. We put ourselves in the hands of Chef Liken and the very capable sommelier, Jeremy, for a completely blind five course tasting menu. We started with the cobia crudo, continued with braised pork belly, honey marinated duck breast, Colorado rack of lamb, and finished with an Earl Grey tea infused chocolate truffle cake. It was a nearly orgasmic progression. All five courses were delicious, the wine pairings were perfect, and the service superb. The only complaint I could offer is it was a little loud and sometimes hard to hear, but even that is highly subjective and dependent on who is dining that particular night. This was one of the most memorable dining experiences of my life, rating up there with our dinner at La Pergola.

The most striking thing I came away with was being introduced to banyuls, which is essentially a French port made from grenache. It is lighter and brighter in fruit than port and pairs wickedly well with chocolate (we had it with the chocolate truffle cake). If you like port you owe it to yourself to seek this out.

Monday, February 16, 2009

advertising and marketing

There has been much talk in the Yellowverse about advertising, marketing and how the two interrelate -- or not. Most of the people I know still seem to correlate the two, and (ironically) equate the attempts at making a distinction just marketing spin. To be honest, I was one of them until I had an epiphany today. Before we get into that, let's start with some definitions:
Marketing is defined by the American Marketing Association as the activity, set of institutions, and processes for creating, communicating, delivering, and exchanging offerings that have value for customers, clients, partners, and society at large. The term developed from the original meaning which referred literally to going to market, as in shopping, or going to a market to sell goods or services.

Advertising is a form of communication that typically attempts to persuade potential customers to purchase or to consume more of a particular brand of product or service.
Okay... that still sounds about the same, right? First, advertising is a subset of marketing. Therefore all advertising is marketing, but not all marketing is advertising. Second, the distinction lies in the intent. Marketing is about disseminating information; advertising is about persuasion.

Still not clear? Suppose you're at a farmer's market and you want tomatoes. You see someone with tomatoes displayed, and you go buy them. He doesn't have to tell you to buy them or announce their availability, him simply presenting them is all the marketing you need. It would be advertising if he were yelling out loud "Get your fresh tomatoes here!" since he is trying to influence you to purchase his tomatoes. The announcement would be marketing, the persuasion (via the command "get") is advertising.

So, circling back to where I started, what led me to finally grasp the distinction between advertising and marketing was a blog post by Seth Godin titled "which comes first, the product or the marketing". In it he points out that most of the time you actually need the marketing first since that will drive product creation. Once I read that I recalled a Facebook status update by Matt White and a blog post by Ben Langhinrichs illustrating how this has started happening. IdeaJam is marketing because a community is exchanging information in an attempt to achieve something of value to them. Some entrepreneurial types are taking this and capitalizing on it by delivering products to meet the market demand.

Friday, February 13, 2009

my epic fall

Some of you have seen my Facebook posts about my epic fall today at Breckenridge. Here's the deal. We were going down Monte Cristo, our first run at Breckenridge. The terrain is rolling hills, some big and some small, and it's really varied. Myron was ahead of me and when it looked like things had flattened out I went into a tuck to catch up.

When you tuck while skiing you put a lot of weight on the front of your skis, not the back as one might think. You want weight on the front of your skis because that's what makes you go. Resting on your heels slows you down. So it was while in a tuck with my weight shifted forward that I hit an unexpected bump and went airborne. When I landed it was on the front of my skis, still in a tuck. Not the right position to be in since the force of the impact caused both my skis to pop off.

I was launched forward, leaving my skis behind, and landed on my face, primarily on the left side. My ski goggles scraped down my face and my chest slammed into the snow. The next few minutes/hours/decades were both a blur and frozen in time. I remember pulling my ski poles and gloves off, and ripping my goggles and hat off, all while rolling to my knees to try to catch my breath. My chest felt like an elephant was standing on it.

I know I was making some pretty horrible noises because I simply couldn't breathe, and I was scared shitless because my chest hurt so bad. My first thought was I had broken a rib and punctured a lung. I struggled for a long time to catch my breath, kneeling in the snow and wondering if I was going to die there.

Maybe two minutes after I fell someone came along and asked if I was okay. By then I had regained my breath and my composure and was gathering my scattered equipment. I skied on down and met up with Myron, who was about half a mile ahead of me. He said it was such an easy run that he didn't think to look for me since I usually ski better than him.

Here's what the damage looked like at lunch today.

We finished out the day and I skied amazingly well. We both love Breckenridge and the fault here is entirely mine. Not to say it doesn't hurt, but if I can take a fall like that and walk away with some bruises and aching ribs, I'll call it a good day.

Friday, January 23, 2009

I'm gonna get kicked off the island for this...

... and probably hunted down by lovely women with knives (possibly from a Caribbean island), but so be it.

I was hanging out in an online chat with some rather unsavory characters and they started talking about Post-Lotusphere Stress Disorder, leading to the inevitable top 10 list. I did not participate in the creation of this list, I'm merely the scribe capturing it for posterity. You will notice not every entry is numbered, there are more than 10 entries and there is no number 10. Creativity like this can't be bound by rules. Names have been redacted to protect the oh-so-deliciously guilty.

Top Ten ways you know you have PLSD

1. You have a sudden urge to put up a tent in your backyard, in Maine, in February, so family dinners will feel more natural.
2. You insist that all of you children's backpacks be yellow
3. All of your children's backpacks ARE yellow
4. You insist on rows of uncomfortable chairs in the living room for movie night.
5. You fill out an evaluation form after every television show you watch at home.
6. You fill out an evaluation form for completely inappropriate things. Out to the dining tent for you, mister.
7. You see a tchotke at a neighbors house and ask if you can have it if they swipe your card.
8. You get invited to a party, and don't tell your spouse just in case she wasn't invited.
9. You drink your coffee REALLY FAST so the Disney bots don't take it away mid-swallow.
for six months, every time you leave your bedroom you check to make sure you remembered your badgeholder.
You line up for lunch, even when eating at home.
you think it's normal to show up for work after only 2 hours sleep
You ask your spouse if you can stay in the same room you were in last year.
You are willing to listen to 5 minutes of crap talk just to get a free pen.
You keep asking your coworkers, kids, and spouse where you can get this year's CULT shirt from; they look at you in horror.
You ask the neighbors if it's ok to use their pool without a room key
You ask your spouse if she's coming to your session.
And if it merits a repeat.
You ask your neighbors if it is OK to use their driveway to park.
You ask your kid if he's filming your session
You put RFID badges on the cats.
you mutter "I can't remember if I'm swan or dolphin this year"
and then look for your two huge carp on your roof
you build a 3 stage waterfall from same said roof
In Maine, in February
You scream out SAKE! at the top of your lungs after finishing each drink
you wished they'd put your room number on your key, in case you ever need to go there
You applaud when your wife introduces a new dish for dinner, even though you seem to remember you should have had it years ago.
and you keep asking her, "Can I have this to go in a box, I'm late for my session"
You applaud after sex even if it wasn't that good. Then you hog the microphone for Q&A.
you have a favorite seat in every meeting room in 3 different disney hotels
You knock on neighbor's houses asking if they know where Jamfest (or SpeedGeeking) is.
You walk into your bedroom announcing, "OK, before we begin, please turn off all cell phones and pagers".
11. Every Wednesday night for four months, you randomly get on a bus.
12. You know what CULT stands for
13. You're jazzed because you have a CULT shirt for every day of the week.
you are hard-core because you have the original "Notes World Order" shirt.
14. You go home and claim to your spouse that you're going to be agile from now on.

hmm, "Brokeback Novak"... another CULT theme
beats my original suggestion, FSCK Portal.

Thursday, January 22, 2009

Cranberry lambic and root beer braised beef

The young lady who house sits for us loves root beer, so whenever we travel we buy some for her. There is usually some left and I find it too sweet to drink, so I was trying to think of a way to use it. While I was pondering this I remembered Myron bought a sampler of Samuel Adams beers and it included a cranberry lambic. A lambic is a type of beer from Belgium that started out 500 years ago as peasant home brew. The version produced today carries on the coarse and have an unrefined flavor. Fruit is often added to help counter the bitter aftertaste. It is too bitter for me to enjoy, so I wondered what it would be like if I combined the bitter lambic and the sweet root beer. The answer: DELICIOUS!

Ingredients Preparation

1 12oz bottle of root beer

1 12oz bottle of Samuel Adams Cranberry Lambic

1 – 1.5 lb stew beef

2T cooking oil

1t black pepper (for the beef)

1t black pepper (for the sauce)

1t salt (for the beef)

1t salt (for the sauce)

A medium-sized non-reactive pot with a lid in the 4 to 6 quart range. Nonstick is fine, but don’t use unenameled cast iron.

A simmer plate (assuming you’re cooking with gas)

A bowl or plate for holding the beef after browning.

  1. Toss the stew beef with 1t each of black pepper and salt

  2. Let stand 10 to 15 minutes at room temperature

  3. Heat the oil in the pot over medium-high heat until you see it ripple, about 60 – 90 seconds

  4. Add the beef and brown on all sides

  5. Remove the beef to a bowl or plate

  6. Reduce or turn off the heat so you can put the simmer plate on the burner, then return the heat to medium-high.

  7. Put the pot on the simmer plate and add the root beer and lambic into the pot.

  8. Bring to a boil and use a wooden spoon to scrape up the brown bits from the bottom

  9. Reduce heat to medium and simmer 15 - 20 minutes, or until the liquid reduces by a quarter to a third

  10. Add the beef, cover, and reduce the heat to its lowest setting

  11. Leave it to simmer for 90 minutes, stirring a couple of times to make sure there is enough liquid. Add water to keep the beef nearly, but not completely, submerged.

  12. Check it for doneness. You are looking for it to be tender enough that it comes apart when you press it with a spoon, but not so much so that you can see the beef separation simply by stirring it. This will take between and hour and a half and two hours, but you need to start checking early so you don’t overcook it.

  13. Stir in the remaining salt and pepper, adjusting to taste

  14. Serve with rice, pasta – or one of my favorites, Israeli couscous

Tuesday, January 13, 2009

a change of focus

I started this blog in 2006 mostly to vent about IBM and Lotus and poke fun at the zealot fanboys. In 2007 I was frustrated both with my job and the direction IBM was taking Notes and Domino so took a job doing Access and SQL Server development. I continued doing Notes development as a consultant to keep current with it. That continued until mid-2008. Shortly after ILUG I stopped all Notes and Domino work altogether.

Several things led to that decision. It was partly a final severing of the ties to my old job. It was also an admission that I will never be satisfied with Notes and Domino. The things that are important to me just aren't important to IBM, so it's time for me to move on. And about this time we had the fire at work in and that sapped all my spare time for several months.

We got our new HP blade system delivered at the end of December and I am in the process of learning how that works along with VMware ESX. I am also preparing for a complete rewrite of our internally built ERP software and transitioning to Ruby and postgreSQL.

On a more personal level, I am feeling very strongly drawn toward the culinary field. I have learned to love cooking over the past decade and it has reached the point that I am finding that is where my passion lies. Software development doesn't energize me anymore.

The focus of this blog will be changing. I will be posting about Ruby, postgreSQL, Linux, VMware, HP hardware, and cooking. It's going to be a hodgepodge and you'll never know whether you're going to get programming code or a recipe for soup.

Oh, and for the three of you who might care, I asked Yancy to remove me from PlanetLotus. Since the content hasn't been Lotus related for a long time and never will be from here on out, I thought it was best if I didn't clutter things with my off-topic chatter.

Wednesday, January 07, 2009

Domino 8.5 hot fix 1

If you're using Domino 8.5 be aware there is a hot fix already available. In a nutshell, adminp may not properly handle renames or deletes. I found a blog with a decent write up about it, including a link to Fix Central where you can drill down through six levels and finally get to the hot fix: http://www.lntoolbox.com/content/view/95/2/.