"I feel sorry for people who don't drink. When they wake up in the morning, that's as good as they are going to feel all day long."
That's some good hangover optimism for you. By the way, is it true that the German word for hangover is "Katzenjammer", which means "wailing of cats"? If so, that's quite a good description...
As with the dbActivity program, please feel free to turn it into an OpenNTF project if you think there is something worthwhile you can add to it.
One interesting thing about the code is that it uses an undocumented API function (OSSetCurrentDateTime) to sync the time, which takes a few extra steps in C. If you want a real-world example of how to use LoadLibrary and GetProcAddress to call a function from a DLL file, here you go.
It also occurred to me that you could do the same thing in LotusScript, if you wanted to. So along with the source code for ntimeset, I also wrote and published a LotusScript agent that does the same thing. That's two, two, two tips in one.
So I don't want to hear any of you complaining anymore about your Domino server time drifting from the operating system time. Okay? Okay.
Due to numerous requests (no really, there actually were numerous requests for this), I have released the dbActivity command line program as open source. I added one piece of functionality to the program -- the ability to use wildcards in the database name parameter, so you could process multiple databases with a single call -- and I added some comments to the code itself so it wouldn't be too cryptic.
I guess that's my Christmas present to everyone this year. And if you don't celebrate Christmas...well, I'm not sure what you want to call it. Just make something up.
And now, the long version of this blog entry:
Okay, I finally got my butt in gear and cleaned up the code for the dbActivity program so I can feel sort of good about putting it out there as an "open source" program (if I release the source code, does that automatically make it "open source", or is there something else I have to do to qualify?). If I had my druthers, I'd have rewritten the whole thing from scratch, but I know I'm never going to spend that much time on a program like this, so I just ended up deleting some unused code, moving a few things around, and adding a fair amount of comments.
I've actually had more people ask me for the source code of this program than any of the other ones on the site, which is a little surprising to me (I would have guessed it would be ScriptSearch or DelStubs). But, If that's what people want, then that's what I'll work on. Ultimately I wouldn't mind posting the source for all my command line utilities, but there really is a lot of clean up and testing I'd have to do for each program before I did. One step at a time, right?
I have to admit that I was a little reluctant to release the code at first, for the simple fact that I'm not a very good C programmer. I feel like I hack my way through all of my C programs, and after suffering through a ton of compiler errors every time I try to make a change, I can [sometimes] eventually get a program that works. But laugh if you will, I don't really care (or I pretend not to anyway). If you can make it better, be my guest.
Which brings me to my next point: if anyone would like to take this on as an OpenNTF project, you're more than welcome to (just please give me credit somewhere). I would do it myself, but I don't think I have the time or desire to really do anything else useful with the code. And I also don't think it's fair to just dump the code out on the OpenNTF site without a watchful owner.
So if you do decide to move this over as a real OpenNTF project, please make sure that you actually do something with it, instead of plopping it out there just so you can have your name on something.
And the last thing I'll mention is: even if you're not interested in the tool itself, there's one little trick I use in this program that may be interesting to you if you do any Notes API command line programming yourself. I have some code in there that actually swaps the stdout and stderr streams at the beginning of the routine. The reason I do that is because some versions of Notes will prompt you for a password using stdout and stdin if your API program needs to be authenticated in any way, and if you're piping the output of the program to a text file you'll never see the prompt -- unless you swap stdout and stderr like I do in the program. See the code for more details.
That's all. It's late. I'm going to bed now.
Then I rebooted and...well, maybe it's my imagination, but everything seems a lot faster when I'm browsing. I can imagine that it would be, since you're normally downloading a whole bunch of stuff from a web page in order to display it (HTML source, CSS files, JS files, images), and if you get rid of the 2 downloads at a time restriction then everything is going to come down all at once.
On a somewhat related note (Internet browsing), I had been testing Avant Browser for a multi-tabbed interface to Internet Explorer, but at Erik Thauvin's suggestion I switched over to MyIE2, and I've been very pleased. I still use Firebird almost exclusively at home, but I really need to use IE at work, so at least with something like MyIE2 I've got tabs. Can't live without tabs anymore...
PROMPT_CHOOSEDATABASE (notesUIWorkspace.Prompt constant - 13)
@Command( [AdminSendMailTrace] )
@Command( [AdminOpenStatistics] )
@Command( [AdminOutgoingMail] )
@Command( [AdminOpenServerLog] )
@Command( [AdminOpenAddressBook] )
@Command( [AdminOpenCertLog] )
@Command( [AdminDatabaseQuotas] )
@Command( [AdminCreateGroup] )
@Command( [AdminStatisticsConfig] )
@Command( [AdminOpenUsersView] )
@Command( [AdminOpenServersView] )
@Command( [AdminOpenGroupsView] )
@Command( [AdminDatabaseAnalysis] )
PostOpen (supported, but should use onLoad)
QueryClose (supported, but should use onUnload)
QuerySave (supported, but should use onSubmit)
Entering (supported, but should use onFocus)
Exiting (supported, but should use onBlur)
Does anyone know of anything else to watch out for in the code? I can search for these things using DDSearch, but I want to make sure I'm looking for everything.
(BTW, I cross-posted this to the LDD forums, if you want to look there for any responses as well)
UPDATE: I got a couple responses on my LDD post, and I also found out that several of the @Command( [FileExport] ) options seem to be missing in the 6.x code stream. And I ran across an LDD post by Ben Poole that had some good things to watch out for.
For example, just today I got my first RBOD in the 6.5 client (that's "Red Box of Death", for any non-Notes users in the studio audience). I've seen the old RBOD plenty of times before, which looked like this:
But I was pleasantly surprised to find that the new improved 6.5 RBOD looks like this:
You can see that the new message has just that little bit of extra information that makes all the difference. It's that kind of attention to detail that will keep me coming back for more.
There's a Notes API function called NIFOpenCollection that is used to open a collection of notes (usually views), and the first two parameters it takes are a handle to the Notes database that contains the collection (hViewDB) and a handle to the Notes database that contains the data notes for the collection (hDataDB).
In the C-API documentation for R5 it says:
NOTE: Only the following configurations are supported by NIFOpenCollection for views: the hDataDB argument references the same database as the hViewDB argument, or the hViewDB argument references a LOCAL database, and the hDataDB argument references a remote database. For folders, the hDataDB argument must reference the same database as the hViewDB argument.
So the database that contains the view can be different from the database that contains the data? How does that work? How can you have a view in one database that references documents in another database? How can I make me one of them views?
Tech Support: "Ok, now click your left mouse button." Customer: (silence) "But I only have one mouse."
We've all had those days before...
However, every year I try to make myself ignore all that and just enjoy the holidays. One thing that really helps is watching all the corny Christmas movies that are on all month (or that I own on DVD). Sure, some are flops, but overall they help me feel a little more accepting of my fellow man. I also just got a great book called Are You Grumpy, Santa?, which was a good laugh.
Cooking also seems to help get me in the mood. We'll be making some crab dip again this weekend, and I just put a couple of loaves of banana bread in the oven. Just the smell of the fresh banana bread kind of makes me all warm and fuzzy (one of these days I'll give jonvon's recipe a try too). I've heard before that the sense of smell has an incredibly strong association with memories and emotions, so surrounding myself with good smells always brightens things up.
Then, of course, there's the presents. In a weird sort of way, buying things for other people makes me feel good -- even if I end up washing my hands a couple hundred times an hour as I'm doing it. You can even do a lot of germ-free shopping on the Internet these days, as long as you know what you're getting. I was cruising around the IBM Merchandise Site today, and I'm really struggling to figure out who I can buy the Lotus plush monkey for...
But anyway...hmm, I had a point to all this when I started typing, but it seems to have escaped me. Maybe there is no point. Maybe I'm just saying that the holidays are what you make of them, and your attitude is largely up to you. I dunno.
Happy holidays. Enjoy your family and friends.
Since I tend to obsess over things like that, when I came home I started digging through my old boxes and books, and I found a box of documentation for the Lotus Notes Client, Release 3.3. Sure enough, there were tri-fold quick reference cards for various actions in the client, both for Macintosh and Windows/Presentation Manager (that would be Windows/OS/2 to most of us today).
Just for kicks, I went ahead and scanned them for you and stuck them in PDF files (although I zipped the PDFs up so you can view them locally more easily -- no need to open them from this server).
It was also kind of a blast looking through some of the other documentation in there, and reading the names of the old Lotus products that just aren't with us anymore. For instance, I saw references to:
Of course, maybe those products are still around, but they just have new names. Maybe "Lotus Phone Notes" is now "IBM Lotus Touch-Tone Telephony Workflow Integrator" or something. I'll have to head on over to http://www.ibmlotusbrowserenabledinternetwebsite.com and see if I can find any references...
oleObj.Application.Windows(oleObj.Application.Windows.Count).Visible = True
I noticed that Excel spreadsheets were mysteriously being saved as "hidden" windows, so when you opened up the detached spreadsheets in Excel it looked like there was nothing there (until you manually set the window to be unhidden). After I added the command above, everything was fine. I don't think this command has any relevance in the other Office OLE models, but that's okay because the error handling in the script will allow it to keep on going.
I also added the command:
right after the call to
oleObj.Quit, just to try to make sure that the background application gets closed when we're done with it. Keep the memory clean, and all that. Once again, the error handling will take care of us if the command isn't relevant.
So I got excited this past weekend when I was shopping and I saw that I could get "Rudolph and the Island of Misfit Toys" -- a sequel to the classic Rudolph the Red-Nosed Reindeer -- on DVD for only $4.99. I snatched up a copy, brought it home, and put it right in the DVD player.
Boy, was that a disappointment. As Yukon Cornelius might have said, "I got hornswaggled." It wasn't one of the old Rankin/Bass movies at all. It was more like Rudolph meets VeggieTales, with bad computer animation and a one hour story that was at least 59 minutes too long. (It's probably not even fair to compare it to VeggieTales, which is actually pretty well produced, but the animation was similar and the previews before the movie were along those lines.)
But anyway, I've purchased and/or watched plenty of bad movies before, and this is just the latest one. And I only spent five bucks on it, so that's a pretty small loss.
However, it did get me thinking about how many sequels to Rudolph that other people must have made between the original release in 1964 and now. Here's my list of lesser-known sequels to Rudolph the Red-Nosed Reindeer:
(In case you were wondering, yes, I did make all that up. It was supposed to be a joke. There were actually at least two real Rudolph sequels though: "Rudolph's Shiny New Year" and "Rudolph And Frosty's Christmas In July". FYI.)