Here is my tentative syllabus for CSC-315, Fall 2014.  The text book has not yet been defined, but this will give you a sense of the material we will cover.

IMPORTANT NOTE: for this class, you will do your programming using Visual Basic in the Visual Studio.NET 2012 IDE.  This is a Windows-based development environment. I have seen students run Visual Studio on their Mac computers atop a Windows emulator, but it is incumbent on you to get it to work. Alternately, the classroom should have VS 2012 installed on every computer.

No comments

After a fair amount of research, experimentation, and poking around, I have finally found a way to return a Domino object (such as a NotesDocument, NotesDocumentCollection, or NotesDatabase) via a Web Service.

Now that I figured it out, it struck me that it’s not something that I’m likely to use because the DXL (Domino XML Language) markup is more complicated than I need. The only scenario I can imagine at this point is if you have a remote Domino server needing a Domino object that is accessible only via a Web Service.

Anyway, it’s worth documenting the process here so I can revisit it later.

For the purpose of this illustration, my code will open the Domino Directory (formerly, the “NAB”) and return the first document found in the People view.  It includes some basic error trapping.

Here’s the code:

 Public Class co_NotesDocument ' name of the "Port Type Class"

    ' note that %INCLUDE "lsxsd.lss" is defined in Options
    ' recommended Web Services tool: SoapUI from

    Public Function getNotesDoc( aFault As WS_FAULT ) As String

        On Error Goto errHandler

        ' define basic Domino objects; note the "New" for session
        Dim s As New NotesSession
        Dim dbNAB As NotesDatabase
        Dim viewNAB As NotesView
        Dim doc As NotesDocument

        ' special object for exporting the Domino object 
        ' as a DXL thingie
        Dim exporter As NotesDXLExporter

        ' instantiate Domino objects for the Notes Address
        Set dbNAB = New NotesDatabase( "", "names.nsf" )
        Set viewNAB = dbNAB.GetView( "People" )
        Set doc = viewNAB.GetFirstDocument()

        ' Define exporter object for current document
        ' alternately you can define the input document with 
        ' Call exporter.SetInput( doc )
        Set exporter = s.Createdxlexporter( doc )

        ' return the string of text that is the DXL by assigning
        ' the Export() method's output the function's name
        getNotesDoc = exporter.Export( Doc )

        Goto Done 


        ' If you are using OpenLog.NSF (highly recommended), log 
        ' the error information with LogErrorEx().  This is for 
        ' internal use only (by the Domino developer)

        ' Call LogErrorEx( "Error " & Err & " in line " & Erl _ 
        ' & ": " & Error$, "ERROR", doc ) 

        ' define the return properties for the fault object
        ' this is deliberately generic for external users of 
        ' the web service so it reveals less information about
        ' your infrastructure

        ' assign actor an arbitrary name; maybe substitute calling user
        Call aFault.setFaultActor( "CLU Web Service" ) 

        Call aFault.setFaultCode( 1200 ) ' arbitrary fault code

        ' arbitrary and generic error message returned in the web service
        Call aFault.setFaultString( "Sorry, this program encountered an " _
        & "unexpected error. Ask your app developer to check the logs." )

        ' must do this or the fault is NOT returned
        Call aFault.setFault( True )

        Resume Done

    End Function
End Class ' ===================================================================================


Keywords: Returning a NotesDocument from a Web Service, IBM Notes, Lotus Notes, IBM Lotus Notes, IBM Notes Web Services, How to return a Domino object via web service

No comments

Once upon a time, a long long time ago in a desert far, far away, I took a Physics class. The professor used one of them thar new-fangled personal computer thingies (pre-Apple, pre-IBM PC) to manage his grading tasks.  He also introduced a solution to the “one genius makes the rest of us look bad” problem.

For the uninitiated, the “one genius” scenario is the case where a test is graded on a curve and just one person aces the test while everyone else bombs it.

His solution was simple: normalize to the second-highest score.

I have adopted this approach for any of my classes with ten or more students.

Here’s how it works.  Let’s say a test is worth 200 points. A genius scores 190, but the second highest score is 150.  What I will do is add 50 points (200 -  150) to everyone’s grade.  Everyone, that is, except for the genius-she will get 10 points to bring her grade to a perfect score of 200.

The rationale is simple: If two or more people do well, then my teaching methods seem to be working, but if only one person does well, we assume that person is a “genius” and treat their grade as an outlier to be ignored.

The bottom line: it’s my job to help you succeed, so it’s my responsibility to grade fairly.

No comments

Yes, I’m late to the party, however…..

I’m finally beginning to create Domino Web Service providers.  (If you’re not family with the IBM Lotus Notes/Domino environment, you need read no further.)

I have located several good reference pages by Julian Rubichaux, but still felt like there was some information missing that I couldn’t seem to locate, so I began a series of experiments.

As a result, I’ve begun compiling a summary of thoughts and standards for my environment, some of which I’ll mention here.

Don’t put any code in your web service. Instead, have your web service class inherit from a class defined in a script library. This class in turn inherits many standard elements from a base class in another script library.  While it means you have to go through a couple of extra steps to refresh the service, it means you are able to employ code reuse on a massive scale.  It also means you get better “Intellisense” capability (or whatever IBM calls it).

Define standard classes for your common return values, especially arrays, lists, date/time things, and NotesDocuments, and include them in the base class mentioned a moment ago.

Develop and use a standard error handling approach for all errors. In my case, I leverage Julian’s OpenLog.NSF tool for capturing errors internally, but return a generic error to the web service so as to hide any details about our underlying data structures. I have augmented Julian’s code so that it generates a “cascading log” entry, similar to a stack trace, that shows the call history of the problem area. This helps me debug the problem in my code.

Give serious thought to security. I’m still trying to figure out how to pass Domino credentials into a web service, but I’ve come up with a fairly robust work-around in the meantime. Perhaps I’ll describe it another time, but since it relates to security, maybe not right away!

There’s a lot more that I still need to explore and develop.  I’ll update this entry as time allows.

Note: my environment uses Domino version 8.5.3 but I think these guidelines are generic enough that you can use them from version 7.0.1 on.

Recommended free tool to use when testing Web Services: SoapUI.  It saves you from having to debug two halves of the web service puzzle at the same time.

No comments

I love my Rally Copilote watches and have been using them for years.

There are so many features, however, that I sometimes forget how to set some of them. It seems like the manual is written in one-point font, rendering it almost useless to my tired eyes, so I made this cheat sheet to help me remember the more esoteric settings.  The primary stuff (capturing and recalling stage times, setting time of day, and so on) is not recorded here.

To my students: one of these days I’ll give you a project of modeling this watch with software.

Change time of day from AM/PM to 24 hour
Switch MODE to time of day
Hold SET until seconds start flashing
Press the LIGHT button

Set the countdown timer so that it starts at the next minute, or instant on, or other options
Switch MODE to Timer1
Press START/STOP until you get to the setting you want
Press SPLIT/RESET when done

Set the countdown timer to start counting down when a stage starts (e.g., FIA Start-to-Start timing)
Switch MODE to Timer1
Hold SET until seconds start flashing
Push SET repeatedly until you see Chrono Link, which you then set to On
Press SPLIT/RESET when done

Set the Chrono timer (not countdown) so that it starts at the next minute
Switch MODE to Chrono Time
Hold SET until the display starts blinking
Press START/STOP to change Next Minute to On
Press SET again
Press START/STOP to change Delay Start to Off
Press SPLIT/RESET when done

Set the Chrono timer (not countdown) so that it starts instantly, or after a specified delay
Switch MODE to Chrono Time
Hold SET until the display starts blinking
Press START/STOP to change Next Minute to Off
Press SET again
Press START/STOP to change Delay Start to On, then specify zero (for instant) or other delay time
Press SPLIT/RESET when done

Set the light so it comes on when any button is pressed (useful for night stages)
Hold the LIGHT button until you see the light bulb icon (top right) come on

Turn other features on or off
Hold the MODE button for several seconds until a feature name appears and starts flashing
Press START/STOP to toggle value between On and Off
Press the MODE button to select the next feature
Press SPLIT/RESET when done


No comments

(NOTE: This posting is primarily for my personal reference.)
When trying to print a Blackboard test canvas (to PDF or a physical device), one normally gets only the visible page.  This is because BB uses frames.  However, if you open the specific frame, you can then print the entire page.
Using Firefox, I right-clicked on the frame, selected This Frame | Show Only This Frame, and then was able to print.

No comments

Here’s how to solve that problem.

Exit Notes.

Locate Notes.INI. (It used to be under c:\lotus\notes\ — not under data — but newer versions install under a different location.)

Find a line with AddInMenus

If the only item listed is for Adobe Acrobat, then comment out the whole line with a semi-colon

If there are other add-ins in the line, duplicate the line, then comment it out, then modify the one still active by removing the Adobe reference

Restart Notes to confirm it’s gone.

No comments

Each time you turn around, there’s another news story about compromised passwords and computer security. Just recently we’ve learned of massive breaches at Target, Neiman Marcus, Adobe, and Cupid Media (the OK Cupid dating site people.)

An important thing to remember is to use unique pass phrases on every web site so if one site gets compromised, the others aren’t.

For example, if the Adobe data dump revealed your password of “I-Like-CLU-in-2014″ to the bad guys, they will try to use that same password on your banking site and could rob you.

Some people resist using multiple passwords because they’re a pain to remember.

Here’s a suggestion — not perfect, but will do for the majority of sites — that will help keep things reasonably safe, while still making every password unique, yet memorable.

Given some baseline pass phrase (more than just a password) that only you know, such as the aforementioned “I-Like-CLU-in-2014″, append a site-specific suffix mnemonic to it. For example, your pass phrase for the Wells Fargo web site might be: “I-Like-CLU-in-2014.WellsFargo” while you might use “I-Like-CLU-in-2014.Target” for the Target web site.

If a “black hat” puts eyeballs on your pass phrase they may recognize the pattern, but in my opinion that is highly unlikely. When they harvest 40 to 70 million IDs and passwords at a time, they’re gonna write programs that test your credentials against other sites, not humanly scan each one individually.

As a side note,  I recommend using a different e-address for each site you access. Unless you have some technical savvy and your own domain, this might be problematic. However, you can use a service such as offered by to generate anonymous e-addresses that are site specific.  I’ve had about 95% success with addresses.  In only a few cases (Redbox and the City of Phoenix are two that come to mind), the vendor blocks, drops, or ignores those addresses even though they are valid.

Lastly, it’s old news but I’ll repeat it anyway: make your pass phrase long enough that it’ll be hard to guess, with a mix of letters (upper and lower case), numbers, and punctuation.

Yeah, it’s all rather a pain in the okole, but replacing your credit cards, recovering stolen funds, or trying to repair your credit history is a much bigger pain.


P.S. I was directly affected by the breach. After the breach I began receiving phishing e-mail from Russia. Fortunately the messages went to my SpamGourmet address, so I just disabled that one address without affecting my other logins or addresses.

No comments

A Novel User Interface

Here’s an interesting idea about using The Human Body as Touchscreen Replacement from the Nielsen Norman Group, experts in the usability field.

No comments

CSC-300 Text Book

I have selected Murach’s Visual Basic 2010 by Anne Boehm as the textbook for CSC-300 for both the fall semester and the BDP winter term.

Addendum of 13 May 2014: Murach now has a VB 2012 edition available. Based on student feedback, the jury is still out regarding its continued use. It’s not that they think the book is bad, but rather that they tend to refer to my lecture notes instead, going to the book only for specific lookups.

No comments

Next Page »