Tuesday, October 30, 2007

Outlook vs Notes

I've been working with Outlook 2003 for a few months, so here are my observations on Outlook 2003 and how it stacks up to Notes.

Tabbed UI's ROCK

Lotus introduced the tabs in R5, and it was good. No longer did you have to try to keep track of all those open e-mails and Notes databases applications in the Windows task list, now everything was neatly confined to a single UI. Microsoft went a different direction and added the ability to group similar taskbar items. This doesn't serve the same purpose at all.

For starters, instead of quickly scanning a list you can easily see...

you have to click outside the current UI window, look at a list, and select from it.

It's a lot more mental context switching to go through. Also note that in Access I have the Provide Feedback form open, but you can't tell that here. You have to know that the second thing in the list is the currently open element. Since Notes makes the switching mechanism part of the same UI as the work being done there is no question. It gets even better when you have multiple copies of the same Access database open, such as when you're comparing versions of an application.

Where Am I?

Here is an exercise to try from Notes (I'm using Notes 8 Basic):
  • Open your mail
  • Right-click the calendar icon and select "Open in new window"
  • From the new calendar window, click the mail bookmark
  • Notice how it jumps back to the first window. The new window is fixed so it can't load something that is already open.
Outlook isn't as smart. If you do this you'll have two windows with your Inbox.


Grouped taskbar buttons makes this even more fun.

Since Outlook doesn't have tabs, this is the best you can do. One thing I do wish both Notes and Outlook had was a better way to flag which window is the original or first. For Outlook it's the one with the Outlook icon, and it's always either the leftmost in the taskbar or the bottom of the stack. As I close the windows, though, they eventually split apart into separate taskbar buttons when there is enough room. That's a little jarring and disorienting.

I like the tabs in Notes much better, but even then you can get tabs from the same application intermingled with others. It's hard to separate the e-mail with a link from the documents, views or databases the link opens. Notes 8 Standard offers the option to group tabs by application, but I've already expressed my opinion about Notes 8 Standard. :-)

Flexibility Is Good

When I used Notes on a daily basis I was bugged by all the reply and forward options. Eight ways to reply to an e-mail seemed like massive overkill to me. Three different ways to forward a message? Are you kidding me?! After working with Outlook for a while, I see the logic.

In Outlook you have two options for replying: Reply or Reply to All. You have one option for Forward. You set the default for whether they include history in the Options dialog(s). At first that seemed like enough, but then I realized it's probably 50/50 what I reply with history versus what I just reply to. In Outlook this means either deleting the history half the time, copying and pasting it in half the time, or it's a trip through the options: Tools > Options > (Preferences tab) E-mail Options button. Set up the reply style, reply to the message, then go back and undo all that since I don't want that to be the default.

You have exactly ZERO control over whether attachments are included. They are never included on a reply. They are always included on a forward. Want to reply with attachments? Use Forward. Don't want the attachments on a forwarded e-mail? Manually delete them.

I can understand that most users typically only use one style of reply or forward and Outlook works for the majority. But I can't imagine I'm the only person in the world who doesn't want to reply with history to every single e-mail I get. In Outlook I feel forced into that.

What Outlook Gets Right

Setting up a mailbox is just a tab on the user account while you're setting them up in Active Directory. Not having to deal with ID files is nice. The lack of options in Outlook means people can't get confused as easily. Outlook's offline mode is also nice in that it's just a checkbox. I check "use Exchange cached mode" and it automatically sets up the synchronization for me. I never even know it's happening. It would be nice if there was something in the Notes setup routine that would let you configure that during install (and script it for large rollouts).


Maybe 8 years of working with Notes has me so accustomed to it that I can't see the good in Outlook. I find the features anemic and administration is rudimentary. As for the much-vaunted usability, I wonder why Outlook 2007 introduced a Notes-style bookmark bar and doesn't fully implement the Ribbon UI?

Friday, October 26, 2007

A word of warning about VMWare networking

When you configure VMWare Workstation you can set it up to use bridged networking. When you do this, VMWare creates a couple of virtual adapters it uses for communication:

These are assigned static IP addresses in separate networks in the range. I'm not sure how it chooses which networks to use, but I'm guessing it looks at current established routes and picks something that won't interfere. Hopefully you can see where this is headed...

I ran into a problem where I couldn't connect to a server in And you guessed it, it turned out that VMWare had assigned to one of its virtual interfaces, which created route statements that redirected traffic. With VMWare becoming increasingly popular I wanted to point this out, just in case someone else notices strange results.

Wednesday, October 24, 2007

Recipe for Exchange Flambe

A flambe consists of a filling of some sort, something flammable, and an ignition source.


The gooey filling
2 Windows 2003 Servers running Exchange 2003 SP2, clustered
1 shared external hard drive array (RAID 5)

The flammable parts
0 IT staff who were involved in setting up current environment
0 documentation of current environment

The ignition source
1 recently hired Network Administrator who is on his way out after three months because he's a dumbass
1 new Network Administrator (to replace the above)
1 incompetent support person

Assembly Instructions

We're going to assemble our flambe in layers. First a bit of prep work
  1. Old Network Administrator gives new Network Administrator access to the domain administrator account. On his first day.
  2. Old Network Administrator leaves New Network Administrator to poke around Active Directory to learn the structure of things.
  3. It is Old Network Administator's last day, so he is gone. Old Network Administrator didn't set up any of the current environment, but he had some knowledge of it.
  4. New Network Administrator realizes most servers have some level of local security implemented, so he downloads and installs a software package on all the servers.
At this point we have an unstable environment, and nobody but the New Network Administrator has any idea that anything has changed. So now we need to start working on the gooey filling.
  1. Something in the software breaks the driver for the card that connects the Exchange server to the external RAID array.
  2. The RAID array starts flashing a light indicating a connectivity error.
There are a few directions to go from here:
  • Call support
  • Reboot the servers, then call support if it doesn't reconnect
  • Power down the servers, reboot the array, reboot the servers, then call support if it doesn't reconnect
Sometimes the obvious choice is the worst. Time to add some fuel.
  1. New Network Administrator calls HP Support.
  2. Support identifies one drive has a significant number of errors.
  3. New Network Administrator is instructed to upgrade the firmware on the drive.
  4. After the firmware is upgraded the drive is offline.
  5. It is pulled and reseated to allow the array to reinitialize it.
  6. The RAID controller doesn't recognize the new firmware, and it is flagged as failed.
Connectivity to the RAID array is spotty, and the servers are failing back and forth every few seconds. The Quorum, Transaction and Data drives are on different arrays and end up getting mismatched. Let's add another layer of fuel.
  1. New Network Administrator discovers the hardware failure in Device Manager and applies all outstanding Windows Updates.
  2. Because the servers are failing back and forth at a rate of about every five seconds, the connectivity to the array is sporadic and this causes the drives to start thrashing.
  3. With one drive already in a failed state, another one starts flashing a warning.
The only thing left to do is light it up!
  1. New Network Administrator pulls the drive flashing a warning. While another drive is offline.
And there you have it: one very dead Exchange 2003 cluster! All it takes is a little bit of knowledge, a lot of ignorance, and an incompetent support person.

An HP support rep finally came on site, dug through some logs, and determined that the firmware that was installed was completely wrong for our environment. Also, there is a known problem with one particular Windows update that breaks the installer for the drivers, so new drivers can't be installed and the old ones can't be reinstalled.

He replaced the failed drive, let the array rebuild, replaced the drive that had the bad firmware, and by some miracle we were able to recover three of our five Exchange storage groups. Now the New Network Administrator and the PC Tech are piecing together backups and trying to reconstruct messages from logs on our SMTP relay.

Tuesday, October 23, 2007

Boston recap

The trip went well, the wedding went off smoothly, and we marked another celebrity chef restaurant off our list. Unfortunately the groom decided we were his captive audience, which prevented me from getting together with my friends. Thanks a million to Alan Lepofsky, Richard Schwartz and Rob McDonagh for trying so hard. I owe you all a beverage of your choice at Lotusphere for dealing with the schizophrenia. :-)

Now for the hard part... neither Myron or I really liked Boston. To us it was towering skyscrapers, a confusing warren of streets, and some of the worst traffic and most discourteous drivers I have seen anywhere in the world. Even outside of city center the traffic and drivers were horrible. The bride's sister commented "People from other places come here and think they can just follow the signs to get somewhere. For the most part there aren't any signs, and if there are signs it only makes things worse."

Friday we ventured into town to go to Quincy Market and Faneuil Hall. On the way we ended up in a tunnel, which efficiently deposited us on the other side of Boston. None of the exits said anything about Faneuil Hall or even Downtown. On the way back, the exit signs did direct us to Downtown. One bit of frustration down we made our way to Quincy Market -- only to discover it's just a big food court with some tacky trinket shops. Tremendously disappointed with that we walked across the small plaza to Faneuil Hall, which was marginally better but still left us wanting something more... real. Perhaps living in a city that has more original pre-Revolutionary buildings than anywhere else in the US has us jaded.

Saturday morning was clear but overcast, and we drove up I-93 to Nashua, NH, which was about 20 minutes. We stopped for breakfast at a wonderful diner called Roland's, then headed across state road 111 nearly to the coast, where we picked up I-95 to head back to Boston. We went through numerous small towns. The people were friendly -- someone even stopped so we could turn left in front of them! -- and the scenery was lovely. I'd go back to New Hampshire without hesitation. I'd need a compelling reason to bother with Boston again.

Monday, October 15, 2007

got any ideas?

This probably isn't news to any of you, but just in case...

Bruce Elgort, Matt White and Sean Burgess have come together to create a new community site called ideajam. The intent is to give us (meaning you, me and everyone else in the Notes/Domino community) the opportunity to tell Lotus what features we want or ideas for improving their products and let other people vote on the idea.

Note that the site is currently in beta so participation is limited. The go-live is set for November 20th, 2007. Read the full press release here.

Summary of differences between Notes 8 Standard and Basic configurations

From IBM:

New features in Notes 8
    Notes 8 Eclipse-based ("Standard") configuration only
    Notes 8 "Standard" AND "Basic" configurations
    User Interface
    • Access to the Notes Getting Started Page using Help -> Getting Started Page from the main menu.
    • Sidebar to provide access and mini-views of Sametime Instant Contacts, Feed Reader, Calendar and Activities
    • Consolidated user preferences
    • Choice of preview pane location, below list or beside list.
    • "Open" button to open applications.
    • Ability to set how Window tabs display in user preferences.
    • Embedded Web browser, with the option to set default to your chosen browser.
    • Easier methods to find and work with Location documents.
    • New user interface for Help that lets you keep the Help pane open as you work.

    • Improved choices for "Reply to All," "Include History," and "Include Attachments."
    • Thread layout display when applying to a mail thread.
    • The ability to right-click operations for an entire mail thread, such as deleting a thread or moving a thread to a folder.
    • The ability to perform operations for an entire mail thread, such as deleting a thread, or moving a thread to a folder.
    • Within the Inbox, the ability to see all related messages in a thread.

    • Recent Contacts view that shows users with whom you have recently interacted, such as e-mail correspondence or chats.

    • New centralized search interface for queries and results (Domain Search, Find People, Find Application, Web/Intranet Searches available as search scopes).
    • New Search capability for Help that searches across all "books" in the help system, such as Lotus Notes Help and Activities Help.
    • Optional Desktop Search that can be launched by right-clicking Live names, and is also available in the Search scope drop-down menu.

    Composite applications
    • Composite applications that make it convenient for a user to access a collections of components (applications) to address a business need for a particular group of users.

    • The Home Page includes buttons for the IBM Lotus Productivity tools (Documents, Spreadsheets, Presentations), however, these tools are not included with the basic configuration of Notes, and the buttons are not active. To use these tools, you must install the standard configuration.
    • Ability to view collaboration history with another user, such as e-mail correspondence, saved chat transcripts, or shared documents.
    • Message recall
    • In-line spell Checking
    • Out of Office improvements
    • Advanced menus
    • Make available offline
    • Multilevel undo
    • Inline spell checking
    • Resilient mail threads
    • Display of unprocessed calendar entries
    • Display of canceled calendar entries
    • Locate free time for subset of invitees
    • Add personal notes to a meeting invitation

    • Changes to Contact form
    • Recent Contacts view is not available in the Notes 8 Basic Configuration but the storing of recent contacts does take place; they are available for user in mail addressing. Recent contact information can also be synchronized through the replicator.

    Integrated Instant Messaging
    • In the Notes 8 Basic Configuration, the integrated messaging functionality that was available in 6.5/7 is available, but not the instant messaging functionality based on Lotus Sametime Connect 7.5.

New features in Domino Designer 8
    Eclipse-based ("Standard") configuration only
    "Standard" AND "Basic" configurations
    • Narrow view organization - what columns do i see? do they wrap, etc.
    • Threaded views
    • Split action buttons
    • "Hide a column header" option
    • Show partial response hierarchies
    • Business card view
    • Alpha table view option
    • Default expandable column option
    • Add separators to outlines
    • @IsUsingJavaElement function
    • Onselect event in views
    • Agents that run "on server start"
    • Ability to hide all system right-click actions in views
    • Ability to edit Query Views (QVs) and DB2 Access Views (DAVs) in non-DB2 replicas
    • Improved design synopsis thru Tools/DXL Utilities/Transformer
    • Thumbnail files
    • On-demand collations for better performance
    • Database property to disallow searching without a full-text index
    • Set a field to show ellipsis (...) if contents will not fit in display area
    • K/M/G format for view columns
    • @GetViewInfo([GetFormName])
    • @function to return what folders a document is in
    • Java 5 support

User interface changes in the Notes 8 (Standard Configuration)

This section cites some of the user interface changes.

"concept" in Notes 7 client
equivalent in Notes 8 client
BookmarksOpen list
Personal Address BookContacts
Welcome pageHome page
DatabasesNotes Applications

Sunday, October 14, 2007

Julian's parsing challenge

It all started with Tommy Valand. He posted an idea he had for speeding up string concatenation. Julian Robichaux chimed in with a StringBuffer class he had written in LotusScript that was even faster. We're talking 75,000 iterations in 0.25 seconds! In the comments on Julian's blog he offered the challenge of finding the fastest way to parse a string a character at a time. Game on!

First up I tried a rather pedestrian approach of Mid$() in a loop. I created a string of 32000 characters, ran it a few times, and got an average time of 3.6 seconds. Not shabby, but I knew somebody out there would blow that out of the water so I had to do better. :-P

I knew if I could get the characters into an array I could rip through them lightning fast. But putting the characters into an array a character at a time so I could read them, when the whole point is to read the string a character at a time, was just silly.

I spent a lot of my early career coaxing the maximum performance possible out of Visual Basic. That often draws some laughs, but people shouldn't be so dismissive. I haven't worked a lot with VB.Net, so I know mostly about "classic" VB (versions 5 and 6), which is so similar to LotusScript you can copy and paste code from one to the other. It does have some advantages over LotusScript, such as pointers, but LS has its own bag of tricks.

With this background I hit upon the idea of using a byte array. In VB I would use them in place of streams: open a connection to an FTP server, bring the data down into the byte array, then write it out to disk all at once. It was extremely efficient and incredibly fast. But how to apply this to a string that's in memory?

When I read through Julian's StringBuffer class it rang a bell. I went digging and found a string handling library from Visual Basic Programmer's Journal back in 1999. The code is remarkably similar to Julian's. I'm in no way accusing Julian of plagiarism, it was just interesting to me that two extremely intelligent people came up with such similar solutions. It's like Fert and Grünberg coming up with giant magnetoresistance separately.

Anyway, in the interest of full disclosure
here's the VBPJ article (pdf) that inspired me. You may also be interested in this other article I found while researching this. It's all about VB6, but it is still an interesting read. Or it was to me.

Shoehorning this into LotusScript, here is what I came up with.

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, Byval Bytes As Long)

Sub Initialize
Const strBaseText = "test"

Dim sglStart As Single
Dim sglEnd As Single
Dim sglElapsed As Single

Dim strText As String
Dim strTextArray() As Byte
Dim strOneChar As String * 1 'a fixed-length string performs better

Dim lngSize As Long
Dim lngIndex As Long

For lngIndex = 1 To 8000 'create a string of 32000 chars
strText = strText & strBaseText

sglStart = Timer()
lngSize = Len(strText)
Redim strTextArray(0 To lngSize)
CopyMemory strTextArray(0), Byval strText, lngSize
For lngIndex = Lbound(strTextArray) To Ubound(strTextArray)
strOneChar = Chr$(strTextArray(lngIndex))
sglEnd = Timer()

sglElapsed = sglEnd - sglStart
Print "Elapsed time: " & sglElapsed

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

How does it perform? Well the first time you run it...

That's certainly respectable since it's so much better than the 3.6 seconds I was seeing with a native LotusScript solution. Running the agent a second time it's like this

A few things to keep in mind
  1. This is Windows only. CopyMemory is a Win32 API call so if you run this on a server that isn't Windows you will get an error.
  2. It's limited to 32K characters since that's the limit of an array in LotusScript. I picked 32000 as a round number.
  3. This is running on my fairly high-end home PC: Windows XP SP2 32-bit, Athlon 64 FX 5600+, 4GB DDR2, Seagate 7200.10 SATA2 drives. Your performance may vary.
Julian said he was going to look for a native solution that could top this, and since I cracked open the Windows API, he's going for Notes C API. That is a black art and he knows it well, so I'm skeered. :-|

Postscript about CopyMemory

It occurred to me that some people might be wondering why CopyMemory works. Why does it take a string and put the ASCII values of the characters into an array when I only give it the first element? It has to do with the way strings are stored in memory. In memory there isn't an "a" stored. It's the ASCII code. Variables are stored in one continuous segment of memory, whether it's a string or an array. So when you pass the string to CopyMemory, you're telling Windows "put the first byte in the string into slot 0 of the array, and continue doing this for X elements". Since the string is already in memory, and so is the byte array, it's able to do this move in one operation. That's why it's so insanely fast.

What I found genuinely surprising was that looping through the resulting array and using Chr$() to do assignments to a variable was so fast. Based on my experience with VB (and as shown in the article linked above), Chr$() is usually a fairly slow operation. The Notes API developers did some kind of mojo that makes this function incredibly fast in LotusScript.

Thursday, October 11, 2007

marumushi newsmap for Netvibes

I have been a huge fan of the marumushi newsmap since I first came across it while reading about treemapping. Yes, I find data visualization algorithms and processes interesting. But you already knew I was weird. Anyway, the marumushi newsmap is one of the ways I get news that is somewhat independent of the mainstream outlets and I was pleased and surprised to discover you can get your daily serving of marumushi via a Netvibes widget! The biggest limitation is that it only lets you select a single category at a time, but it's still highly functional.

Wednesday, October 10, 2007

I get all the news I need from the weather report

(with all due respect and proper credit to Messrs. Simon and Garfunkel)

I've been thinking a lot about the state of reasoned debate in the US. Someone I know who works at CNN has always been fond of pointing out that all the major US media outlets are owned by entertainment companies, and that is one of the reasons news reports have devolved into lurid sideshows. Here is a brief rundown of who owns what:
  • CBS is now a stand-alone company after having gone through acquisition first by Westinghouse then Viacom. Currently they also own Showtime, The Movie Channel, UPN (now known as CW after a merger with WB), Paramount theme parks, and Simon & Schuster publishing.
  • NBC is owned by Universal Studios.
  • ABC is owned by Disney.
  • Fox is owned by News Corp. It's got news in the name, but that's about as far as it goes. News Corp is a huge media conglomerate, owning a total of 37 TV stations, 13 magazines, over 120 newspapers (including New York Post) and a a vast number of Internet companies (including Myspace.com).
  • CNN is a subsidiary of Time Warner.
Complete lists can be found at freepress.net.

Where do you go to get news from a source that isn't driven by the entertainment industry? When a handful of companies control the media, and their primary focus is entertainment rather than intelligent discussion, you end up with the mess we have now. I'd be willing to bet that if I mention the name of Paris Hilton anyone can tell me who she is. How many people have heard of Albert Fert or Peter Grünberg?

I gave up on traditional news media several years ago. I'm down to watching The Weather Channel long enough to catch the local forecast. Even that has started down the path toward sensationalism, though, so I check the weather online more than I do on the TV.

Tuesday, October 09, 2007

I'll be in the Boston area October 18 - 21

Myron and I are heading to Woburn, MA for a wedding. [I've been told it's pronounced "woo-buhn".. and Yankees say Southerners have accents!] We fly in on Thursday (October 18th) and leave on Sunday (October 21st). We don't have any plans yet other than the rehearsal dinner Friday evening and the wedding Saturday evening. I'm not sure the timing of the flight out on Sunday. Is there anyone out there in blogosphere land who wants to get together while I'm in the area? Barring that, does anyone have suggestions of what to do in Boston?

Tuesday, October 02, 2007

giving up on blogs.msdn.com

There is a lot of good content on blogs.msdn.com. That's where all the development teams post information, so it's become a watering hole for anyone who needs to know information straight from the source. Unfortunately every blog is moderated, and they have a truly terrible spam filter. The end result: I've only ever had one comment posted on anything on blogs.msdn.com without contacting the blog moderator. If I have to post a comment, then follow up in a few days to let the blog moderator know I posted a comment, it's just too much work for me to participate in the discussions. I'll continue reading the blogs since they're an excellent resource, but their overall usefulness is severely hampered by an unfriendly policy (moderation) and a horrifically bad spam filter.

UPDATE 10/3/20007

I had an e-mail exchange with Zac Woodall, the Access program manager, and Clint Covington, who also works on the Access team but I don't know his title or role. Between the two of them, here is what they offered:
(Zac) I'm sorry to hear you're having issues with the comment post functionality MSDN gets from Telligent's Community Server 2.0

(Clint) Have you tried to create an MSDN account?... I think it should solve the problem for you.
This brought up two issues. First, I really hate it when a company uses a third party product and then blames the third party for the product's shortcomings. Second, looking at the Access team blog I couldn't figure out how to create an MSDN account because it doesn't have login/logout links. Other MSDN blogs do (in the upper right). I created an account but I haven't tested Clint's theory yet. If it works it's a pretty lame implementation, but that's been par for the course so far.