Partway through the Spring Term our lives radically changed. Dangers were discovered lurking everywhere, gathering on the surfaces we touch constantly, and getting transferred into our lungs by rubbing our eyes, scratching our noses, touching our faces. Worse, the dangers are hidden, invisible to the naked eye, and don’t manifest themselves for two weeks.  How many places do you normally go in two weeks? How many people do you see, counters you lean on, phone calls you make, while the nastiness works it way undetected through your body and your community?

I know two people with CoVid-19, one in the Spanish countryside and another in Rhode Island. It’s not good.

The upshot of all this is that we have had to radically change the way we live, communicate, and for the audience of this blog, the way we teach and learn.

I’m a computer geek. I teach geeky stuff. My material is easier to teach with virtual technologies than the classes of my colleagues in the physical sciences, the art department, and drama. I would guess that professors of the language arts, and psychology, and communications are all extraordinarily challenged in this new, virtual world, even without the need to handle test tubes, lasers, oil paints or props.

As challenging as this is for faculty, it is doubly or triply so for our students.  They are forced to learn new ideas, discuss important concepts, develop new skills, while remaining socially distant and disconnected from their peers. This places them at a huge disadvantage.

A key factor of education is in discourse, the clear exchange of ideas, but these dialogs are hindered by the imperfections of video, the difficulty of reading body language, and the ever-present distractions bounding into the home environment during classes.

As a student, I found great value in the physical process of going to school. It was a place where I could focus on my studies without the distractions of roommates on drums in the other room, or children asking you read them a story, or the temptation to take a short news break and get sucked into the rabbit hole of one internet article after another.

Most importantly, in the classroom I felt the vibrant energy of support, of interaction, of immediacy, of presence.

For me, I can learn simple tasks from books and on-line tutorials, but to learn deep knowledge requires human contact, human exchanges, human guidance.

Even though I’m now on the other side of the lectern, those same qualities are why I prefer to teach on-site, why I enjoy teaching in a classroom: it’s the personal interaction between myself and the students, and my students with each other, and the immediacy of help I can provide when they need it.

These are some of the things that make it so difficult in today’s quarantined/locked-down environment, for students and faculty alike.  Not only do we have to worry about the health of our friends and family, job security in our own household and for others, and struggling to learn new survival skills in a world already turned upside down even before the pandemic hit, we have to educate and study in a crippled environment.

The good news is this: we are adapting. My students have risen to the challenges thrown before them, have continued to excel despite the abundance of difficulties in their paths, and have shown the focus and dedication in their studies that makes us proud as faculty members.

I’ll confess that this has not been an easy transition for me. It’s tough to move from classroom to empty house, to try to deliver real and useful content from a chair, to restrict my motion in order to stay in camera frame instead of wandering in front of the board, moving between desks to study their code, field their questions, and congratulate them on their presentations.

Fortunately, my students have been understanding too, recognizing that we’re all in this together.

I’m thankful for many things…. we have technology that was unthinkable a century ago, we have a supportive university that enables us to deliver maximum value to our students, and we have students that are here to learn, not just because mommy said they have to go to college.

We’re all adapting, and we’ll get through this.

No comments

A few of you know that I sponsor the Koa-Plumeria prizes.  One is awarded to the best essay in an introductory English class while the other goes to the best work in CLU’s literary magazine Morning Glory.  English department faculty  judge the student works and make the selections.

This short article will explain the meaning of the name. I’m privileged to be able to offer these prizes, but I’m doing it for the students, not myself. I wanted the prize focus to be on the writing, not me, which is why I elected not to have them called the John Dillon Writing Awards or similar.

Since I grew up in Hawai’i, I tend to relate to items from my childhood, thus I chose to name the prizes with a flavor of my upbringing.

Koa is a hard wood, used for musical instruments and weapons, including edge weapons like war clubs.

Plumeria is a fragrant flowering tree whose beautiful petals exude a mildly irritating sap, such that you normally soak the flowers in cold water in the refrigerator overnight before threading them onto leis.

In summary, the idea of both prizes is to reward edgy works that employ musical language, and lovely, sweet writings that get under your skin.

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

As many of you know, I’m an active competitor in the sport of performance rally.

I recently returned from the 2018 edition of La Carrera Panamericana, a 3000 km race from Oaxaca, near the bottom of Mexico, to Durango, near the top. It was an amazing challenge and an equally amazing adventure, highly recommended to those who can afford the time and cost to compete.

My usual in-car video camera is a Sony AS-200, but for this race the team used a GoPro Hero 6 Black device. I’ll make some observations about that camera later, but the purpose of this note is to describe the filenames used by the camera as best I can deduce.

The main video files are in the MP4 format and have filenames beginning with “GH” followed by six digits. The first three digits provide grouping information, while the last three are sequential in nature. Since our camera was new, the last digits were quite low, from 070 to 207. The first three digits were generally 010, but with some caveats. For long recordings (approximately 4 GB in size), the camera would switch to a second (or third, or fourth) file. The last three digits remained the same, but the middle digit was incremented.

This is best illustrated by example.

File name

GH010128.MP4 was the first video file for the Mil Cumbres 
             stage but since it was a long stage
GH020128.MP4 was the continuation of the video.

This means that if you’re using third party video editing software, you would combine these two files, not the “obvious” next file which you would imagine to be GH010129.MP4.

Additionally, each video file has a .THM file and a .LRV file, the latter with a “GL” prefix instead of “GH.” I can’t be sure, but I believe the THM file is an encoded version of a CSS style sheet, while the LRV file contains encoded GPS information. (In contrast, Sony’s cameras use plain text formatting for these type of files.)

I tried using GoPro’s proprietary software GoPro Quik but it had a poor user interface and didn’t always recognize the files that I’d transferred to the computer from the memory card. Perhaps if I had the camera and connected it to my computer (instead of reading just the cards), it would have worked better, but I kind of doubt it. The bottom line is I switched to a package that, while still primitive compared to my old tools, was far more robust.

Now about those other observations regarding the camera itself.  It has a very compact form factor, making it easy to mount it in a variety of places. The picture quality is very good. (We were shooting in 1080 but 4K is available.) On the down side, battery life is poor, the user interface is difficult unless you can see the back of the camera (and it has a touch screen), it often inverted the images for no reason I could determine, and you can’t hook up a remote microphone without buying a special adapter for a non-standard connector. If you accidentally push the power button, the mode changes unless you hold it down for a while. The GPS components are a great idea, but the manual says you should mount the camera right-side-up for GPS to work best, something that’s not always possible.

In my opinion, the GoPro cameras are well suited for activities like skiing, cycling, and skateboarding. I’m less impressed with it in motorsports applications, though many of my colleagues swear by them instead of at them.

The bottom line is that if you understand the file naming convention, you can work with the output of these cameras more effectively, regardless of the editing software you use.

No comments

In many ways I am a cheapskate. I seek bargain prices and special deals for things that I consider generally mundane. However, there are some things and services that trigger brand loyalty in me.

For example, I much prefer flying on Southwest Airlines. They have the best frequent-flier program in the industry, there are no assigned seats, they are the best about rebooking flights without penalties, and they have a wonderful vibe to go with all the other things that one requires in flying these days.

Certain products also have characteristics that insure my loyalty. I like Kleenex brand tissues for example. They’re just a bit softer on the nose, less scratchy, which is important when you have a cold or are otherwise sick. I like Harry’s razors too. They were a gift from Jessica and Aaron, but I prefer them so much that I don’t like shaving with any other brand. (When traveling, I carry disposable razors, but that’s strictly for the convenience factor.)

I know that there are some foods that I prefer in brand names, but I can’t recall offhand which ones they are. I’m on a treadmill at the moment and I am unable to look in the pantry. Of course, there’s practically no food in the pantry anyway. Oh, I do remember a couple of things: I like Paul Newman’s spaghetti sauce and Frito-Lay queso in a jar.

What triggers loyalty to a specific brand? For me it has to be something that offers sufficient differentiation over it’s generic rivals. Quality has to be sufficiently better to warrant the higher cost or the extra effort to find the product or service.

I am curious: what things do you consider should be purchased by brand?

No comments

This is not a day of happiness, but of respect, honor, and grief.

It is a day of thanks, thanks given to those who sacrificed so much, and it is a day of reflection, reflection on the many great things we enjoy because of those sacrifices.

It’s also a day to consider again our priorities, the things that we fight for and the things we choose to ignore, our values and our vices, our noble battles and our petty, selfish squabbles.

Patriotism is not about saber rattling, boastful roars of “we’re number one,” or arrogant attitudes suggesting ours is the only “right” way to do things.

Instead, it’s about love of country, willingness to serve, and respect.

I’m a patriot in my own quiet way, proud of those who stood up for what’s right, even when they’ve been opposed by tyrants in power (our own as well as others).

I’m proud of, and thankful for, all those who have sacrificed their daily lives and their mortal lives in our defense.

It grieves me when our warrior youths are wasted in vengeful exercise, but I am honored that they serve on our behalf, that they will be there when needed, despite the many hardships and dangers they face.

I have no special plans for Memorial Day, except to remember those who have fallen, and to be thankful for their courage and sacrifice.

Perhaps you’ll take a moment to do the same.

No comments

It’s My Job to Help You Succeed

My students frequently hear me tell them that “It’s my job to help you succeed.”  But what does that mean exactly?
First off, notice the word “help.”  The goal is for you to succeed, which implies personal responsibility on your part. I’m there to assist you in achieving that success.
In the classroom, education is a partnership between student and professor. As professor, it’s my job to impart the information you need to learn the material in a way that’s clear, repeatable, and lends itself to inspiring further study. As a student, your responsibility is to invest the time necessary for learning, do the exercises and challenge me to explain things more clearly if you don’t “get it.”
The onus is upon me to deliver the information and identify the areas that are particularly important, but I can’t do it alone. You can help by engaging as a willing participant in the educational exercise. If it seems unclear to you, then I need to try other approaches to clarify the important stuff. I endeavor to give you the knowledge that will help you succeed, not only in the classroom (e.g., so you can pass tests), but also in your future career.
Indeed, I believe that my challenge is to not just deliver the information but, more importantly, provide analytical tools you can use in life, regardless of the specific discipline you’ve chosen.
If I am successful in this regard, then I have fulfilled my job—I have helped you succeed.
First posted 16 Jan 2015, last edited 1 Feb 2016.

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. If there are less than that, I’ll normalize to the highest score.

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.


Note: Technically I’m applying an offset rather than normalizing, but you get the idea.

No comments

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

Next Page »