So, after upgrading a server from 5.0.2b to 7.0.2FP2 this week (the clients were 4.6.7!), I did a lot of cleanup and added the LocalDomainAdmins group. I know for a fact that at one point I renamed in ACLs the old admin groups as well. I was also able yesterday to delete a good many old accounts.
Well today we were unable to delete accounts. So I did the usual ACL checks on the NAB and even explicitly added my account. Everything was cool, but I got an error that I wasn't authorized to perform the operation (clicking the "Delete Person" button).
No errors in log. Nothing on the console. Nothing in DDM. Nothing but an error. So I go into Full Access Administration. Nothing. So then I decided to check Admin4.nsf ACL. Sure enough, LocalDomainAdmins was NOT in there! I know it was because I was looking through catalog.nsf verifying things yesterday.
But, I was then able to delete an account. And I also added LocalDomainAdmins to every db....
Now Playing: "Insanity" by Firewind
Technorati: Show-n-tell thursday
Showing posts with label Show-n-Tell Thursday. Show all posts
Showing posts with label Show-n-Tell Thursday. Show all posts
Thursday, July 26, 2007
Friday, July 20, 2007
Linux NSD Tip
Generally with the Linux NSD files you will find the "Input arguments" line with the -crashpid and -crashtid. For example:
Input arguments : -batch -crashpid 4459 -crashtid 134 -wrapper
Of course you can find out which process is running by searching for just the pid number compared to the processes listed in the Notes Process Summary section:
notes R .. 3347 3337 -bash -c /Domino/lotus/bin/server
notes R ... 3568 3347 /Domino/lotus/notes/latest/linux/server
...
notes R .... 4459 3568 /Domino/lotus/notes/latest/linux/http
So we've already determined that the http task was the crashing process. But here's another handy search:
crashpid:crashtid
Just put in the crashpid# then a colon followed by the crashtid# (Note that if the tid# is 3 digits that there should be 1 space between the colon and the tid. If the tid is 2 digits there would be two spaces - basically it's expecting up to 4 digits for the tid# with the leading digits being spaces instead of zeroes). This should help out in finding a db that may have caused it.
In this instance we would search the NSD for: 4459: 134
When that string is found, then you know that you're looking at the actual crash thread for the crashing process. For instance, you may see the following section:
/Domino/notesdata/Path/DB.nsf
Version = 43.0
SizeLimit = 0, WarningThreshold = 0
ReplicaID = 0x85256e42:0x034ece60
bContQueue = NSFPool [ 0006dc45]
Offline = No
DeleteInProgress = No
FDGHandle = 0xf024057a, RefCnt = 9, Dirty = Y
SemContQueue ( RWSEM:#0:0x029d) rdcnt=-1, refcnt=0 Writer=[ : 0], n=0, wcnt=-1, Users=-1, Owner=[ : 0]
By: [ http:4459: 90] DBH= 311, User=Imperial
...
By: [ http:4459: 134] DBH= 371, User=CN=User Name/O=Org
So, with this tip, you are able to determine that something in the Path/DB.nsf application was the cause of the server crash.
Technorati: Show-n-tell thursday
Input arguments : -batch -crashpid 4459 -crashtid 134 -wrapper
Of course you can find out which process is running by searching for just the pid number compared to the processes listed in the Notes Process Summary section:
notes R .. 3347 3337 -bash -c /Domino/lotus/bin/server
notes R ... 3568 3347 /Domino/lotus/notes/latest/linux/server
...
notes R .... 4459 3568 /Domino/lotus/notes/latest/linux/http
So we've already determined that the http task was the crashing process. But here's another handy search:
crashpid:crashtid
Just put in the crashpid# then a colon followed by the crashtid# (Note that if the tid# is 3 digits that there should be 1 space between the colon and the tid. If the tid is 2 digits there would be two spaces - basically it's expecting up to 4 digits for the tid# with the leading digits being spaces instead of zeroes). This should help out in finding a db that may have caused it.
In this instance we would search the NSD for: 4459: 134
When that string is found, then you know that you're looking at the actual crash thread for the crashing process. For instance, you may see the following section:
/Domino/notesdata/Path/DB.nsf
Version = 43.0
SizeLimit = 0, WarningThreshold = 0
ReplicaID = 0x85256e42:0x034ece60
bContQueue = NSFPool [ 0006dc45]
Offline = No
DeleteInProgress = No
FDGHandle = 0xf024057a, RefCnt = 9, Dirty = Y
SemContQueue ( RWSEM:#0:0x029d) rdcnt=-1, refcnt=0 Writer=[ : 0], n=0, wcnt=-1, Users=-1, Owner=[ : 0]
By: [ http:4459: 90] DBH= 311, User=Imperial
...
By: [ http:4459: 134] DBH= 371, User=CN=User Name/O=Org
So, with this tip, you are able to determine that something in the Path/DB.nsf application was the cause of the server crash.
Technorati: Show-n-tell thursday
Thursday, March 1, 2007
Quick Tip for System i Domino Shops (SnTT)
One important thing that System i shops have to keep in mind for Domino is making sure that the owner of all Domino data objects is the user QNOTES. In the past this has been a little difficult because you would have to specify each subdirectory in the path with the CHGOWN command.
But that has changed with Version 5 Release 4 of i5/OS. There is a new SUBTREE parameter for the CHGOWN command.
We have 3 Domino Partitions on one of our System i boxes. The data directories are similar to the following:
/LOTUS/DOMINO/servera
/LOTUS/DOMINO/serverb
/LOTUS/DOMINO/serverc
Now, if I want to make sure that QNOTES is the owner of all of the objects in all of the data directories, I just have to issue the following command:
CHGOWN OBJ('/LOTUS/DOMINO') NEWOWN(QNOTES) SUBTREE(*ALL)
Now Playing: "Seven Days Into Nevermore" by Balance of Power
Technorati: Show-n-tell thursday
But that has changed with Version 5 Release 4 of i5/OS. There is a new SUBTREE parameter for the CHGOWN command.
We have 3 Domino Partitions on one of our System i boxes. The data directories are similar to the following:
/LOTUS/DOMINO/servera
/LOTUS/DOMINO/serverb
/LOTUS/DOMINO/serverc
Now, if I want to make sure that QNOTES is the owner of all of the objects in all of the data directories, I just have to issue the following command:
CHGOWN OBJ('/LOTUS/DOMINO') NEWOWN(QNOTES) SUBTREE(*ALL)
Now Playing: "Seven Days Into Nevermore" by Balance of Power
Technorati: Show-n-tell thursday
Labels:
Domino 7.0,
Lotus,
Show-n-Tell Thursday,
System i
Thursday, February 22, 2007
Paste Special (SnTT)
Lately, I've been using the Edit > Paste Special menu more in Lotus Notes. Instead of doing CTRL-V now, I generally use ALT-E-S-T (if I want to paste in the plain text). The dialog box looks like this:

As you can see, there are many different options that are dynamic in relation to what is on your clipboard. If I just copy text from a browser, I wouldn't have the options for, say, Picture, HTML, or MS Office Excel Worksheet. But today I tried to paste something from Excel and I noticed that there were a lot of choices in the dialog. I guess I've just never tried this so some of these were new to me. I thought that some others may be interested to see what they do, so here is a graphic with numbered screen grabs followed by a brief explanation:

1. Pasted as MS Office Excel Worksheet
2. After pasting as worksheet, this shows how you can actually edit the pasted object inline inside Lotus Notes
3. Pasted as Rich Text
4. Pasted as HTML
5. Pasted as Picture
6. Pasted as Text
And options 3 and 4 are editable in a table format. Option 6 is editable but does not have column formatting like a table.
Technorati: Show-n-tell thursday

As you can see, there are many different options that are dynamic in relation to what is on your clipboard. If I just copy text from a browser, I wouldn't have the options for, say, Picture, HTML, or MS Office Excel Worksheet. But today I tried to paste something from Excel and I noticed that there were a lot of choices in the dialog. I guess I've just never tried this so some of these were new to me. I thought that some others may be interested to see what they do, so here is a graphic with numbered screen grabs followed by a brief explanation:

1. Pasted as MS Office Excel Worksheet
2. After pasting as worksheet, this shows how you can actually edit the pasted object inline inside Lotus Notes
3. Pasted as Rich Text
4. Pasted as HTML
5. Pasted as Picture
6. Pasted as Text
And options 3 and 4 are editable in a table format. Option 6 is editable but does not have column formatting like a table.
Technorati: Show-n-tell thursday
Labels:
Lotus,
Notes 7.0,
Show-n-Tell Thursday
Thursday, December 7, 2006
Who Read Those E-mails? (SnTT)
Wow, this is my first SnTT post in about 2 months. Lately I've replied to a couple of threads at devWorks where people have asked how to find out which emails someone with ACL access has read in Lotus Notes. This is not something that is available by default and I have asked the most obvious question at the forum: "First, I guess you should question why the person is in the ACL of the database if he/she shouldn't be looking at the documents. By granting people a specific ACL level, you are granting them permission to do whatever that ACL level will allow." The answer is that the person may have authority but is accessing it with no specific reason. I decided to run with my "Who Deleted That Document?" post and port it to log the opening of emails. Upon some further reflection, this may still not be 100% accurate in some scenarios. First of all, the reader would have to have a connection the server where the log database resides. Of course, you could port the code to log the offenses to a document in the current database. Secondly, this is not taking into account that the reader could copy/paste the emails into their own mail file. After brief investigation, all you have to do is modify the ACL for the offender to disable "Replicate or copy documents" in the Attributes section. Also, you could probably go a step further and add code in the "Post Open" option for the ($Inbox) folder to log if someone was looking in the folders but not actually opening the emails. Thirdly, this will not work if the offender is going through the web to open the emails. I can't think of an easy solution for Domino Web Access use. However, you could temporarily change the mail file to not be based on the DWA template and you could modify the Standard Mail template to do some type of logging via WebQueryOpen on the form (the code below should work that way with minor modifications) or port it to javascript in onLoad.
Here are the steps you may wish to perform:
1. Create a log database. This can just be based off the log.ntf template.
2. Set the log database's ACL for -Default- to be Depositor with nothing checked but "Create documents". This will prevent the person from seeing the log documents if he somehow figured out something was happening.
3. Disable copying for the user. On the mail database, modify the ACL for the offender to disable "Replicate or copy documents" in the Attributes section.
4. Add the following code to the PostOpen event for the Memo, Reply, and Reply with history forms if you are concerned with Calendar or To-Do documents. You could also add it to other forms.This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
Technorati: Show-n-tell thursday
Here are the steps you may wish to perform:
1. Create a log database. This can just be based off the log.ntf template.
2. Set the log database's ACL for -Default- to be Depositor with nothing checked but "Create documents". This will prevent the person from seeing the log documents if he somehow figured out something was happening.
3. Disable copying for the user. On the mail database, modify the ACL for the offender to disable "Replicate or copy documents" in the Attributes section.
4. Add the following code to the PostOpen event for the Memo, Reply, and Reply with history forms if you are concerned with Calendar or To-Do documents. You could also add it to other forms.
'Generate log event for opening of emails by someone other than the DB owner
If Not source.IsNewDoc Then
'If the user is not the database owner then log the document open
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dbowner As Variant
Dim prodoc As NotesDocument
Set db = session.CurrentDatabase
Set prodoc = db.GetProfileDocument("calendarprofile")
dbowner = prodoc.GetItemValue("Owner")
If session.UserName <> dbowner(0) Then
Dim delivereditem As NotesItem
Dim delivered As notesdatetime
Set delivereditem = source.document.GetFirstItem("PostedDate")
Set delivered = delivereditem.DateTimeValue
Dim OpenLog As New NotesLog(db.FilePath)
Call OpenLog.OpenNotesLog("HQAPP01/COMPORIUM", "ChrisDesigns\loggingdb.nsf")
Call OpenLog.LogAction("Email Opened: " + source.FieldGetText("Subject") + " From: " _
+ source.FieldGetText("From") + " Received On: " + delivered.LocalTime)
Call OpenLog.Close
End If
End If
'END logging of email opens
provided by Julian Robichaux at nsftools.com.
Technorati: Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Thursday, October 19, 2006
How is your NSF Buffer Pool? (SnTT)
The other week I decided to check into my NSF Buffer Pool settings - specifically the percent of database reads in the buffer pool. The buffer pool is a shared memory space that you can control on your Domino server. The "trick" is to have the "PercentReadsInBuffer" greater than 95%. If it is less than 95%, you may want to tweak the NSF_Buffer_Pool_Size_MB notes.ini value. This can take some time to achieve a good ratio. If your Buffer Pool is too high, then you're wasting system memory that can be better used for other tasks. If it's too low, then you might be able to increase it to find a good value so that a higher percentage of the reads are in the buffer pool.
IBM only recommends changing this on partitioned servers since you are sharing the memory. Most of the buffer pool information revolves around R5. Part of the reason for having this setting was that (ahem) "certain platforms" had low numbers for the maximum server memory. The buffer pool would let you allocate a specific amount for this Domino process. I think I set all of my servers buffer pools late last year and haven't touched them or really looked at the performance, so I was happy when I saw my PercentReads numbers! The old defaults were 300MB if you didn't change the buffer pool size. After having tweaked some of my servers, it turned out that 300 was a pretty good number for me. And Sametime servers can actually have a really low buffer pool setting since they normally aren't opening a lot of NSFs. Here are mine - how are yours?
Issue the following command from your server console: show stat database.database.b*
Production Mail Server: 450MB Buffer - 99.81% reads in buffer!
Production App Server: 300MB Buffer - 96.33% reads in buffer
Production IM Server: 50MB Buffer - 96.34% reads in buffer
Cluster Mail Server: 360MB Buffer - 98.44% reads in buffer
Cluster App Server: 300MB Buffer - 97.6% reads in buffer
Now Playing: "See No Evil" by Holy Soldier
Technorati: Show-n-tell thursday
IBM only recommends changing this on partitioned servers since you are sharing the memory. Most of the buffer pool information revolves around R5. Part of the reason for having this setting was that (ahem) "certain platforms" had low numbers for the maximum server memory. The buffer pool would let you allocate a specific amount for this Domino process. I think I set all of my servers buffer pools late last year and haven't touched them or really looked at the performance, so I was happy when I saw my PercentReads numbers! The old defaults were 300MB if you didn't change the buffer pool size. After having tweaked some of my servers, it turned out that 300 was a pretty good number for me. And Sametime servers can actually have a really low buffer pool setting since they normally aren't opening a lot of NSFs. Here are mine - how are yours?
Issue the following command from your server console: show stat database.database.b*
Production Mail Server: 450MB Buffer - 99.81% reads in buffer!
Production App Server: 300MB Buffer - 96.33% reads in buffer
Production IM Server: 50MB Buffer - 96.34% reads in buffer
Cluster Mail Server: 360MB Buffer - 98.44% reads in buffer
Cluster App Server: 300MB Buffer - 97.6% reads in buffer
Now Playing: "See No Evil" by Holy Soldier
Technorati: Show-n-tell thursday
Labels:
Lotus,
Sametime,
Show-n-Tell Thursday
Thursday, October 5, 2006
Upgraded to Sametime 7.5 on iSeries (SnTT)
Last Friday night I upgraded our internal Sametime server to 7.5. As part of that process, I had to upgrade the the 6.5.4FP1 Domino server to Domino 7.0.1 and then upgrade ST 6.5.1FP1 to 7.5. This worked like a champ and we haven't had any issues with the server this week. It was a very smooth upgrade.
One thing that we have been waiting on to be "fixed" was the poor screen sharing capabilities of ST 7.0 and earlier. It's one reason I didn't worry about taking the server to 7.0. After testing the screen sharing of ST 7.5 on my test server, I was very pleased with what I saw. So, this was a good reason for us to upgrade. We may be able to get rid of a WebEx account. Speaking of screen sharing, we did have one ST server crash this week while holding a test meeting. I've worked with Lotus a bit on that and it may be related to the Meeting Room preference to optimize screen sharing for performance. This basically drops the color depth to 8 bit and looks pretty bad. The NSD showed a crash due to some type of conversion. I'm thinking it may be the 8 bit conversion, but neither Lotus or I could reproduce this.
Another "gotcha" that we ran into is with the DWA integration with chat. There were actually 2 gotchas. First of all, if you are upgrading the Sametime server and you have chosen to have your DWA server set to load STLinks from the DWA server, you will need to delete the domino/html/sametime/stlinks directory on the DWA server and copy over the stlinks directory from the IM server. Then restart the DWA server's HTTP task and it works! Since I could see the java console error in IE about a StartIM{} function call, I figured it was something with the stlinks jar file. I think this may be the case if you have a 7.0 or earlier stlinks folder on your DWA server.
The second gotcha is also with DWA and I haven't actually "confirmed" it. We are almost complete with an MS XP migration from Windows 2000 in our company. Since going to ST 7.5, I have actually seen that a Win2K user without the Sun JVM worked for a day with the MS VM but then their DWA chat failed and I had to load the Sun JVM. That's really odd that it would work and then fail. It appears that only Sun JVM is supported, though.
Now Playing: "Taking Notes Podcast #34" by Bruce & Julian
Technorati: Show-n-tell thursday
One thing that we have been waiting on to be "fixed" was the poor screen sharing capabilities of ST 7.0 and earlier. It's one reason I didn't worry about taking the server to 7.0. After testing the screen sharing of ST 7.5 on my test server, I was very pleased with what I saw. So, this was a good reason for us to upgrade. We may be able to get rid of a WebEx account. Speaking of screen sharing, we did have one ST server crash this week while holding a test meeting. I've worked with Lotus a bit on that and it may be related to the Meeting Room preference to optimize screen sharing for performance. This basically drops the color depth to 8 bit and looks pretty bad. The NSD showed a crash due to some type of conversion. I'm thinking it may be the 8 bit conversion, but neither Lotus or I could reproduce this.
Another "gotcha" that we ran into is with the DWA integration with chat. There were actually 2 gotchas. First of all, if you are upgrading the Sametime server and you have chosen to have your DWA server set to load STLinks from the DWA server, you will need to delete the domino/html/sametime/stlinks directory on the DWA server and copy over the stlinks directory from the IM server. Then restart the DWA server's HTTP task and it works! Since I could see the java console error in IE about a StartIM{} function call, I figured it was something with the stlinks jar file. I think this may be the case if you have a 7.0 or earlier stlinks folder on your DWA server.
The second gotcha is also with DWA and I haven't actually "confirmed" it. We are almost complete with an MS XP migration from Windows 2000 in our company. Since going to ST 7.5, I have actually seen that a Win2K user without the Sun JVM worked for a day with the MS VM but then their DWA chat failed and I had to load the Sun JVM. That's really odd that it would work and then fail. It appears that only Sun JVM is supported, though.
Now Playing: "Taking Notes Podcast #34" by Bruce & Julian
Technorati: Show-n-tell thursday
Labels:
Domino 7.0,
Lotus,
Sametime,
Show-n-Tell Thursday,
System i
Thursday, September 7, 2006
Stored Name and Password on Web (SnTT)
I know my users probably hate me for this, but it's a quick security option to prevent the web browser from storing (or even prompting) to save the username and password from the login form used by your server. In Domino, it's really simple. In your login form (domcfg.nsf), put the following line of code in your HTML Attributes of both the username and password fields:
"autocomplete=\"off\""
Now Playing: "A King and A Kingdom" by Derek Webb
Technorati: Show-n-tell thursday
"autocomplete=\"off\""
Now Playing: "A King and A Kingdom" by Derek Webb
Technorati: Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Wednesday, August 9, 2006
Web Document Locking Version 0.1 (SnTT)
I've just had to implement document locking for a web application. What follows are the notes I have made on what it will do and all of the steps to reproduce it in other applications. I say it's "Version 0.1" because I know there are some options I can do to streamline the code. I can probably set a field value to pass parameters back into a single WebQuerySave agent or at least merge the webLock and webUnlock agents. Thanks to devWorks and Jake Howlett for information on the onbeforeunload event. And thanks to Marc for Agent and Query parameter code. Please, only positive criticism of the code... :)
See limitations at link below for the extra pop up window from the onbeforeunload event. I need to trap for when the user clicks OK. If I can do so, then it shouldn't throw up the onbeforeunload event window a second time:
onBeforeUnload (devWorks Posting)
Locking Options:
If Locked – no edit button if locked by another user and red text displays who has it locked
Going into Edit Mode – Locks the document
Closing form by Any Action Bar Button – Unlocks properly with no unload prompts
Navigating away from the form without using action bar – Currently two pop ups will warn you if you click OK to proceed from the form. I hope to get it back down to just popping up once, but this is a big start. Clicking cancel will take you back to the form so that you can exit the document gracefully. Clicking OK will close the document, unlock it, and not save any other modifications. This pop up would display if the browser is closed, another view is selected, another address is typed in the address bar, etc...
Form Modifications:
Text somewhere on the form:
Document is being modified by [Computed Value]
[computed value] = @Name([CN];$Writers)
Hide-when for text: @IsNewDoc | ( !@If(@IsAvailable($writers)))
Hide-when sample for Edit Button:
@IsNewDoc | ( @If(@IsAvailable($writers)) & !@If($writers=@UserName) )
HTML Head Content: (In the below code, substitute the "[[" and "]]" with "<" and ">", respectively.)
@Implode(
("[[SCRIPT LANGUAGE=\"JavaScript\"]]") :
("isEditMode = " + @If(@IsDocBeingEdited; "true;"; "false;")) :
("isLocked = " + @If(@IsAvailable($writers); "true;"; "false;")) :
("DBURL = location.protocol + '//' + location.host + '/" + @WebDbName + "/';") :
("DocUNID = '" + @Text(@DocumentUniqueID) + "';") :
"[[/SCRIPT]]";
@NewLine)
HTML Body Attributes:
"onbeforeunload=\"beforeunload();\""
WebQueryOpen:
@If(@IsDocBeingEdited;@Command([ToolsRunMacro]; "webLock");"")
WebQuerySave:
@Command([ToolsRunMacro]; "wqsAgent")
JS Header:
function beforeunload() {
msg = "----------------------------------------------------------\n";
msg += "Your form has not been saved.\n";
msg += "All changes you have made will be lost\n";
msg += "----------------------------------------------------------";
if (isEditMode && isLocked){
if (document.forms[0].closewarning.value="Yes") event.returnValue = msg;
}
}
onLoad:
if (isEditMode && isLocked)
{document.forms[0].closewarning.value="Yes";
}
onUnload:
window.onbeforeunload = null;
document.forms[0].closewarning.value="No";
if (isEditMode && isLocked) {
location.href = DBURL + "webunlock?openagent&unid=" + DocUNID;
}
Action Buttons: Second line is optional and really unnecessary
window.onbeforeunload = null;
document.forms[0].closewarning.value="No";
other code & submit() to call WebQuerySave
Agents:
wqsAgent: (just have this code somewhere in either WQS or whatever code you have that needs to update the backend document after form submission)
webLock:
webUnlock:
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
Technorati: Show-n-tell thursday
See limitations at link below for the extra pop up window from the onbeforeunload event. I need to trap for when the user clicks OK. If I can do so, then it shouldn't throw up the onbeforeunload event window a second time:
onBeforeUnload (devWorks Posting)
Locking Options:
If Locked – no edit button if locked by another user and red text displays who has it locked
Going into Edit Mode – Locks the document
Closing form by Any Action Bar Button – Unlocks properly with no unload prompts
Navigating away from the form without using action bar – Currently two pop ups will warn you if you click OK to proceed from the form. I hope to get it back down to just popping up once, but this is a big start. Clicking cancel will take you back to the form so that you can exit the document gracefully. Clicking OK will close the document, unlock it, and not save any other modifications. This pop up would display if the browser is closed, another view is selected, another address is typed in the address bar, etc...
Form Modifications:
Text somewhere on the form:
Document is being modified by [Computed Value]
[computed value] = @Name([CN];$Writers)
Hide-when for text: @IsNewDoc | ( !@If(@IsAvailable($writers)))
Hide-when sample for Edit Button:
@IsNewDoc | ( @If(@IsAvailable($writers)) & !@If($writers=@UserName) )
HTML Head Content: (In the below code, substitute the "[[" and "]]" with "<" and ">", respectively.)
@Implode(
("[[SCRIPT LANGUAGE=\"JavaScript\"]]") :
("isEditMode = " + @If(@IsDocBeingEdited; "true;"; "false;")) :
("isLocked = " + @If(@IsAvailable($writers); "true;"; "false;")) :
("DBURL = location.protocol + '//' + location.host + '/" + @WebDbName + "/';") :
("DocUNID = '" + @Text(@DocumentUniqueID) + "';") :
"[[/SCRIPT]]";
@NewLine)
HTML Body Attributes:
"onbeforeunload=\"beforeunload();\""
WebQueryOpen:
@If(@IsDocBeingEdited;@Command([ToolsRunMacro]; "webLock");"")
WebQuerySave:
@Command([ToolsRunMacro]; "wqsAgent")
JS Header:
function beforeunload() {
msg = "----------------------------------------------------------\n";
msg += "Your form has not been saved.\n";
msg += "All changes you have made will be lost\n";
msg += "----------------------------------------------------------";
if (isEditMode && isLocked){
if (document.forms[0].closewarning.value="Yes") event.returnValue = msg;
}
}
onLoad:
if (isEditMode && isLocked)
{document.forms[0].closewarning.value="Yes";
}
onUnload:
window.onbeforeunload = null;
document.forms[0].closewarning.value="No";
if (isEditMode && isLocked) {
location.href = DBURL + "webunlock?openagent&unid=" + DocUNID;
}
Action Buttons: Second line is optional and really unnecessary
window.onbeforeunload = null;
document.forms[0].closewarning.value="No";
other code & submit() to call WebQuerySave
Agents:
wqsAgent: (just have this code somewhere in either WQS or whatever code you have that needs to update the backend document after form submission)
Call doc.Unlock
webLock:
Sub Initialize
'Called on web QuerySave
Dim s As New NotesSession
Dim doc As NotesDocument
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Set doc = s.DocumentContext
Call doc.Lock(s.EffectiveUserName)
Call doc.Save(True,False)
End Sub
webUnlock:
Sub Initialize
'Called on unload and some other events
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim AgentParams As Variant ' will be returned as a String List
Dim UNID As String
On Error Goto ErrorHandler
Set db = s.CurrentDatabase
Msgbox "Unlocking Document"
AgentParams = getAgentParameters(s.DocumentContext, True)
If Not Iselement(AgentParams("unid")) Then Exit Sub
UNID = AgentParams("unid")
Set doc = db.GetDocumentByUNID(UNID)
If Not doc Is Nothing Then Call doc.UnLock()
Print "[http://server/" & db.Filepath & "/TicketsOpen?OpenView]"
Exit Sub
ErrorHandler :
DisplayErr("Initialize")
End
End Sub
Sub DisplayErr(CodeName As String)
%REM
Purpose: Display error message
Details: Displays an error message for the current error
on the status bar and in a dialog box
includes CodeName in message (generally name of calling function)
%END REM
Dim tmpString As String
tmpString = "Error on line " & Cstr(Erl()) & " in " & CodeName & " - Error " & Cstr(Err()) & " : " & Error$(Err())
Print tmpString
Messagebox tmpString
End Sub
Function getAgentParameters (AgentDoc As NotesDocument, lowercaseTags As Integer)
%REM
Purpose: Returns a list of all agent parameters
Details: Returns a list of all agent parameters
if lowercaseTags is true, List Tags are all in lowercase
if lowercaseTags is false, List Tags are in original case
%END REM
GetAgentParameters = getQueryParameters(AgentDoc, lowercaseTags)
End Function
Function getQueryParameters (Doc As NotesDocument, lowercaseTags As Integer)
%REM
Purpose: Returns a list of parameters
Details: Using Query_String_Decoded, returns a list of all parameters
if lowercaseTags is true, List Tags are all in lowercase
if lowercaseTags is false, List Tags are in original case
%END REM
Dim QS As String, QSArray As Variant, QSList List As String
Dim tmpVar As String, tmpVal As String
QS = Strright(Doc.Query_String_Decoded(0), "&")
If QS <> "" Then
QSArray = Split(QS, "&")
Forall tmpQItem In QSArray
tmpVar = Strleft(tmpQItem, "=")
If lowercaseTags Then tmpVar = Lcase(tmpVar)
tmpVal = Strright(tmpQItem, "=")
QSList(tmpVar) = tmpVal
End Forall
End If
getQueryParameters = QSList
End Function
provided by Julian Robichaux at nsftools.com.
Technorati: Show-n-tell thursday
Thursday, July 20, 2006
Putting SnTT Tips To Use In New App (SnTT)
I decided to take some cues from Nathan's post on using layers. Though my UI is far from where it should be, this is still a slight departure from our "usual" UIs here. I may or may not go with the right-side menu as Nathan did - I'm just so used to left-side menus... This application should go live on August 1, so there may be some other tweaks.

In the above graphic, you can see that I have a Show/Hide History option that will toggle a layer with an embedded view of the tickets entered for that username in the past. I grabbed the icons from a web development application I have. I probably will not get to go "all out" with switchable text/graphic buttons.
Now Playing: "Universal Mind" by Liquid Tension Experiment
Technorati: Show-n-tell thursday

In the above graphic, you can see that I have a Show/Hide History option that will toggle a layer with an embedded view of the tickets entered for that username in the past. I grabbed the icons from a web development application I have. I probably will not get to go "all out" with switchable text/graphic buttons.
Now Playing: "Universal Mind" by Liquid Tension Experiment
Technorati: Show-n-tell thursday
Labels:
Lotus,
OpenNTF,
Show-n-Tell Thursday
Thursday, June 29, 2006
Domino Server Network Compression (SnTT)
I was chatting with someone the other day about getting a cluster online. One of my suggestions was to make sure that compression was enabled on the network port for both servers (as well as clients for that matter!). I have found this to be most useful when replicating large amounts of data or archiving mail.
First of all, make sure that you have compression enabled. To do this, open your Domino Administrator client and go to the Configuration tab. Expand the Tools menu on the right and go to Server > Setup Ports. In the dialog box, just check "Compress network data" and click OK. This should require a server restart to become active.
When I've been archviving email, I can generally see a 2:1 compression ratio. In the image below, check out 6/16 and 6/23 (apparently 6/22 is not correct). On 6/23, you can see that I transmitted 1,092,484 KBytes Uncompressed. However, only 444,062 KBytes traversed the network. This is only 40% of the data being transmitted! Not only is the good for your network admins, but it also helps you to move along to the next task faster because you're waiting less than 1/2 the time for data transmission!

Technorati: Show-n-tell thursday
First of all, make sure that you have compression enabled. To do this, open your Domino Administrator client and go to the Configuration tab. Expand the Tools menu on the right and go to Server > Setup Ports. In the dialog box, just check "Compress network data" and click OK. This should require a server restart to become active.
When I've been archviving email, I can generally see a 2:1 compression ratio. In the image below, check out 6/16 and 6/23 (apparently 6/22 is not correct). On 6/23, you can see that I transmitted 1,092,484 KBytes Uncompressed. However, only 444,062 KBytes traversed the network. This is only 40% of the data being transmitted! Not only is the good for your network admins, but it also helps you to move along to the next task faster because you're waiting less than 1/2 the time for data transmission!

Technorati: Show-n-tell thursday
Wednesday, June 14, 2006
Boosted Personal Website (SnTT)
This is semi-Notes related. For my personal website, I am just running an Apache server on a WinXP PC at my house. It was cool to setup and I loaded Perl for some stat scripting - just a general way to broaden my horizons. I may get a real domain name, but for now, it's just at http://cwhisonant.gotdns.com.
Well, since I really didn't like how blogspot does the native image imports, I host pretty much all of my blog's images on my Apache server. Since I'm on a cable modem (5 Mbps down x 512 Kbps up), you have probably noticed slow image loads. I believe I have helped that out!
In steps Puakma Web Booster. Bruce Elgort interviewed Brendon Upson of Puakma Software for a Taking Notes Podcast in April. You should check it out. I followed the Domino steps for my Apache config. Now Web Booster listens on port 80 and gets the data from a different port on which Apache is listening. It does appear to help out image loads a lot!
Relating this directly to Domino, though, I am testing Web Booster at my company to use for http failover. I have it running on a Linux box. I began testing this late last year, but stopped for a while. I searched long and hard for a true failover solution - not just load balancing since my cluster server has much less horsepower. From correspondence with Puakma, they were actually enabling this feature in Web Booster. It seems to be working really well. I just need to get SSL going properly and I may be able to cut over to give my DWA users 24/7 uptime for mail access.
Technorati: Show-n-tell thursday
Well, since I really didn't like how blogspot does the native image imports, I host pretty much all of my blog's images on my Apache server. Since I'm on a cable modem (5 Mbps down x 512 Kbps up), you have probably noticed slow image loads. I believe I have helped that out!
In steps Puakma Web Booster. Bruce Elgort interviewed Brendon Upson of Puakma Software for a Taking Notes Podcast in April. You should check it out. I followed the Domino steps for my Apache config. Now Web Booster listens on port 80 and gets the data from a different port on which Apache is listening. It does appear to help out image loads a lot!
Relating this directly to Domino, though, I am testing Web Booster at my company to use for http failover. I have it running on a Linux box. I began testing this late last year, but stopped for a while. I searched long and hard for a true failover solution - not just load balancing since my cluster server has much less horsepower. From correspondence with Puakma, they were actually enabling this feature in Web Booster. It seems to be working really well. I just need to get SSL going properly and I may be able to cut over to give my DWA users 24/7 uptime for mail access.
Technorati: Show-n-tell thursday
Labels:
Lotus,
OpenNTF,
Show-n-Tell Thursday
Wednesday, May 24, 2006
Finally Giving Domino a Facelift! (SnTT)
I hate to admit this, but one of the databases I developed for the web is ugly! Until today, that is... After going to Lance Spellman and Dwight Wilbanks' session at Lotusphere 2006 about a Facelift for Domino, I finally decided to do something about my formerly ugly web database. For background purposes, the first production Domino server I installed was in August 2002 (at R5). We chose to wait for ND6 to be released in October of that year before doing a corporate migration. So, a good chunk of a year was spend migrating email.
One of the first projects requested was a contract workflow database. Since this entire workgroup was on iNotes, I chose to make it web-only. This database was created in August of 2003. With less than a year's experience I chose the easy route - java views and outline! I knew it would need updating later, but I just never got to it because it was working and we had other huge projects. Until today when I had some time to get to it. If you're in a rut on some web development, go check out Facelift for Domino. It's really as easy as running a menu action from the facelift database. Oh, and if you put it on a server, save it to a folder titled "facelift". Also, if you have categorized views, make sure the categorized column isn't set to 1 for the width (unless you're categorizing by a single character). After making the modifications, I notified the workgroup and they are very pleased with the performance and look. Thanks Lance and Dwight!!
Here is a before shot of one of the views:

And here is my facelifted shot of the database (I still need to work on the top frame's graphics...) Maybe I'll even do away with the frames.

Now Playing: "Solid As The Sun" by Neal Morse
Show-n-tell thursday
One of the first projects requested was a contract workflow database. Since this entire workgroup was on iNotes, I chose to make it web-only. This database was created in August of 2003. With less than a year's experience I chose the easy route - java views and outline! I knew it would need updating later, but I just never got to it because it was working and we had other huge projects. Until today when I had some time to get to it. If you're in a rut on some web development, go check out Facelift for Domino. It's really as easy as running a menu action from the facelift database. Oh, and if you put it on a server, save it to a folder titled "facelift". Also, if you have categorized views, make sure the categorized column isn't set to 1 for the width (unless you're categorizing by a single character). After making the modifications, I notified the workgroup and they are very pleased with the performance and look. Thanks Lance and Dwight!!
Here is a before shot of one of the views:

And here is my facelifted shot of the database (I still need to work on the top frame's graphics...) Maybe I'll even do away with the frames.

Now Playing: "Solid As The Sun" by Neal Morse
Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Thursday, May 11, 2006
Displaying E-mail Header Information (SnTT)
We all know about opening the email message and choosing View > Show > Page Source, right? On an email list someone asked how to display the header information today. I figured I would reply with a routine I have found and also use the chance to get another SnTT post out! So, here was my reply:
I have done the following in my mail file (I found it at devWorks a long time ago).
1. Create a LotusScript agent called "Get E-mail Headers."
2. The agent trigger should be "On event" by "Action menu selection" on "All
selected documents". It will give you the pop-up separately for each document.
3. Paste the code below into the Initialize Sub and save the agent.
4. With your e-mail folder open, just click Actions > Get E-mail Headers
and you will receive a pop-up window with the header information.
5. Then, if you were not aware, in Lotus Notes when you get a prompt
window you can hit CTRL-C and it will copy the text to the clipboard!! The prompt window looks like this:

6. The users can then paste the text in to a memo to you if you add this to the mail template.
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
Show-n-tell thursday
I have done the following in my mail file (I found it at devWorks a long time ago).
1. Create a LotusScript agent called "Get E-mail Headers."
2. The agent trigger should be "On event" by "Action menu selection" on "All
selected documents". It will give you the pop-up separately for each document.
3. Paste the code below into the Initialize Sub and save the agent.
4. With your e-mail folder open, just click Actions > Get E-mail Headers
and you will receive a pop-up window with the header information.
5. Then, if you were not aware, in Lotus Notes when you get a prompt
window you can hit CTRL-C and it will copy the text to the clipboard!! The prompt window looks like this:

6. The users can then paste the text in to a memo to you if you add this to the mail template.
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument,tempdoc As notesdocument
Dim m As String, n As String
Dim first As Integer, l As Integer
l = 1
Set db = s.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
While Not(doc Is Nothing)
'' create a temporary copy of the document
Set tempdoc = db.createdocument
Call doc.CopyAllItems( tempdoc )
'' re-read the document items to ensure you are getting the remaining fields and not the removed ones
NextOne:
Forall item In tempdoc.Items
If item.Name = "Received" Then
m = item.Text
first = False
For a = 1 To Len(m)
If ( Mid$(m,a,5) = " " ) Then
If ( first = False ) Then
Mid$(m,a,1) = Chr$(10)
first = True
Else
Mid$(m,a,1) = " "
End If
Else
first = False
End If
Next
If ( n = "" ) Then
n = "<Hop " & l & ">"
n = n & Chr$(13) & m
l = l + 1
Else
n = n & Chr$(13) & "<Hop " & l & ">" & Chr$(13) & m
l = l + 1
End If
m = ""
'' remove the current occurrence of the item so lotusscript will get the next one
Call item.Remove
'' write the document so it will not contain the removed item
Call tempdoc.save(True,True)
'' go back and re-read the document items to refresh the memory
Goto NextOne
End If
End Forall
If ( n <> "" ) Then
Messagebox n,,doc.Subject(0)
Else
Messagebox "No Internet Received Headers found.",,doc.Subject(0)
End If
n = ""
'' delete the temporary document
Call tempdoc.Remove( True )
Set doc = dc.GetNextDocument(doc)
Wend
End Sub
provided by Julian Robichaux at nsftools.com.
Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Tuesday, May 2, 2006
DDM Filters (SnTT)
I know it's Tuesday, but I thought I would post this Domino Domain Monitor tip early since I will be on vacation Thursday.
When configuring DDM, there is a set of default filters that can be used to report "simple events" from your Events4.nsf database. This can be really helpful for monitoring replication failures and message delivery failures. However, by default (at least for me), way too much was being logged, so I thought I would tweak it. From the DDM database, choose the option to "Open Configuration" (This just opens Events4.nsf). From there, just go to your "DDM Filters" view:

As you can see below, I have limited the severities of the events reported for Database, Messaging, Replication, and Security. I may tweak this some more after monitoring DDM further, but this is a good start that will limit how much you have to view.

Show-n-tell thursday
When configuring DDM, there is a set of default filters that can be used to report "simple events" from your Events4.nsf database. This can be really helpful for monitoring replication failures and message delivery failures. However, by default (at least for me), way too much was being logged, so I thought I would tweak it. From the DDM database, choose the option to "Open Configuration" (This just opens Events4.nsf). From there, just go to your "DDM Filters" view:

As you can see below, I have limited the severities of the events reported for Database, Messaging, Replication, and Security. I may tweak this some more after monitoring DDM further, but this is a good start that will limit how much you have to view.

Show-n-tell thursday
Thursday, April 20, 2006
Who Deleted That Document? (SnTT)
Ever have a problem with someone deleting data that should not have been deleted? Of course you should lock down the ACL, but what if you just want to track deletions in a database? Or possibly you want to prompt someone for a reason they deleted the document? While there is no native Domino log to display this, you can utilize the Database Script to get a handle on deletions.
This is how I have accomplished this task for various reasons. After looking through the Designer Help database and creating a log database, use the following code in the Querydocumentdelete sub of the Database Script. Also, you can grab as much data from as many fields as you would like. Further, you could implement a prompt for each document (inside the loop) or all documents (outside the loop) to have input for why the document was deleted.This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
And here is a sample of what the logging database can look like as a single repository for tracking multiple databases:

Show-n-tell thursday
This is how I have accomplished this task for various reasons. After looking through the Designer Help database and creating a log database, use the following code in the Querydocumentdelete sub of the Database Script. Also, you can grab as much data from as many fields as you would like. Further, you could implement a prompt for each document (inside the loop) or all documents (outside the loop) to have input for why the document was deleted.
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
Dim docsDelete As NotesDocumentCollection
Dim doc As NotesDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase
Set docsDelete = Source.Documents ' Docs chosen for deletion
Dim delLog As New NotesLog(db.FilePath)
For x = 1 To docsDelete.Count
Set doc = docsDelete.GetNthDocument( x )
Call delLog.OpenNotesLog("SERVERNAME", "pathname\loggingdb.nsf")
Call delLog.LogAction("The following user was deleted by " + session.CommonUserName + ": " + Cstr(doc.FirstName(0)) + " " + doc.LastName(0))
Call delLog.Close
'The following section emails a notification of the deletion
Dim maildb As NotesDatabase
Dim maildoc As NotesDocument
Dim rtitem As NotesRichTextItem
Set maildb = session.CurrentDatabase
Set maildoc = New NotesDocument( maildb )
Set rtitem = New NotesRichTextItem( maildoc, "Body" )
Call rtitem.AppendText ("The following user was deleted by " + session.CommonUserName + ": " + Cstr(doc.FirstName(0)) + " " + doc.LastName(0))
maildoc.Form = "Memo"
maildoc.SendTo = "Recipient"
maildoc.Subject = "Intranet Directory Document Deleted"
Call maildoc.Send( True )
Next
Continue = True
End Sub
provided by Julian Robichaux at nsftools.com.
And here is a sample of what the logging database can look like as a single repository for tracking multiple databases:

Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Wednesday, April 5, 2006
Linux Mail Archive Server Installed (SnTT)
Back in February, Jack Dausman posed the question of "How Much Free Space to Recommend on a Mail Server?" at his blog. The consensus was about 30% and it also depends on the drive activity. But I posted at the time that "We're at about 26% free and we are looking at either setting up a Linux Domino server for archiving mail to Network Attached Storage or just buying more physical disks. I prefer the archiving for performance reasons."
Jack responded with "Archiving onto a NAS is interesting, because NAS's are not normally recognized as robust enough to host databases. You'll have to post how well that works for you."
So here is a Show-N-Tell post about my experience setting this up. Since that time of being 26% free just 2 months ago, we're now about 21% free! When I got back to the office monday from the worship conference I had the xSeries in my cubicle. We ordered an xSeries 306m with Pentium 4 Processor 640 with EM64T (3.2 GHz 2M L2). I ordered RedHat Enterprise Linux (RHEL) 4 to run on it. According to Technote 1231920, Domino 7.0.1 is supported on Update 3 of RHEL 4 or Update 2 with the GDB from Update 3 installed. No biggie, right?
After configuring the RAID1, I loaded the OS that shipped with the server. This was, unfortunately, the base release. Off to RedHat's site, I snagged the Update 3 only to later find out that IBM does not have a RAID Controller driver for Update 3 to run on the xSeries 306m. There was one for Update 2, so I finally got that loaded and found the latest GDB and installed it.
The Domino server install took about 2 minutes! This machine really flies (as it should). I can't wait until IBM releases a 64-bit version of Domino. Since we had been testing this on an older system (PIII 650...), I didn't have to configure anything with Domino.
Now to the cool part - archiving the mail to our NetApp NAS appliance! Basically, I just edited the /etc/fstab file in Linux to include a line to mount the filesystem on boot. I came back and opened my archive and it was really fast. I mean really fast! I know that I was the only one on the system, but since this will be an archive-only server there will likely not be more than a couple of people with their databases open at once. Navigating through folders is rather quick as well. So last night I archived our IT Staff's databases. We currently have about 2.5 GB in archives now. I can't wait until I get to the 3-5+ GB mail files. I'm hoping to reclaim at least 35% of my entire mail store (conservatively). At that rate I should regain over 17% putting my iSeries storage back down to around 60% utilization. Oh, and I'll let Bruce know if I have any problems!
Now Playing: "Marvelous Light" by Charlie Hall
Show-n-tell thursday
Jack responded with "Archiving onto a NAS is interesting, because NAS's are not normally recognized as robust enough to host databases. You'll have to post how well that works for you."
So here is a Show-N-Tell post about my experience setting this up. Since that time of being 26% free just 2 months ago, we're now about 21% free! When I got back to the office monday from the worship conference I had the xSeries in my cubicle. We ordered an xSeries 306m with Pentium 4 Processor 640 with EM64T (3.2 GHz 2M L2). I ordered RedHat Enterprise Linux (RHEL) 4 to run on it. According to Technote 1231920, Domino 7.0.1 is supported on Update 3 of RHEL 4 or Update 2 with the GDB from Update 3 installed. No biggie, right?
After configuring the RAID1, I loaded the OS that shipped with the server. This was, unfortunately, the base release. Off to RedHat's site, I snagged the Update 3 only to later find out that IBM does not have a RAID Controller driver for Update 3 to run on the xSeries 306m. There was one for Update 2, so I finally got that loaded and found the latest GDB and installed it.
The Domino server install took about 2 minutes! This machine really flies (as it should). I can't wait until IBM releases a 64-bit version of Domino. Since we had been testing this on an older system (PIII 650...), I didn't have to configure anything with Domino.
Now to the cool part - archiving the mail to our NetApp NAS appliance! Basically, I just edited the /etc/fstab file in Linux to include a line to mount the filesystem on boot. I came back and opened my archive and it was really fast. I mean really fast! I know that I was the only one on the system, but since this will be an archive-only server there will likely not be more than a couple of people with their databases open at once. Navigating through folders is rather quick as well. So last night I archived our IT Staff's databases. We currently have about 2.5 GB in archives now. I can't wait until I get to the 3-5+ GB mail files. I'm hoping to reclaim at least 35% of my entire mail store (conservatively). At that rate I should regain over 17% putting my iSeries storage back down to around 60% utilization. Oh, and I'll let Bruce know if I have any problems!
Now Playing: "Marvelous Light" by Charlie Hall
Show-n-tell thursday
Labels:
Domino 7.0,
Lotus,
Show-n-Tell Thursday,
System i
Thursday, March 16, 2006
Quick Tip - Restoring Mail File (SnTT)
We all know that the Domino mail file storage architecture lends itself easily to restoring a single user's mail file. However, this tip may help save you some time in the event that someone needs a message restored that they have soft-deleted and which has subsequently been removed from the trash. I know, why delete something if it's important enough to need recovery? But it's bound to happen and we admins will have to make it right.
The problem with trying to restore that deleted document is that the client will automatically clean out the trash if the current date is past the number of hours specified for the soft-delete setting. The workaround is to restore the file and before opening the database in the client, open the database properties (via Administrator client) and change the soft-delete expiration time (in hours) in the advanced tab to be a value no greater than 65,535. Another workaround is to change your PC date to be the same date as that of the database you were restoring.
I also prefer to restore the file to a location outside of the Domino Data directory due to the potential that the Update and/or Indexer tasks could perform the hard deletion prior to your being able to change the database property.
Now Playing: "Cutting Words" by Jacob's Dream
Show-n-tell thursday
The problem with trying to restore that deleted document is that the client will automatically clean out the trash if the current date is past the number of hours specified for the soft-delete setting. The workaround is to restore the file and before opening the database in the client, open the database properties (via Administrator client) and change the soft-delete expiration time (in hours) in the advanced tab to be a value no greater than 65,535. Another workaround is to change your PC date to be the same date as that of the database you were restoring.
I also prefer to restore the file to a location outside of the Domino Data directory due to the potential that the Update and/or Indexer tasks could perform the hard deletion prior to your being able to change the database property.
Now Playing: "Cutting Words" by Jacob's Dream
Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Thursday, March 2, 2006
Notes Toolbar Tools I Use (Show-n-Tell Thursday)
I would like to briefly highlight three excellent utilities I use on my Notes Toolbar as custom buttons. Chime in if you have any other utilities that help make your Admin life easier...
1. Paste Information Application This is an extremely helpful utility provided by Alan Lepofsky. Basically, the toolbar button allows you to pick from a list of Rich Text documents that you can have routine information typed into. I have a copy of this located on a server that my entire team can use. We use it for canned replies to users. This is a huge time saver for me. The less time I have to correspond with users, the more I can devote to my other projects.
2. Document Viewer This is an OpenNTF application that I overlooked until I heard Bruce Elgort mention it in the last podcast. After downloading it, the installation documentation is in the "Docs" tab on the OpenNTF project page. This lets you have a toolbar button that will display all of the fields (field type, name, and value) on any document in any view. You should really get this if you hate weeding through the Notes Document Properties dialog box for the fields... (Will this ever get "enhanced" to be resized and show more information about the fields without having to scroll so much?) But I digress - that's why this tool is so handy!
3. Remote Server Console Just create a button with the following formula: @Command([AdminRemoteConsole]). This will bring up a console window that can be used to view the live console and send commands. Requires an Admin client to be installed.
Show-n-tell thursday
1. Paste Information Application This is an extremely helpful utility provided by Alan Lepofsky. Basically, the toolbar button allows you to pick from a list of Rich Text documents that you can have routine information typed into. I have a copy of this located on a server that my entire team can use. We use it for canned replies to users. This is a huge time saver for me. The less time I have to correspond with users, the more I can devote to my other projects.
2. Document Viewer This is an OpenNTF application that I overlooked until I heard Bruce Elgort mention it in the last podcast. After downloading it, the installation documentation is in the "Docs" tab on the OpenNTF project page. This lets you have a toolbar button that will display all of the fields (field type, name, and value) on any document in any view. You should really get this if you hate weeding through the Notes Document Properties dialog box for the fields... (Will this ever get "enhanced" to be resized and show more information about the fields without having to scroll so much?) But I digress - that's why this tool is so handy!
3. Remote Server Console Just create a button with the following formula: @Command([AdminRemoteConsole]). This will bring up a console window that can be used to view the live console and send commands. Requires an Admin client to be installed.
Show-n-tell thursday
Labels:
Lotus,
OpenNTF,
Show-n-Tell Thursday
Wednesday, February 22, 2006
DEBUG_THREADID=1 (Show-n-Tell Thursday)
For my own personal benefit as much as that of others, I try to maintain a list of some debugging parameters for Notes/Domino. For this Show-n-Tell Thursday (SnTT - per Chris Linfoot) tip, I would like to highlight the benefits of one debug parameter and a real world example of how it helped determine the cause of a crash.
The debugging parameter is:
DEBUG_THREADID=1
Per this Lotus technote, "This prefixes the console output with the process and threadid information in the format [ProcessID:Virtual Thread ID-Native Thread ID]. This can be helpful in identifying the process or thread holding a semaphore."
Well here is an example from the NSD of a crash we experienced this week:
Fatal Error signal=0x00000001 JOB=AMGR/QNOTES/070217 PID/TID=17095/0x000001c9
2/20/2006 4:39:47 Fault cleanup is in progress
Obviously that informs the Administrator that the AMGR task caused the crash. While this is a good start, it can only leave one wondering the agent that caused the crash. Please note, though the PID/TID (Process ID/Thread ID) section in bold. Searching through a dump of the console (or console.log, etc...), I would specifically look for the string "000001c9" since it is the Thread ID. It is best to search starting at the bottom. When I do that, I come to the following 3 console entries:
[17095:00002-000001C9] 02/20/2006 09:36:03 AMgr: Agent ('OS Administration' in 'workflow/costplus.nsf') message box: (unknown constant -MsgText002-)
[17095:00002-000001C9] 02/20/2006 09:36:06 AMgr: Agent ('OS Administration' in 'workflow/E16.nsf') error message: Object variable not set
[17095:00002-000001C9] 02/20/2006 09:36:06 AMgr: Agent ('OS Administration' in 'workflow/E16.nsf') error message: Cannot find external name: INITIALIZEADMINISTRATION
This informs me of several things regarding this AMGR task. First, we see that at this time there were two different databases as possible culprits for this error. But, since an AMGR task can only run against a single database per thread, I can rule out the top one as the problem. Secondly, I see that the last entry for this Thread was an error in a specific database and a specific agent having an issue with finding an "external name". In the past, I have generally been able to clear this error up by a design refresh or a recompile of LotusScript. (This agent, by the way, is an unmodified agent in a Lotus Workflow database from IBM - I would never (wink, wink) write an agent that crashes a server...) Third, we see that the last action by this thread was about 3 minutes prior to the server crash. It may be possible that another agent could be the culprit. It could also be possible that this agent simply hung for several minutes on this error or a subsequent error in the same agent. Further debugging may be necessary as well as potentially calling Lotus Support. If it is a specific agent, you could add some print statements to see where the agent is hanging.
This is, of course, not specific for the AMGR task and it is really most beneficial if you have more than one of the same task running on your system. I have about 5 AMGR tasks and multiple CLREPL and UPDATE tasks. I would definitely recommend turning this on as a first step in troubleshooting!
Now Playing: "Pull Me Under" by Accomplice
Show-n-tell thursday
The debugging parameter is:
DEBUG_THREADID=1
Per this Lotus technote, "This prefixes the console output with the process and threadid information in the format [ProcessID:Virtual Thread ID-Native Thread ID]. This can be helpful in identifying the process or thread holding a semaphore."
Well here is an example from the NSD of a crash we experienced this week:
Fatal Error signal=0x00000001 JOB=AMGR/QNOTES/070217 PID/TID=17095/0x000001c9
2/20/2006 4:39:47 Fault cleanup is in progress
Obviously that informs the Administrator that the AMGR task caused the crash. While this is a good start, it can only leave one wondering the agent that caused the crash. Please note, though the PID/TID (Process ID/Thread ID) section in bold. Searching through a dump of the console (or console.log, etc...), I would specifically look for the string "000001c9" since it is the Thread ID. It is best to search starting at the bottom. When I do that, I come to the following 3 console entries:
[17095:00002-000001C9] 02/20/2006 09:36:03 AMgr: Agent ('OS Administration' in 'workflow/costplus.nsf') message box: (unknown constant -MsgText002-)
[17095:00002-000001C9] 02/20/2006 09:36:06 AMgr: Agent ('OS Administration' in 'workflow/E16.nsf') error message: Object variable not set
[17095:00002-000001C9] 02/20/2006 09:36:06 AMgr: Agent ('OS Administration' in 'workflow/E16.nsf') error message: Cannot find external name: INITIALIZEADMINISTRATION
This informs me of several things regarding this AMGR task. First, we see that at this time there were two different databases as possible culprits for this error. But, since an AMGR task can only run against a single database per thread, I can rule out the top one as the problem. Secondly, I see that the last entry for this Thread was an error in a specific database and a specific agent having an issue with finding an "external name". In the past, I have generally been able to clear this error up by a design refresh or a recompile of LotusScript. (This agent, by the way, is an unmodified agent in a Lotus Workflow database from IBM - I would never (wink, wink) write an agent that crashes a server...) Third, we see that the last action by this thread was about 3 minutes prior to the server crash. It may be possible that another agent could be the culprit. It could also be possible that this agent simply hung for several minutes on this error or a subsequent error in the same agent. Further debugging may be necessary as well as potentially calling Lotus Support. If it is a specific agent, you could add some print statements to see where the agent is hanging.
This is, of course, not specific for the AMGR task and it is really most beneficial if you have more than one of the same task running on your system. I have about 5 AMGR tasks and multiple CLREPL and UPDATE tasks. I would definitely recommend turning this on as a first step in troubleshooting!
Now Playing: "Pull Me Under" by Accomplice
Show-n-tell thursday
Labels:
Lotus,
Show-n-Tell Thursday
Subscribe to:
Posts (Atom)