Category Archives: Work

I want to be terrible too


Here is a great article by a self-confessed “terrible programmer” who points out his own “failings” as a programmer and how he covers them up, so that nobody will find out the truth. Of course, he is not a terrible programmer; quite the contrary. He is obviously an experienced programmer who is very good at what he does. (Note that I have no idea who this guy is.) The methods he uses to cover up his incompetence are time-honoured ways of ensuring that the code you release is as correct and robust as possible: do code reviews, use assertions liberally, test the snot out of your code, and use the right tool for the job.

As for me, I do use assertions all over the place, and I’m usually pretty good at writing tests for the modules I write. I am part of the core engine team for SQL Anywhere, a relational database management system from Sybase iAnywhere. When I add features to the database engine, I make sure I test boundary conditions, confirm the syntax of any SQL statements I add, and try to make sure that whatever changes I’ve made work in multiple types of databases, and on multiple platforms. However, I work on a lot of security-related features (encryption, authentication, database permissions, auditing), so I have to do more than just write tests — I have to think about how hackers could break into our systems, or otherwise gain access to data that they should not have access to. If someone was watching packets go by, could they use that information to break into the database? Could someone write a man-in-the-middle program that makes itself look like a server so that clients will connect to it instead of a real server? Can we eliminate the possibility of brute-force attacks, or at least slow the process down enough to negate the effectiveness of the attack? Can we give the DBA the ability to detect when intrusion attempts are happening, and determine where they are coming from?

Anyway, I occasionally make the same mistakes the author does — bugs in code, not initializing variables (ran across one of those this past Friday, actually), making assumptions that aren’t true (and not backing up those assumptions with assertions), stuff like that. I use some of the same methods of covering up my own incompetence as he does, so perhaps I’m as terrible a programmer as he is. I can aspire, anyway.

Just remembered that my boss sometimes reads my blog, so maybe admitting my own incompetence here is a bad idea…

Windows reminder app


Does anyone know of a good Windows-based calendar / reminder application? I’m currently using the Lightning plug-in for Thunderbird. Lightning is basically a plug-in version of Sunbird, which is a Mozilla calendar application. It has the advantage of being able to read events from my Google calendar plus add events of its own, and it can give you reminders, but the reminders seem to be flaky.

My company uses Lotus Notes for email, but after using it for a few years, I now flatly refuse to install it. I switched to Outlook for the next few years, and Outlook has a pretty nice calendar built-in. I’d set up reminders for my meetings, and a message box would pop up 10 minutes beforehand. I switched to Thunderbird for email a year or so ago, but Thunderbird doesn’t have a calendar built-in, so I’ve been without one ever since. I discovered Sunbird a little while ago and set that up, but soon discovered Lightning — it’s the same thing as Sunbird but since it’s a Thunderbird plug-in, it’s one less application to run. However, I have been late for a number of meetings lately because my reminders never fired. Sometimes they fire the next time I stop and start Thunderbird, and sometimes they simply fire an hour or two later. The reminder for the meeting I was late for this morning fired an hour after the meeting ended.

I’m thinking of re-installing Outlook just for the calendar, but that seems like overkill. Considering how happy I’ve been with Firefox and Thunderbird (for the most part), I’m quite disappointed with Sunbird. Anyone have any other suggestions?

Mobilizers baseball


Our baseball season ended today. (We all call it “baseball”, but it’s really softball, or even more accurately, 3-pitch.) This past year, I was the captain of the iAnywhere Mobilizers, one of our company’s two teams. We play in the “B” division of the league, whereas the other team (the “Sybase Sluggers”) play in the “A” division. We usually refer to the Sluggers as “The A Team”, and after playing in this league for two years, it’s only recently that I don’t giggle every time I say that, thinking of Mr. T in a baseball cap and glove, yelling “C’mon, guys, force play at second, let’s get this one”.

The “B” division is for those teams that aren’t good enough to play in the “A” division, but don’t completely suck — those guys are in the “C” division. Well, for most of this season, I suspected that they’d move us down to “C” next year because we more or less completely sucked. We started the season 0-10, including scores like 24-3, 19-4, 33-11, 11-2, and 24-1. The week after the 24-1 loss, I went away on vacation and someone else made the lineups, and we won 13-12. Then I came back and we lost the next 6. I like to think that was coincidence.

In late July, we lost a game 20-15, but the 15 runs was our highest run total to date, and we played pretty well, and I started to realize that we were actually playing better as a team. In August, we won another game, this time in convincing fashion, 26-20. I was actually at the helm for that game, so that broke my personal losing streak at about 18 (including the 0-3 showing at last year’s September tournament). We ended the season in last place at 3-18, two games worse than the second-last place team. Doesn’t sound like there was much reason for confidence going into The Tournament, but we actually had some guarded optimism, since we played much better in the last month, and two of our three wins came in the last four games.

The tournament was played yesterday and today, and rather than one or two games per week, we suddenly had to play four in one day, and up to three more the next day. Our first game was 8am, and we played pretty well. We lost by one run, but because the score differential matters in the tie-breakers, we played the bottom of the ninth even though the home team was winning. They scored one more, so it goes in the books as a two-run loss. 0-1 and -2 in the run differential column after one game. Not great, but considering we were 0-3 and -30 in last year’s tournament (the max run differential in any one game is -10), this was an improvement. The second game was pretty good too, and we were losing by 1 when the umpires called the game because of time constraints. I went and argued that the time limit had not yet been reached (we were two minutes shy), and we wanted to keep playing. They agreed that the game should continue, and we proceeded to not score any runs and allow 5, so we ended up down by 6. After two games, we were 0-2 and -8. Still better’n last year, but not great.

The third game never happened. Someone on our team had heard from someone else (who heard from someone else who… ) that the team we were playing in the third game did not have enough eligible girls — the rules say that you must have at least three girls who have each played at least nine games during the regular season, or you forfeit the game. I asked the umpires and the other team’s captain, and he confirmed that they had three girls available, but one had not played the requisite number of games. The umps called the game a forfeit, and we were considered the winners (by a 10-0 score), but said we could play anyway if we wanted. We declined, saying that we didn’t want anyone getting hurt in a meaningless game, but in reality, I think we were just hot and tired and wanted a break. So we were now 1-2 with a +2 differential.

The fourth game was great, except for the part of the game that really sucked, but I’ll get to that in a second. We hit well, played defence well, and won the game by 8 runs. I don’t think I made any errors on the field during that game, and I missed turning a 5-3 double play by this much. Runners on first and second, I’m playing third base, and the ball is grounded in my direction, just to my right. I run forward, grab the ball, step on third, and heave a throw to the first baseman, who catches it just after the runner hit the base. Normally, that’s the kind of play where I’d (a) miss the ball completely, forcing the left fielder to come in and get it (probably allowing a run to score), (b) boot the ball, loading the bases, or (c) make the play at third and then blow the throw to first, so I was very pleased with the fact that I made both ends of the play.

The part of the game that really sucked was during the bottom of the third inning. I was playing left field, and the batter grounded the ball to the second baseman. I didn’t see what happened, but some of our players were yelling “Throw it to first!”, and I didn’t understand why it was taking so long to do so. Eventually, the ball made it to first, the first baseman stepped on the bag, and then everyone walked towards the plate. I had no idea what was going on, until I saw that the batter had never left the batter’s box. He swung, hit the ball, and then must have dislocated his knee when taking off towards first base. Someone called 911, and an ambulance showed up 10 minutes later and took him to the hospital. The whole thing caused a delay of about a half hour, and since the games were a max of an hour and fifteen minutes long, that was almost half the game right there. Eventually, we got back onto the field, but I think the whole game lasted five innings. I haven’t heard since about how the guy is doing, but I can’t imagine he’ll be walking much in the next couple of weeks.

So at the end of the day, we were 2-2 and +10, a tournament record with which I was completely thrilled. As I said, the only experience I’d had in the tournament was the previous year, in which we got smoked three games in a row. Both teams that we beat won against (since we didn’t actually beat anyone in the third game) ended up going 0-3 on the day, with one game left to play this morning, while the other two teams in our grouping were 3-0 yesterday with one game this morning. So regardless of the outcomes from today’s games, we ended up third in the grouping, which meant that we played a quarter-final game today at 11:30 against the team that finished third in the other B-division grouping.

Yesterday, the weather was great for baseball. Sunny and hot. Today, the exact opposite — rainy and cold. It just flat-out rained for the first three innings or so, though after that it was just drizzly. We had one guy show up to play that I didn’t expect, since he said the day before that he couldn’t make it. I don’t want to put any blame on him at all, since the team is certainly better with him in the lineup than without, but the defensive lineup I had was done assuming he wasn’t going to be there, so I spent most of the first inning tinkering with it to make sure that he was included, but that nobody was sitting too often or in consecutive innings, that we didn’t have people playing in positions they weren’t comfortable with, and we didn’t our best defensive players all sitting at the same time. I didn’t do that great a job, though, since we ended up with too many or too few fielders in at least half the innings, and I had to make last-minute “You sit! You play right! You play third!” decisions on the fly. I think I ended up sitting out about four times just because I didn’t have time to figure it out properly. And to cap it all off, the hitting that came along so well in the last month of the season and all day Saturday completely vanished, and we ended up scoring all of two runs. We lost by about 12, and so ended the Mobilizers’ dream “worst-to-first” playoff run. The A Team (heh) got spanked in their game today as well, so both Sybase teams were eliminated.

Despite the win-loss record, I really enjoyed playing ball this year. It was much more work than in previous years because being the captain, I couldn’t just show up to games and play wherever someone else told me; I had to be the one to tell others where to play. One thing that I told everyone at the beginning of the season was that being the team captain does not mean that I’m the best player on the team, and it does not mean that I’m a good coach. I know the game itself as well as anyone, but I’m generally a crappy teacher, and I tend to forget that not everyone knows the intricacies of the game as well as I do. We had plays during the season where a fielder caught the ball while stepping on the base, but the runner was called safe because it wasn’t a force play. I knew it wasn’t a force play, but it didn’t occur to me to yell “Tag him!” because everyone knows that, right? Well, no, as it turns out. Anyway, due to complicated reasons that I’m not going to bother posting here, the league may not even exist next year, which means I may be looking for a new league. I remember looking into a league in Waterdown a while ago, but it was only for men 35 and older, and I didn’t qualify at the time. Now I do. Sigh.

It occurred to me earlier this year that if I played golf once a week during the summer instead of baseball, I’d become a much better golfer than I am now, and that concept certainly has some appeal. But can you imagine life without baseball? I can’t. I’ve played in a baseball league of some kind every summer since university, and I played pick-up baseball with friends every summer before that since I learned to walk, so until I get to the point where I am physically unable to play, I’m playin’.

IvanAnywhere


And I thought I had a tough commute… A guy (Ivan) on the query processing team lives just outside of Halifax, Nova Scotia. He’s been living out there for a few years now, and has been telecommuting. His ability to interact with the rest of us was greatly improved a couple of months ago when IvanAnywhere was introduced. IvanAnywhere is a “telepresence” robot, built by another guy in our department, Ian. One of Ian’s hobbies for many years has been flying RC airplanes, and after Glenn (Ivan’s boss) semi-jokingly asked him to build a flying RC blimp with a webcam that Ivan could control, Ian thought about it and decided it was possible, though with a robot, not a blimp. He took an RC truck and mounted a tablet PC and webcam on it as a proof of concept, and once that worked, he built a robot that Ivan can control. It has a webcam as well as a digital camera, microphone, speakers, proximity sensors so it won’t run into walls and such, and works over our internal wireless network. Now when Ivan wants to talk to someone, he can just go on down to their office, and he can attend meetings and even give presentations. The robot has a monstrous battery, but can run all day without being recharged.

Ivan can’t do everything himself, though. The robot can’t turn and move forward at the same time, so to go around a corner, it had to go forward, then spin 90°, then go forward again. Update: Yes it can! For tight manoeuvring, Ivan has to point the webcam down so he can see what he’s doing, so it’s easier to stop first. He can’t open doors, and manoeuvring around chairs and stuff in meeting rooms can be challenging. In one meeting, Ivan misjudged how far away a chair was, and the robot crashed into it (ironically, it was Ian’s chair). Also, someone here has to plug the thing in at night to recharge the battery.

Regardless of how cool this technology is, it’s almost no big deal anymore. We’re all so used to seeing Ivan (well, the robot, who we generally refer to simply as Ivan) roaming around, we don’t think much about it. One big difference is that our area is now pretty much mandatory on all building tours, so when customers or other partners visit, they are always brought through this area to see Ivan. Thankfully they haven’t changed our dress code (i.e. given us one) because of this.

As someone who telecommutes on a regular basis, I can certainly see the appeal of this for Ivan. For me, talking to co-workers via email, IM, or telephone is almost always sufficient, but I’m only at home one day a week (though it’s more if the weather is bad or I’m not feeling well or whatever). If I was at home every day and it was pretty much impossible to get into the office, I’m sure I’d miss the face-to-face interaction, and I find attending meetings over speakerphone (when everyone else is in the same room) difficult. Unfortunately, I think I live too close for the company to consider creating GraemeAnywhere.

Cool — just found out that we’ve been slashdotted!

Update: Ian informs me that IvanAnywhere can move forward and turn at the same time, so I updated the paragraph above. Also in the comments I say that it’s running a 9.0.2 server, but it’s actually running 10.0.1, and it stores status and monitoring information, which is used for diagnosing problems.

NetWare hell


Novell announced
the other day that their next version of SuSE Linux (called Open Enterprise Server)
will be able to run NetWare 6.5 as, essentially, a virtual machine. It also says
that “This release of OES also spells the end of NetWare as a separate operating
system”, so that you will only be able to run NetWare as a VM.

SQL Anywhere has been supported on NetWare since the beginning, and I have been
the sole NetWare developer on the engine team for most of the last ten years. With
this change, I don’t know if it makes sense to continue supporting NetWare, so
it’s possible that management will consider dropping NetWare as a supported
platform. This would be fine with me, since NetWare is a difficult operating
system to work with — the compiler is old and unsupported, the debugger is
flaky and slow, and there are lots of idiosyncrasies specific to NetWare that I
have to deal with.

The title of the above linked article is “Good-bye NetWare, hello, OES 2”, so
when viewing that page in Firefox, that’s what the title bar says. When I
minimized the Firefox window, I got this, which I thought was kind of appropriate:

Ryan the math whiz


Ryan seems to be turning out to be quite the little mathie, just like mommy and daddy. The other day he got in trouble at school for throwing his shoe or something like that, and he and another boy (grade 3 – Ryan’s in grade 1) were told by the teacher on duty to stand against the wall and count to 100 before they could go play again. Ryan decided to count by 5’s rather then 1’s, and had left the wall long before the other kid had. Not what the teacher meant, to be sure, but hey, she didn’t specify!

Then this morning he was putting together an alphabet puzzle he has – each letter other than A and Z has 2 puzzle pieces, and A and Z have one each. He noticed that the box said ’50 piece puzzle’, and came to me and said ‘daddy, 26 plus 24 equals 50’. I asked him how he figured that out, and he told me that he knew that there were 26 letters in the alphabet, but that only 24 of them had 2 pieces in the puzzle, and since there are 50 pieces in the puzzle, 26+24 must be 50.

It ain’t rocket science, but he’s only 6 1/2, so I think (totally unbiased proud poppa) he’s doing very well.

On the work front, ASA finally got its Common Criteria certification today. This has been in the works for over three years, and I’ve been the engineering point person for the project. I’ve referred to it as “The project that wouldn’t die”, but I guess it’s now officially dead! As long as we don’t decide to do the whole thing again for Jasper

P.S. A very happy birthday to my wonderful wife Gail, who turns today!

I’m a star!


Thanks to my work on attempting to get CC certification for ASA, I was given an “iAnywhere Solutions Star Performer” award yesterday. I got a plastic star “trophy” thing (which actually looks cooler than it sounds), as well as a nice monetary bonus. Once we get this certification (should be later this month), it will allow us to sell ASA to various sectors within the US government, which requires this level of certification before they are allowed to purchase any software product. John yesterday congratulated me on my award and called me “a god among men”, which I think might be a bit of a stretch, but it is certainly nice to have my efforts recognized.

On an unrelated note, the sports headlines yesterday read “Barry Bonds Steroid Shocker”. Two guys in the know wrote a book stating that Barry Bonds used lots of steroids over the last few years. Question: “shocker”? Is anyone actually shocked?

Update: Fixed the CC link. Thanks Daniel!

Mama, I’m comin’ home


Once again, I’m writing this on a plane, this time flying back from Washington. As I look out the window, I see what I think might be Andrews Air Force Base, judging by the google map I looked at yesterday. We just entered the clouds, so now I can’t see anything. I still don’t know what caused the nervousness I felt before the flight down, but I was fine before today’s flight.

The testing didn’t go well on Tuesday, and I was working until 10:45pm to fix all my tests up. Wednesday went much better — all four of my test suites had run to completion with no failures by about 9:30am, so the rest of that day was spent working on unrelated stuff and answering questions from the validation team and the evaluator. The evaluator, Daniel, was an interesting guy – lives in a suburb of LA, and seemed quite proud of being Californian. Dude loves to talk about himself, and is very open with personal stuff – like the fact that the gyro sandwich he had for lunch on Tuesday kept repeating on him all afternoon. Thanks for sharing that. It’s one thing to talk to relative strangers about your kids (we all did), but did I really need to know that his 11-year-old daughter weighs over 100 pounds (“chunky but solid”), and has started “developing” already? Apparently she’s into a B-cup now. Now, I don’t have daughters so maybe I just don’t get it, but do other fathers of pre-pubescent girls go around talking about the size of their daughter’s boobs?

He also dropped a couple of names here and there – mainly people that I’d never heard of but that the validation team had. He did once refer to himself as “the godfather of perl”, and that “Larry” (presumably he meant Larry Wall, the creator of perl) was a good friend of his. “Haven’t seen Larry since his in-law’s 50th wedding anniversary” he says. Okay, so you know Larry Wall, we’re all very impressed. Sheesh.

We’re flying over St. Catharines now (just saw Niagara Falls from my window a couple of minutes ago — cooooool), so I’m going to end there. No, it didn’t take me the full hour flight just to type the stuff above – in the middle I wrote up a detailed report on the testing. That’s probably all confidential stuff, so I won’t post it here.

Yup, the fasten-seat-belts sign just came on. Time to go.

Update: Flight time on the way back was one hour, 7 minutes and 4 seconds.

Another update: If a girl is “developing”, is she still considered “pre-pubescent”?

Extortion in the skies?


We got all the testing done today, so I was back in the hotel by 5:00. I took a quick look online to see if there was an Air Canada flight tonight — there’s one at 8:00, and as long as I packed quickly, I should be able to get there on time. I called Air Canada to see how much it would cost to switch the ticket – there’s a $10 fee for this, a $32 fee for that, which I would have been happy to pay if it got me home tonight instead of tomorrow. Then he said that the ticket price was higher, so I’d have to pay the difference — $350. The original return ticket cost $491, or just under $250 each way. I didn’t ask the guy, but I should have — why would the price of a ticket on this flight be more than double that of the one tomorrow morning? Is it on a nicer plane? Better food? Free lap dances by the flight attendants? There’s gotta be some major difference, right? Nope — it’s a time-honoured airline tactic called “fucking the customer over whenever possible”. I just checked aircanada.ca for flights from Toronto to Vancouver tomorrow (Jan 19) — there are 13 direct flights. Tango ranges from $168 to $426. “Latitude” costs $626 for every flight, and the only advantages over Tango are things like more Aeroplan miles, no charge for same-day ticket changes, and the ability to select your seat without paying for it. For “Latitude Plus”, $1260 allows you to sit in the Maple Leaf lounge before the flight, and you get an upgrade to first class if a seat is available. This means that if first class is full, flight 103 from Toronto to Vancouver tomorrow morning will have some people sitting in coach who paid $168, while others also sitting in coach who paid $1260. Does this make sense to anyone other than Air Canada?

BTW, the flying time on the flight down here (from wheels-up to touchdown) was exactly 59 minutes and 30 seconds. I’ll write again after I get back and post the flying time for the return flight.

In-flight entertainment


I’m writing this on my laptop while flying over the blackness that is Lake Ontario at night. Through the clouds, I can occasionally see some lights off to our left, which must be the east end of Toronto, or possibly even further east, like Pickering or Whitby. I’m on Air Canada flight 310, flying down to Reagan airport in Washington DC. Tomorrow and Wednesday, I’ll be meeting with some contractors who are doing a security evaluation of the database product that I work on, Adaptive Server Anywhere (ASA). This evaluation is required before a software product can be used by the US government and its agencies, so getting the evaluation done opens a bunch of doors for our sales people. I’m the technical lead on the project, so over the past three years, I’ve put together lots of documents describing the product and how it works, and written lots of tests and documentation about these tests. It’s been a long and ardous project, but for the most part, it’s been part time – a few hours here and there, rather than 8 hours a day every day. I will be glad when it’s all over though.

Starting this morning when I got up, I’ve been very nervous about this trip. Not because of what will be happening when I get there, but the flights themselves. I can’t explain why – I’ve flown many times, and I’ve never been the least bit nervous about it. In my previous job, I flew down to Boston all the time – probably averaging every other month over three years, as well as a couple of trips to San Francisco, one to Naples, Florida, once to DC, and once to New York City. And that’s just work trips with Comnetix – I’ve flown to Baltimore three times with Sybase (though not for over 5 years), and many times on various vacations. I’ve never been nervous flying, but I had butterflies in my stomach all day, and they got worse as the day went on.

My only guess as to the reason is that it’s the first trip I’ve taken away from my family since Ryan was a baby. The most obvious fear is that the plane will go down and Gail will be left to raise the boys on her own, and they will grow up without a father, and that idea scares the hell out of me. I have every confidence in Gail’s parental abilities, and I’m sure she’d do fine, I just don’t want her to have to. The weird thing is that Gail and I flew down to Las Vegas back in October without the kids, and I had no qualms about that. If there was, um, an incident during that flight, the kids would grow up without either parent, and would be raised by my sister. With all due respect to her, that would be far, far worse, and yet, I felt no nervousness about that flight. I don’t get it.

Looking out the window, I can still see lights off to the left. We must be far beyond the lake now, over New York state somewhere. For some bizarre reason, I felt this urge to time the flight, so I started my stopwatch as soon as the wheels left the ground – 29 minutes and 30 seconds ago. Actually, flying time is supposed to be about an hour, so we’re probably at our cruising altitude of 25,000 feet, and roughly halfway there.

We started boarding the flight around 5:45, and just before then, I realized that Gail had already picked up the boys, and was probably at home fixing dinner. The boys would be in the family room, glued to today’s episode of What’s New, Scooby Doo? which we tape every morning. I thought of calling just to tell them that I love them, but this would be weird for me (telling them that I love them wouldn’t be weird, I do that all the time, just calling from the airport specifically to tell them). I know that Gail would immediately ask me what was wrong, and I don’t want her to worry about me, so I didn’t call. I hope I get to the hotel in time to call before bed – I’d really like to talk to Ryan and ask how his day went – he had a test on owls, which they’ve been studying for a few weeks now. Did you know that an owl will eat pretty much anything smaller than itself, including bats, rabbits, and even other owls? I did not.

Sometimes talking to Nicholas on the phone is fun too – he’s too young to have any real concept of how far away I am or when I’ll be back. Ryan, simply because of his age, has a much better understanding of the concepts of time and distance. I keep forgetting how much younger Nicky is – almost three years. Nicky sometimes talks about Figgy and the fact that he died — and then asks when he’s coming back. When we tell him that Figgy’s not coming back, he never gets sad, he just sort of says “oh, right”, as if he simply forgot. Ryan, on the other hand, started to sniff and almost cry when we drove by the vet’s a few weeks ago, because he remembered that that’s where we took Figgy when he died.

The captain is talking now – we’re at about 15,000 feet, and we’ll be touching down in about 10 minutes, so I’ll have to shut the machine down now. I’ll probably write more on the return flight.