Day one

Today was the first official day of classes up at UW, which means that tomorrow is free from any obligations. I have an afternoon tutorial for English 109 that is not applicable, since the first official lecture hasn’t been held yet. I did attend two classes today:

  • Math 136 (Linear Algebra 1), and
  • CS 245 (Logic and Computation).

Math has always been a challenging subject for me, so it was a pleasant surprise that the introductory material on linear systems was still familiar. I’m sure the pace of the course will pick up, which will necessitate giving it a fair amount of attention during this term. It’s also fortunate that Warren is enrolled in the same section, so that there’s a mutual backup system for note taking.

As for the Computer Science course, the professor (Prabhakar Ragde) seems extremely enthusiastic and positive about the course. It’s effectively a proofs course in CS, which is something that either will be extremely engaging for me, or a complete stumbling block. Prabhakar’s comments on looking at assignments as if they were puzzles intrigued me; that’s one part of development I tend to enjoy. Solving a particular task – or in this case, proving a particular proof – is a core part of programming that lets developers achieve milestones.

New year’s revolutions

I’ve arrived home from Markham – my work term officially concluded on December 22nd – and I’m settled in, for the most part. The entire Christmas holiday seems to have gone by far too quickly, because I’m headed back to school within a day. For the most part, my preparation for classes has been limited to updating browser bookmarks and ensuring all of my workstations are functional. The usual administrative tasks, such as securing textbooks, will be performed on Wednesday through to Friday this week.

It’s unfortunate that I can’t check my exact UW schedule at 2am: I tend to work best in the evening hours, on an offset timeframe. Not having Quest (the student information portal) available past midnight necessitates some planning.

My class hours reflect this alternate way of operation. My goal for Winter 2007 was not to start any class before 11:30am, which I’ve achieved with an early start on course selection. In return for the late start, I give up my afternoons and tend to work well past midnight. My rationalization for this operation is that I woke up early (7am) for four years during high school to catch the bus, and I deserve to sleep in when I can. While sleeping until 11am isn’t really a valid option while on a work term, I did use some of the flexibility available at IBM to delay my start time until 9:30 – 10am when I could.

Besides continuing to work for IBM as a student on-call employee, I’m now starting the job search and application process. (The Student On-Call process can involve working on-site on alternating days, or in my case, working on an “as available” schedule remotely.)

My resume is nearly complete, and is in a publicly available state. I’m debating removing some of the work experience information from Maplesoft, or compressing the Summer 2006 student on-call position experience into the previous co-op term. One thing that was mentioned to me was that the entire “student on call” process is indicative of a job well done while physically on-site. Yes, this is shameless self-promotion, but my point remains. 😉

I’ve also been managing my time with some PC repairs on the side. Together with Dave and Warren, I fix software and hardware issues on-site, on a small-scale word of mouth basis. When I’m on a co-op term, in order not to interfere with my professional responsibilities, I redirect client calls to Dave or Warren, depending on the situation experienced. When I’m living in Waterloo, I additionally build or repurpose PC’s for clients.

Usually “software” issues are the result of spyware or malware. It’s extremely rare that I’ve seen an actual virus on a system – most computer problems I’ve seen are caused by malicious browser toolbars, or don’t explicitly fit the criteria for a virus.

Unfortunately, spyware can be just as painful for end users, and is much more deceiving in its appearance. Perhaps the worst case of spyware I’ve heard of is an application called “MSN Block Checker”, which completely demolished a Windows installation, necessitating a complete reinstallation of the OS.

For now, though, I’ll enjoy my last day off before it’s back to the grind.

Useful utility: NetMeter

While my primary workstation is a Core Duo iMac running OS X, I consider myself platform-agnostic at this point. My fileserver at home is a Core 2 Duo E6600, running XP Pro SP2. I also have several other boxes that run XP, and it’s often a necessary thing to monitor network traffic.

One of the issues I encountered during this workterm was slow downloads over a mapped network drive. With conventional tools for Windows, it’s not possible to accurately monitor the transmit rate. This is where I install the freeware utility NetMeter, which is a useful network activity monitor and graph for Windows 2000 and XP. I configure the application with the following settings:

NetMeter - settings dialog

I align the NetMeter window directly to the bottom right of my screen, just above the standard Windows taskbar. When I mouseover the 50% transparent window (to access a scrollbar or status bar), the window fades down to about 10% transparent:

NetMeter - faded out

In the case at work, we were able to determine that downloads from a certain system were transferring at a rate well below what was expected, without calling the support team. I use NetMeter on my laptop to determine wireless network performance and ensure wired networks are operating properly at 1000Mbit – it’s good to have a rough idea of how well your connection is performing.

What’s with the faulty bus?

Looking at the title I may have unfortunately chosen for this site, it reads similar to a “directive not found” inclusion common to SSI and ASP pages. “Bus error” is one of the POSIX generic error messages, and I’ve seen it twice. From my perspective as a developer, it’s possibly one of the worst error messages around for comprehensibility.

The first time I saw this message was while working on an OS X installation. I booted the system with the DVD and attempted to repartition the drive. However, the Disk Utility application refused to let me do so – simply crashing without any error message. When I launched the program from a Terminal window and replicated the crash… Bus error.

I later invoked the same message myself while testing a C/C++ application for my CS 241 class. The C and C++ languages were a new concept to me at the time, and I believe the specific error I made was trying to access unaligned memory. In this case, it was enough to let me know to verify my malloc() and free() calls before going ahead.

When I write informational, warning or error messages for my own applications, I try and follow this pattern:

  • What is the immediate thing that’s wrong or needs to be addressed?
    Bad: “Database error”
    Good: “Could not connect to the database”
    Better: “An invalid user name or password is preventing a connection to the database.”

    (I also keep in mind that these error messages may need to be tailored for specific user roles. For example, a site administrator should see the last message, where Web visitors should see generic/cached content with a “This site is not fully up to date, contact the site administrator” message.)

  • Describe the error in more detail, providing additional information.
  • If the error is based on user-provided settings, give additional help as to how to fix it.

Many situations that seem like they warrant an “error” message do not demand it at all. In an ideal application, the user shouldn’t have to see any harsh, STOP, don’t go there dialogs. One of the most common errors I see online is the “Connection to MySQL server failed” or “Too many connections to database server” message. Why is this message being shown?

  • If there’s a legitimate load error, fall back to cached content with an informational message. Depending on traffic – such as to a specific article – you may be able to get away with replacing the content with a static HTML page. You do have cached content, correct? If not – why not? If your site is entirely database driven, there should be backups of the database.
  • If there’s a configuration error – again, fall back to what content is available. Another design decision should be based on installation flags. Yes, the database server isn’t available because the username/password is incorrect: this is a given on the out-of-the-box installation of any Web application. Instead of completely giving up the towel, add a nice dialog that says “hey, you need to provide this information before your site starts working.”
  • Don’t echo raw errors to the screen! They may reveal sensitive information or details about your site’s configuration. A way to do this with your own web apps: (these instructions assume you’re working with PHP)
    • Create a function called d_echo that checks for a conditional $debug_enabled boolean variable. When debugging, have all potential error output displayed using this function.
    • If $debug_enabled is true, have a BIG GLARING WARNING at the top of EVERY page noting that debugging mode is on and you should really turn it off, with a link available to do so.
    • Allow debugging to be turned off from within the Web app itself, but don’t allow it to be turned back on without editing a configuration file. Debugging is for developers and testers – not a production environment.

Personally professional

Welcome and thanks for visiting jakebillo.com.

Chances are you’ve viewed my resume and have decided to look at my personal site. If so, please feel free to browse around.

As part of an ongoing plan to better myself, I’ve registered this domain – not only in a self-righteous effort to improve my Google rank, but to write in a more professional manner about myself and my life.