Monday, July 19, 2010

Warning: SQL Server database files are not backwards compatibile

This is something I just learned the very hard way. Here's the scenario:
  • You have a database you created on SQL Server 2005 or 2008 SP1
  • You detach it from the SP1 server and attach it to SQL Server 2008 R2
  • You then try to reattach it back to the original server
  • You get an error about the server only supporting up to version 655 (or 612 for SQL Server 2005)
The reason is every version of SQL Server has its own file version number: SQL Server 2005 is file version 612; SQL Server 2008, either RTM or SP1, is file version 655; and SQL Server 2008 R2 is file version 660. As soon as a server touches a file it upgrades it to that server's file version. In this case once you attach the database file to SQL Server 2008 R2 it's version 660. SQL Server can read files that are at the server's version number or lower, so you can't take a SQL Server 2008 R2 database file and attach it to any prior release.

It isn't uncommon for a new releases of server software to have a new file format to support new features. The problem is SQL Server gives you no option to go back. You can't do a backup and restore, either, because the newer backup file cannot be read by the older server. At this point your only option is to create a new database and copy the data across. Due to customer outcry over SQL Server 2000 to 2005 migrations Microsoft added a scripting feature in SQL Server 2008 that can copy the structure and the data. For my 6GB database it generates 20GB of scripts that take nearly three hours to run.

For most people it isn't that big of an issue. I'm in the process of testing a migration from SQL Server 2005 to SQL Server 2008 and wanted to use the same data on both versions. Microsoft has made this scenario incredibly difficult.

Sidebar: Most Domino releases include a new file version, which is called the on disk structure or ODS. Domino does not automatically upgrade to the new ODS so you can decide when to upgrade. You can also downgrade ODS versions by using "compact -R". I would much prefer this to Microsoft's forcing the issue and not giving you any reasonable downgrade options.

Thursday, May 20, 2010

Tip for VMWare Workstation on Windows 7 Enterprise

I'm running VMware Workstation 6.5* on Windows 7 Enterprise 64-bit. It works well but I keep getting the dreaded warning about the clock speed not matching. To fix this it's usually a matter of just updating the config.ini, as documented here.

Except that under Windows 7, you can't save the config.ini. In fact, you can't write to the C:\ProgramData folder at all. Not even if you change the owner of the folder to your account. So what do you do? You have to temporarily change the User Account Control settings to Never Notify.

Go to Start Menu -> Control Panel -> User Accounts and Family Safety -> User Accounts.

Select User Accounts

Select Change User Account Control Settings

Move the slider all the way to the bottom

Now restart your computer. Once it comes back up you should be able to edit the config.ini. After you are finished you should kick the UAC back up at least one notch.

* VMware Workstation 7 uses a different method for determining host CPU speed and does not need this manual adjustment.

Friday, April 30, 2010

Dining With Friends 2010 recipes

I have the recipes for this year's Dining With Friends event online. They're in ODT format, which should make some of you happy. I don't have Word or Excel installed on my home computer anymore. I was delighted to discover that box.net has a built-in file viewer for them. :-)

Dining With Friends 2010 - A Trip to Germany

Wednesday, April 28, 2010

New Massachusetts data security law

Have you heard about Massachusetts law 201 CMR 17.00? It went into effect on March 1, 2010, but seems to have flown under most of the reporting radars. If you store personally identifiable information (PII) about a Massachusetts resident, it affects you. It doesn't matter where you live. Here is how the law defines personal information:
A Massachusetts resident's first name and last name or first initial and last name in combination with any one or more of the following data elements that relate to such resident: (a) Social Security number; (b) driver's license number or state-issued identification card number; or (c) financial account number, or credit or debit card number, with or without any required security code, access code, personal identification number or password, that would permit access to a resident’s financial account; provided, however, that “Personal information” shall not include information that is lawfully obtained from publicly available information, or from federal, state or local government records lawfully made available to the general public.
If you do store this information get ready for some fun. The information must be encrypted end to end during transmission and even when at rest. If you store the information on a portable device the whole device must be encrypted. You must file a written statement with the Massachusetts state government stating that you have a plan for dealing with information security. You don't have to file the plan itself, just the statement.

The fines associated with this law are massive. Someone steals a laptop with unencrypted data on 200 residents: that'll be $1,000,000 please. If you are discovered to be passing PII in clear text that will cost $5,000 per resident's information exposed. Write down a Massachusetts resident's PII and don't shred it -- that's $5,000, too.

I will readily concede a lot of this is common sense, but some of it will be onerous for a small business to implement.

Thursday, March 25, 2010

SnTT: A LotusScript StopWatch Class With Nanosecond Precision

I was doing some work in Access and wanted to time how long it took to do something. I was doing a small scale test so the timing was pretty minuscule. After poking around a bit I discovered a way to use the Windows API to count CPU clock cycles. I converted it to LotusScript since virtually nobody who reads my blog cares about Access. :-)

Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Double) As Long
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpPerformanceCount As Double) As Long

Public Class StopWatch
Private m_StartTime As Double
Private m_EndTime As Double
Private m_Freq As Double
Private m_Overhead As Double

Private m_Days As Integer
Private m_Hours As Integer
Private m_Minutes As Integer
Private m_Seconds As Integer
Private m_Deci As Long
Private m_Centi As Long
Private m_Milli As Long
Private m_Micro As Long
Private m_Nano As Long

Private m_TotalSeconds As Single

Public Property Get Hours As Integer
Hours = m_Hours
End Property

Public Property Get Minutes As Integer
Minutes = m_Minutes
End Property

Public Property Get Seconds As Integer
Seconds = m_Seconds
End Property

Public Property Get Milli As Integer
Milli = m_Milli
End Property

Public Property Get Centi As Integer
Centi = m_Centi
End Property

Public Property Get Micro As Long
Micro = m_Micro
End Property

Public Property Get Nano As Long
Nano = m_Nano
End Property

Public Property Get TotalSeconds As Single
TotalSeconds = m_TotalSeconds
End Property

Public Sub StartTimer()
QueryPerformanceCounter m_StartTime
End Sub

Public Sub EndTimer()
QueryPerformanceCounter m_EndTime

Dim ElapsedTime As Double

ElapsedTime = (m_EndTime - m_StartTime - m_Overhead) / m_Freq
m_TotalSeconds = Csng(ElapsedTime)

m_Days = ElapsedTime \ 86400
If m_Days > 0 Then
ElapsedTime = ElapsedTime - m_Days * 86400
End If

m_Hours = ElapsedTime \ 3600
If m_Hours > 0 Then
ElapsedTime = ElapsedTime - m_Hours * 3600
End If

m_Minutes = ElapsedTime \ 60
If m_Minutes > 0 Then
ElapsedTime = ElapsedTime - m_Minutes * 60
End If

m_Seconds = Int(ElapsedTime)
If m_Seconds > 0 Then
ElapsedTime = ElapsedTime - m_Seconds
End If

m_Deci = Clng(Round(Clng(ElapsedTime * 10), 1))
m_Centi = Clng(Round(Clng(ElapsedTime * 100), 2))
m_Milli = Clng(Round(Clng(ElapsedTime * 1000), 3))
m_Micro = Clng(Round(Clng(ElapsedTime * 100000), 6))
m_Nano = Clng(Round(Clng(ElapsedTime * 1000000000), 9))

End Sub

Public Sub New()
Dim mStartTime As Double
Dim mEndTime As Double

'First figure out the API overhead
QueryPerformanceCounter mStartTime
QueryPerformanceCounter mEndTime

m_Overhead = mEndTime - mStartTime

'Now get the frequency
QueryPerformanceFrequency m_Freq
End Sub

End Class


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

Saturday, March 06, 2010

playing the hand you're dealt


To cut to the chase, I'll be starting classes at the Art Institute in July. Trust me, you couldn't possibly be any more surprised than I am.

By now you know I was selected as one of five finalists in a Food Network and Art Institutes scholarship contest, but I couldn't accept because the cost of acceptance was too high. The events that led from there to here still seem like a dream.

The contest rules state the scholarship can only be used for an associate or bachelor degree program, which cost $53,000 and $80,000, respectively. When I spoke with the contest coordinator I explained I couldn't cover the gap between the scholarship and the total cost of the degree. She took this back to the Food Network and AI, and they agreed to change the rules of the scholarship.

The Art Institute also offers a culinary arts certificate program, which is only three quarters long and only covers the core culinary classes. It also only costs $23,000, and I can cover $3,000 a lot more easily than $33,000, so I accepted the scholarship.

Even though I have known I was the winner for a while I was waiting for someone to pull the rug from under me. Stuff like this doesn't happen to me. As of yesterday, it's really official: Food Network Scholarship Announcement.

Sunday, February 07, 2010

what if 2000 characters could change your life?

In the Fall of 2008 Food Network aired The Chef Jeff Project. This show featured Jeff Henderson, a drug dealer and prison inmate turned chef who was trying to turn around the lives of six disadvantaged people in Los Angeles. The participants who completed the program were each offered scholarships to The Art Institutes culinary arts program. The Food Network also sponsored an essay scholarship contest for viewers, with a prize of $20,000 to the winner. I entered and never heard anything.

A year later, in Fall 2009, the Food Network was conducting their search for the next Iron Chef. In conjunction with this they did the same essay competition for another $20,000 scholarship to The Art Institutes. I thought back to my previous entry, and after seeing the ads for weeks I finally entered again. Weeks went by and I didn't hear anything, again, so I exhaled and went on with my life.

You can imagine my surprise when I got a call a few weeks ago and was told I'm one of the five finalists in the competition. Once I got over my shock I started looking more seriously at The Art Institutes. To be honest I had not looked at their curriculum... or their tuition costs. I was gobsmacked to learn that a two-year associates' degree program costs $53,000; a four year bachelor's degree is over $80,000.

The exorbitant cost made me take a hard look at what I want to do, as well as what I can afford to do. After a lot of soul-searching I finally decided not to pursue the scholarship competition. I appreciate getting as far as I did, I simply can't justify putting myself that far in debt.

I'm back to my old plan now, which is to pay off all my debt and attend culinary school in 2011. I'm going to continue experimenting and finding my culinary voice and point of view. Going through this got me thinking about how people are just as afraid of success as they are of failure. The first step truly is the hardest.

Friday, January 22, 2010

A cloud-based document sharing service that should be on your radar

I have been using box.net for a long time. They started out as another "me too" file sharing service. Over time they have adapted to the changing landscape and now have an incredibly compelling set of cloud-based document editing capabilities. I'm testing it out now and I'm very impressed. If you're in the market for cloud-based document sharing, box.net has an excellent toolset.

Tuesday, January 19, 2010

Finding the cluster size on Windows iSCSI targets

We're preparing to extend our SAN at work and use the new space as an opportunity to clean up our earlier sins. We are using an HP AiO 1200R iSCSI SAN, which runs Windows Storage Server 2003. This is connected to our HP BLc-3000 via iSCSI. The BLc-3000 has six blades all running VMware ESX 3.5.

As we start the process of rearranging our storage, we need to figure out was how the AiO presents the storage to VMware. We can see the RAID volumes on the AiO, but they aren't assigned drive letters. This makes it difficult to work with them because most of the Windows disk management tools assume there are drive letters.

After a lot of fiddling around we finally found it:
fsutil fsinfo ntfsinfo "c:\data volumes\[volume name]"
This syntax is necessary because the iSCSI volumes are mounted through junctions that are defined in the C:\Data Volumes\ path. There are two key things to note here. First, the folder names listed in the C:\Data Volumes\ folder have nothing at all to do with the volume names you'll find in Disk Management or diskpart. They are simply mount points and could be called anything. In the following image I have Disk Management open as well as the properties of one of my C:\Data Volumes\ entries.


You'll notice there is an entry in Disk Management called Data Volume but nothing with that name in C:\Data Volumes\. If you look at the leftmost dialog showing the disk space you can see this is a 1.93TB volume with the name Data Volume, which means it is mapped through C:\Data Volumes\Data Volume 2. I know it is confusing and it may be unique to our environment, but it caused us some frustration so I wanted to mention it. To match up the volume names you need to right-click the folder in C:\Data Volumes\ and select Properties, then click the Properties button beside Type: Mounted Volume to show the iSCSI disk properties. This will show you the volume name as it appears in Disk Management and let you match the volume names to C:\Data Volumes\ mount points. Just to be clear, it is the folder name in C:\Data Volumes that you want to feed into fsutil. Here is the output from my server:

C:\>fsutil fsinfo ntfsinfo "c:\data volumes\data volume 2"
NTFS Volume Serial Number : 0xe0b404f1b404cc4a
Version : 3.1
Number Sectors : 0x00000000f85df672
Total Clusters : 0x000000001f0bbece
Free Clusters : 0x0000000006823dee
Total Reserved : 0x0000000000000000
Bytes Per Sector : 512
Bytes Per Cluster : 4096
Bytes Per FileRecord Segment : 1024
Clusters Per FileRecord Segment : 0
Mft Valid Data Length : 0x000000002b358000
Mft Start Lcn : 0x00000000000c0000
Mft2 Start Lcn : 0x000000000f85df67
Mft Zone Start : 0x00000000000ea960
Mft Zone End : 0x0000000003ed77e0

Secondly, and this is a lot simpler, don't use a trailing slash on the volume name.

Wednesday, January 13, 2010

Recent cooking experiments

After the 42 hour pot roast I did two more. These were sirloin instead of chuck (they're from a different part of the cow). Sirloin has less connective tissue and is much leaner so it's often ground to mix with fattier cuts or cut up to use as stew meat.

The first sirloin roast went in for 21 hours and we ate about half of it, but it didn't have the texture I wanted. It was "done" but a little tough. I put the other half back in the bag and let it cook for another 24 hours, for a grand total of 45 hours. It came out with a texture like pastrami, which was great, but it was a little dry. Here were the final results:



After all this I finally decided that pot roast is just better done in a conventional oven so those experiments are over. Last night I put a chunk of boneless pork loin in at 58C and left it until I got home tonight. The total cooking time was about 20 hours. This was one of the best pieces of pork I've ever had. It was tender and succulent and had an incredible flavor. I browned it in a cast iron skillet after it was done to give it a bit of texture, and spooned some reduced apple juice over the top to serve. It was divine!



Right now I have some chicken breast cooking at 63.5C. I'll be sure to share how those go. I will be moving my cooking posts to a new site shortly and return this one to technical content. That way the people only interested in one or the other won't have to sift through the rest. Stay tuned!

Saturday, January 02, 2010

How to cook pot roast in 42 short hours!

I did my osso bucco experiment this past Thursday. After I pulled that out, in went a 6 pound chuck roast. I put some salt and pepper on it, and thinly sliced a stalk of celery to go with it. I read online that said a beef roast should be cooked at 58C to 64C for four to 18 hours. I set the temperature at 58C, put in the chuck roast at 6PM on Thursday, and checked on it around midnight. It was still tough so I left it until noon on Friday. That was 18 hours, and it was still tough.

Frustrated I turned to the Internet to find out the why piece of the failure puzzle. I finally came up with what seemed like reliable sources that said you had to cook tough cuts between 64C and 68C for 12 to 18 hours. I set my cooker to 68C at about noon on Friday, and left it alone until noon on Saturday. Here are the results.


This was after cooking for 18 hours. The pot roast is in a regular non-vacuum-sealed Zip-Lock bag. I squeezed as much air out as possible, then inserted a straw to suck the rest out. It's kind of gross and I probably won't be using that technique again. We use the double-layer bags to prevent freezer burn and the two layers have air between them, so it kept floating. I weighed it down with some small plates to keep it submerged.


The final product after a total of 42 hours cook time.


Breaking it down for plating. You can see that there is still a bit of fat marbled in the roast, but it wasn't cooked at such a high temperature that it all melted out. It created a succulent and delicious flavor.


The definition of fork tender.


The final plate. Corn bread, hoppin john, whipped sweet potatoes, and pot roast with brown gravy.

The score is now tied 1 to 1. :-) Next up: poached pears.

Friday, January 01, 2010

My first experiment with my Sous Vide Supreme

For Christmas Myron got me a Sous Vide Supreme. The idea is you put food in vacuum sealed bags, then let them slowly cook to the proper temperature in a very precisely controlled water bath. It is widely used in high end restaurants because you can cook food to the desired temperature and it just stays at that temperature. You can cook a perfectly medium rare steak and leave it for days without hurting it.

My first experiment was veal osso bucco. This is a cross-section of the lower leg, and typically you braise it for two to three hours in the oven. The closest thing I could find in the cookbook that came with the Sous Vide Supreme was bone in pork, which said 58C to 60C for four to six hours.

I put a little salt and pepper and a small pinch of saffron on each piece of osso bucco, put two per bag, and sealed them. Then I set the temperature on the Sous Vide Supreme to 58C and dropped them in and left them for six hours. Here is how it looked before I pulled it out of the cooker. Yes, it is done at this point and yes, I know it looks like brains.


I made a sauce from sauteed onions and celery with a touch of browned butter, chicken stock and heavy cream, and served the osso bucco with honey glazed carrots with pine nuts and green beans with sherry vinegar. Here are the results:


So, how did it taste? The flavor was okay, but the texture was weird. Sous vide cooking doesn't create crispness or browning, so you have to try to get that after the fact. You run the risk of overcooking it, though, since it's already completely cooked. The other issue is osso bucco has a lot of connective tissue. After doing more research I have learned that 58C just isn't hot enough to dissolve it, you need at least 60C.

One experiment, one mediocre result. I have a chuck roast cooking now, and I'll follow up after I pull it out. I already know I started out totally wrong so now I'm hoping to salvage it. The joys of experimentation. :-)

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.

(Declarations)
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
Wend

' 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 )
Loop
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.