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

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

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

A friend of mine from the University of New Mexico offers a writing tour of Italy each year. Here are the details. Visit for more information.

TLC Writing Tours of Italy are a unique combination of writing classes, workshops, and cultural experiences over a nine-day, non-stop adventure. From our headquarters in the medieval town of Viterbo, two hours north of Rome, we immerse you in Italy and Italian culture by alternating writing with visits to local towns, photography workshops, cooking classes, a sail on Lago Bolsena, visits to Etruscan ruins and local authors’ homes, wine tastings, home-cooked Italian meals, and much more; essentially we offer a full-immersion Writing and Italy experience designed to make any writer, of any level, feel at home.

This year’s dates are from the 10th through 19th of October, 2014.

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

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

Next Page »