Why English sucks – reason #3

Let’s have a look at words that have a vowel followed by ‘st’, such as last, must, and post.

a, e, i, and u, for the most part, seem to always employ the short form for the vowel.
Words like mast, past, fast, jest, festival, nest, pest, quest, fist, list, just, must, rust. I have no doubt that there are words following this format that use the long vowel form, but I can’t think of them.

On the other hand, we have o, which seems to use both the short and long forms:
short – lost, accost, frost
long – most, post, ghost

Why, English? WHY???

Posted in Uncategorized | Leave a comment

Why English sucks – reason #2

There are lots of different letter combinations that, for whatever reason, have multiple pronunciations. Let’s have a look at a particularly nasty one – o u g h

It’s bad enough when a letter combination has 2 or 3 different pronunciations, but this little bit of evil has four.

The first pronunciation example is through, which sounds like ‘boo’ or ‘too’.

The second example is bough or drought, which sounds like ‘cow’.

The third example is cough, which sounds like ‘off’.

The fourth example is though, which sounds like ‘oh’.

Why, you miserable language?? WHY??

Posted in Uncategorized | Leave a comment

Why English sucks – reason #1

We’re starting trying to teach Olivia how to read. It’s been a long time since we’ve gone through that process, so we’re trying hard to find good information to guide us through the process.

One interesting source has been the latest incarnation of The Electric Company. Things move a little too fast, I think, to be truly effective for kids just starting out, but it’s a good start.

One of the good things they do is explain some of the rules about how English grammar works, spelling, and how to sound things out. You know, things like “i before e, except after c.”

This has worked pretty well with Olivia. However, as you all know, there are plenty of exceptions to the “rules”. As we get more advanced, we’re going to keep encountering more exceptions.

The English language has so many exceptions, it’s a wonder that anyone can actually learn the language at all. And that’s what this series of postings is about. As I encounter these exceptions, I’m going to point out some of the ones I find… interesting.

Let’s start by taking a look at some past and present tense patterns for some words.

The most basic way of converting from present tense to past tense is to simply add ‘ed’ to the end of the word. Here are some examples:

  • stop = stopped
  • work = worked

Another common method is to change a vowel in the middle of the word. This tends to be much trickier, but there are lots of examples:

  • run = ran
  • swim = swam

Some words are the same for both past and present tense, such as ‘hit.’

My daughter has caught onto the “add ‘ed’” pattern, so she tends to say ‘hitted’ and ‘runned’, which is always amusing.

However, the reason for this particular post has to do with a special set of words. For these words, a pattern is clearly established, and then completely and utterly ignored.

Let’s start with the establishment of the pattern.

What’s the past tense of ‘grow’? Grew.
What’s the past tense of ‘know’? Knew.
What’s the past tense of ‘blow’? Blew.
What’s the past tense of ‘throw’? Threw.

Based on that, what do you think the past tense for ‘snow’ would be?

Give it a sec. It’ll come to you. I can wait.

‘Snowed.’

Ok, what? Why is this word different??

But, it get’s worse. What do you think the past tense for ‘flow’ should be?

Not only does the past tense for ‘flow’ not follow the pattern (past tense is ‘flowed’), but the word you think it might be (‘flew’) is actually the past tense for a completely different word (‘fly’). Uh, what??

I’m sure there are plenty other messed up past and present word forms out there, but this one just really struck me as odd.

Stay tuned for more oddities with the English language.

Posted in Uncategorized | Leave a comment

Attack of the ants!

I’m fascinated by insects. Sure, a lot of them are creepy and some are downright unnecessary (particularly wasps), but some are incredibly interesting.

I find ants particularly interesting and I’ve wanted an ant farm for a very long time. Olivia is very keen on bugs, so I figured that someday soon I’d have to get one. As luck would have it, Andrea found one for me for Christmas. I was absolutely giddy with excitement.

The excitement was a bit meted, though, by the fact that the housing unit didn’t actually come with any ants. It did, however, come with a coupon to get some ants. I anxiously filled in the form, wrote a cheque for the $5 (US) shipping charge, and sent it off.

Now, the instructions that came with the farm indicated that ants would only be shipped if the long-term forecast indicated temperatures above freezing. Given that it was December when I sent the form off, I knew I was going to have a long wait on my hands. *sigh*

* 5 long months later *

Yippee!!! The harvester ants finally arrived! They came in a little test tube-like container. Hard to believe that 20 ants would be comfortable in there, but hey, who am I to judge?

Luckily I kept all of the instructions from way back in December, otherwise I would have tried to open the container right away and pour the ants into the farm. Had I done that, I might likely have been stung/bitten, since the ants were quite feisty. Instead, I put them in the fridge for about 15 minutes, which caused them to slow down considerably.

Once the ants were sufficiently chilled, I opened up the container and tapped them into the farm. The ants did nothing. They just lay there.

As the ants warmed up, they started twitching a bit. Then start started moving around. It was interesting to see them “wake up”, since they stumbled around like they were drunk.

So ants were quicker to recover than others and it was interesting to see the moving ants interact with the non-moving ones. One ant in particular went visited each ant in the farm, over and over again. I don’t know what exactly it was doing, but it certainly looked like it was checking to see if the ants were ok.

After about an hour, all of the ants were up and moving about. Well, all but one – I suspected this one particular ant was dead before I even put them into the farm and my suspicions were correct. So, out of 20 ants, I managed to get 19. I was ok with that.

The farm came with a little stick that was to be used to poke a few initial holes into the gel. I guess the point was that the ants would have a starting point for their inevitable excavation. Once the ants roused themselves, they started exploring. It took a couple of hours, but eventually they found the holes I had made and started exploring them.

I was surprised at how long it took them to really start to do anything. After about 3 hours of just exploring their new surroundings, they finally got down to business and began excavating the gel. At first, they started grabbing little chunks of gel from the holes I had made and carried them out and placed them into little piles. After a bit of time, though, they moved away from the pre-made holes and started doing their own digging. Very interesting.

Watching the ants manipulate the gel (which serves as both housing and food) with their mouth parts was pretty nifty. They would find a section that they wanted and then use their mandibles to cut out the section and then carry it away.

Another fascinating thing was how the ants managed the deceased. Once an ant dies, it’s pretty much just stuck in the farm. The exoskeleton doesn’t really decompose, so eventually there will be ant bodies everywhere. As I mentioned, one ant was DOA. After the ants gave up on the pre-made holes (which they did after the first night), they took the dead ant body and threw it down one of the holes. Nice tidy way to keep it out of the way, I thought.

From time to time, the ants would explore the pre-made holes again. The first time they did it, they dragged up the dead ant’s body from the bottom of the hole they place it in and moved it into a corner. I guess they thought that many hands would make light work, so they cut up the body into several pieces. Eventually these pieces would end up all over the place, to be moved whenever required.

The ants, over the course of a few months, did quite a bit of tunneling, but ultimately they didn’t do nearly what I thought they would. I really expected them to dig tunnels all through the gel, pretty much on a constant basis. But they never did. They dug some tunnels along the corner edges from the top of the gel to the bottom, and then all along the bottom. All of the tunnels were dug between the gel and the outside edges of the tank. And their digging would go in fits and spurts. They would do a lot of digging over the course of a few days, and then nothing would happen for perhaps a week or more. Then they’d start up again.

After about a month, the next ant bit the dust. Again, it was interesting to watch how the remaining ants managed this. The instructions mentioned that the ants would live from about one to three months, and that seems to be exactly what happened with my ants. Once that second ant died, the remaining ants died on a pretty regular basis. Although there are a few ant bodies scattered throughout the container, most of them are grouped together in one spot at the very bottom, in a corner. Fascinating.

The last ant hung on for several weeks, which was quite surprising. It didn’t really do much of anything during that time (no real tunneling, no cleaning, etc), so I wonder what sort of existence it was experiencing.

So now I have an ant farm filled with a bunch of gel (which is covered in a huge pile of little gel pieces that the ants excavated) and dead ants. The instructions say that you can re-use the existing gel, provided you get the old ants out first. I’m not sure how I’ll get the old ants out or where I’ll find new ants (at $5 USD, plus the $10 bank fee I got nailed with for writing a cheque on a CAD account for a USD amount, I won’t be ordering them again), but I’m keen to load up with a new batch of ants and see what they do with the existing structure. There are a couple of huge ant hills in the neighbourhood, so there’s amply supply.

Posted in Uncategorized | Leave a comment

Exceptions – To wrap or not to wrap

That is the question.

Let me start off by saying that I don’t really know a whole lot about exception-based programming. I get how they work and that I can throw them around when I detect error conditions and that I should catch them sometimes. I know that there are checked and unchecked varieties and a little bit about the differences. Overall, though, my knowledge of exceptions is pretty weak.

For the stuff I’ve done in the past, I’ve typically had to throw exceptions for two reasons: 1) I’ve detected my own error condition or 2) I’ve picked up an error condition from something else and I wish to propagate it.

Exceptions for the first situation are pretty easy. You detect some sort of error condition and throw whatever exception class is desired. In these circumstances, I usually always include some sort of error message. The code might look something like this:

if (some error condition == true) {
    throw new MyException("Hey! An error happened!");
}

The second situation isn’t much different. If I was making a call to something that itself throws exceptions, I could either let the exception pass through on it’s own (perhaps via a throws declaration) or capture it and then pass it along via a different exception.

try {
    doSomething();
} catch (SomeException ex) {
    throw new MyException(ex);
}

For the most part, I’ve always typically “wrapped” the exception in the manner shown above and it’s never caused any problems or concerns. Until now.

While brushing up on my knowledge of container-managed transactions, I was messing around with purposely failing database queries to trigger transaction rollbacks. When JDBC errors occur, the API typically throws SQLException, which is a checked exception. In order for the container-managed transaction machinery to kick in, the method being executed needs to throw EJBException, which is an unchecked exception. This is not a big deal – we just catch the SQLException and wrap it up in an EJBException.

try {
    ResultSet rs = executeQuery();
} catch (SQLException ex) {
    throw new EJBException(ex);
}

And voila! Should the query fail, the method will throw an EJBException, triggering a transaction rollback.

Now here’s the interesting part of doing it this way.

When a remote client executes the EJB method, the EJBException generated by the method is ultimately passed back to the client that made the call. The EJBException is typically wrapped up as a RemoteException. What you need to keep in mind is that the exception instance is serialized and passed to the client. This important fact will become relevant in a moment.

In my test EJB, I simply wrapped the SQLExceptions as I showed above. When I ran the remote test client, the JDBC call would fail, the transaction would be rolled back, and the EJBException returned to the client. Everything worked exactly like it should, except that the client was displaying the following error:

Error unmarshaling return; nested exception is:
java.lang.ClassNotFoundException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException (no security manager: RMI class loader disabled)

A ClassNotFoundException? And for a JDBC-specific class that only the EJB itself has any direct knowledge of? That’s definitely a problem, since the remote clients should have no knowledge whatsoever about how the data might be stored.

Finally, the blind wrapping of exceptions has bitten me in the ass. I changed the wrapping of the SQLException to the following:

try {
    ResultSet rs = executeQuery();
} catch (SQLException ex) {
    throw new EJBException(ex.getMessage());
}

Rather than wrap the original exception, this creates a whole new exception and passes along only the reason for the original error (which is all I would typically care about anyway).

Now when I run the test client, I see a more appropriate

EJBException:; nested exception is:
javax.ejb.EJBException: Table 'dvds.movies' doesn't exist

I still have a lot to learn about exceptions.

Posted in Development | Leave a comment

Container-managed transactions with JBoss/MySQL

Now that I find myself out of a job, I’ve got lots of time to get caught up on all of the technologies and stuff that I really should know.

I know how to build applications using Java/JavaEE.  I know how to develop EJBs (particularly session beans and MDBs).  I know how to use JSP and servlets.  I know how to use JMS.  I know how to use RMI.  Most of this stuff is pretty automatic after having worked with these technologies over the past few years.  Throw in some helper technologies, such as XDoclet (no more manual updating of deployment descriptors for me, thanks!), and things become even easier.  While I can’t rattle off different parts of the J2EE 1.4 specifications, I like to think that I’m competent in my ability to use the technologies.

At least, that’s what I like to tell myself.

I had a bit of a disastrous interview last week.  I got asked all kinds of questions about how different parts of J2EE work and, while I was able to come up with good answers for most of it, there were certain questions that I totally botched.

One topic that I really hosed was container-managed transactions (CMT).  This is something that I should know something about, but in reality I never actually used them in the applications that were being built at my last job.  We pretty much just assigned the “Required” transaction attribute to every EJB method and, as far as I was concerned, everything else just sort of worked.  For the CWMP RPC method test system I built, transactions weren’t important at all, so I never really bothered researching about how they worked.

Using that botched interview to try to actually learn something, I set about experimenting with CMT.  JBoss is the application server with which I am the most familiar, and MySQL is a free RDBMS that I am also familiar with, so I installed these two products for my testing.

Once everything was set up, I set about creating a simple EJB with a few public methods that my RMI-based test client would call. One method would successfully make changes to the database. A second method would make failed changes to the database. A third method would call the first two methods, allowing me to test multi-level transactions.

Based on what I had read about using transactions (and my own previously limited experience), it should be just a matter of setting up the XDoclet @ejb.transaction attribute on the appropriate methods and the container will take care of the rest.

Here’s an example of my “successful” method:

/*
 * @ejb.interface-method
 * @ejb.transaction
 *     type="Required"
 */
public boolean updateMovie(MovieDTO movie) {
    boolean success = false;
    Connection conn = null;

    try {
        conn = _ds.getConnection();
	PreparedStatement stmt =
            conn.prepareStatement("UPDATE movie SET title = ?, year = ? WHERE id = ?");
	stmt.setString(1, movie.getTitle());
	stmt.setInt(2, movie.getYear());
	stmt.setInt(3, movie.getId());
	success = stmt.execute();
    } catch (SQLException e) {
        e.printStackTrace();
        throw new EJBException(e.getMessage());
    } finally {
        closeConnection(conn);
    }

    return success;
}

It’s a simple method that takes the contents of a DTO and updates the appropriate record in the database. Nothing fancy.

Here’s the code for the method that always fails:

/*
 * @ejb.interface-method
 * @ejb.transaction
 *     type="Required"
 */
public boolean updateBroken(MovieDTO movie) {
    boolean success = false;
    Connection conn = null;

    try {
        conn = _ds.getConnection();
        PreparedStatement stmt =
            conn.prepareStatement("UPDATE movies SET title = ?, year = ? WHERE id = ?");
        stmt.setString(1, movie.getTitle());
        stmt.setInt(2, movie.getYear());
        stmt.setInt(3, movie.getId());
        success = stmt.execute();
    } catch (SQLException e) {
        e.printStackTrace();
        throw new EJBException(e.getMessage());
    } finally {
        closeConnection(conn);
    }

    return success;
}

The difference here is that the query will fail because the “movies” table does not exist (it’s called ‘movie’).

When I installed the app and ran my test client, both methods behaved as they should. When I called the working method, the update occurred. When I called the non-working method, the update did not occur.

Then I added the following method:

/**
 * @ejb.interface-method
 * @ejb.transaction
 *     type="Required"
 */
public void doStuff() {
    ArrayList movieList = getMovies();

    for (MovieDTO movie : movieList)
        System.out.println(movie.getId() + ": "
                 + movie.getTitle() + " (" + movie.getYear() + ")");

    MovieDTO movieChange = movieList.get(0);
    movieChange.setYear(movieChange.getYear() + 1);
    updateMovie(movieChange);

    movieList = getMovies();

    for (MovieDTO movie : movieList)
        System.out.println(movie.getId() + ": "
                 + movie.getTitle() + " (" + movie.getYear() + ")");

    updateBroken(movieChange);
}

Again, pretty simple. It does the following:

  • Get the list of all movies and output them to the console
  • Change the year for one of the movies and update it via the “successful” method
  • Get the list of movies again and output them to the console (the idea to show that the update actually occurred)
  • Try updating the movie record again via the “unsuccessful” method

What should happen here is that the record in question will be updated to reflect the new year value (confirmed by the new fetch and display) and then that update should be completely undone because the second update will fail.  That means that if I check the database after running the test method the original year value should be there.

This was not what happened.  Every time I ran the doStuff() method, the year value continued to increment, despite the fact that the second update always failed.  I was very confused.

And so began my 2 day odyssey to figure out what the heck was wrong.

I asked some former colleagues about our use of transactions with Oracle and MS SQL server.  They claimed that everything was working as expected.

I read up on how to specify transactions in the deployment descriptors and verified that XDoclet was doing the right thing.

I started searching the web to see if anyone else was having problems getting transactions to work with MySQL and JBoss.  It turned out that lots of people had problems getting them to work, and while people were eventually successful, I couldn’t see what they were doing to get it to work.

At one point, I stumbled across something that talked about needing to use XA drivers in order to get the transactions to work.  While this should certainly do the trick, it seems to me that the XA stuff is really meant for establishing transactions across different types of systems (say the EJB container and some remote OSS or billing system).  Still, I decided to try using the MySQL XA driver.  I tried and tried to get things working properly, but the problem remained.  Whenever I ran that test method, the year value was incremented.

At one point I really mucked with the XA driver configuration and things stopped working altogether.  At that point, I figured I needed to move into a different direction.  This was confirmed when I asked a colleague about XA drivers and he mentioned that the product never used them.

Ok, back to the web and more endless digging.

After a few more hours, I just happened to stumble across this article, which talks about how to get CMT working with Hibernate in a JBoss environment.  The key section is “Configuring MySQL”.

I didn’t really pay much attention to the table definitions (which may have actually saved me a lot of time, since I may have come across similar definitions before).  Instead, I saw this little gem:

As you can see, we are creating tables of the InnoDB type. That’s important. MySQL’s default type is MyISAM. MyISAM is an improved replacement for ISAM, but it’s a non-transactional storage engine and it follows a different paradigm for data integrity, which MySQL calls “atomicoperations.” Again, it’s non-transactional, meaning that it does not support transactions. Obviously, we need a transactional table type, and in MySQL that means InnoDB.

Well, well, well.

When I created the tables initially, I didn’t specify any sort of engine, thus they defaulted to MyISAM.  Since this engine does not support transactions, there was no way for the container to undo the first successful update.

Giddy with excitement, I fired up the excellent MySQL Query Browser tool and modified the table definition for the ‘movie’ table to use the InnoDB engine instead of MyISAM. I then ran my test client against the doStuff() EJB method and…

Success! The console output showed the list of movie data, the data with the updated value, and the failure exception. When I queried the database afterward for the current values, the original values were all still in place. The transaction had been completely rolled back. Hurray!

So that’s it. In order to get container-managed transactions to work with a MySQL database, the tables must be configured to use the InnoDB engine. A full table definition script would look something like this:

CREATE TABLE movie (
	id	        int(11) NOT NULL auto_increment,
	title   	varchar(255) default NULL,
	year	        int(4) default NULL,
	PRIMARY KEY (id)
) TYPE=InnoDB;

I hope that this information helps someone avoid all of the headaches I experienced in trying to find out what turned out to be a very simple solution.

Posted in Development | Leave a comment

Uh, what the hell just happened?

December 1st, 2008.  An ordinary day, I suppose.  “Official” start to the holiday season, at which time I “allow” Andrea to start playing Christmas music and start my annual argument about when the decorations will be put up, the tree purchased and set up, and so forth.  Apart from that, a normal day, with our normal routines.

I checked my Blackberry and noticed a handful of e-mail messages from E-Trade, sent around 12:30am.  Each message said that my corporate stock options were scheduled to expire on March 1st, 2009.  Given that my first set of options weren’t due to expire until some time in 2013 or 2014, I found that a little odd.

As I rounded up Olivia and wrangled her into the car to head to school, I continued thinking about the e-mail.  March 1st was certainly an odd date – doubly odd that all of my option allotments were going to expire at the same time.  Must have just been some sort of clerical error.

By the time I got to the office, the significance of March 1st finally dawned on me – it was exactly 3 months from today.  At that moment, I recalled something in our employee guide that mentioned that employees had 3 months after the termination of employment to exercise any vested stock options.  Uh-oh.

As I made my way to my office, everyone was sort of milling about and gabbing.  There was certainly a bit of nervousness in the air.

“Anyone get any e-mail from E-Trade recently?” I inquired.

“No, why.”

“I just got a bunch of messages saying that all of my option grants are about to expire.”

“Dude, shut the hell up. People are nervous enough as it is.”

Allow me to step back into time for a moment.  Back in October it was suggested/implied that layoffs might be coming before year-end.  Near the end of last week, we got an e-mail mentioning that a senior VP was dropping into the office on Monday (December 1st) and that lunch would be provided.

So I’m sitting at my desk, dig out my laptop and set about getting started for the day.  The e-mails continue to worry me, especially since I was the only one to get them.  However, I had just received a glowing yearly review and a raise, and I was working on a project a little more closely aligned with head office.

My boss arrived and I went to see him.

“So, is there something that I should know?”

“Uh, no, why?”

“Well, I just got these e-mails from E-Trade about my options expiring on March 1st, which is 3 months from today.”

He shrugged.  “I don’t know.  I haven’t heard anything.  I don’t even know why <senior VP guy> is here.  Just continue doing what you’d normally be doing.”

Word finally starts circulating that the VP has arrived, but still no one knows what’s going on.  Apparently my boss is in to see him.

Some time later, a colleague pokes his head into my office to tell me that our boss was just let go.  Well, I guess we know why the VP was here and my boss had no idea what was going on.

A few minutes later, the e-mail prophecy comes true as I get called in to see the VP.  The usual customary “you’ve done great work, bad economy, blah blah blah” stuff.  I’m handed a couple of boxes so that I can take stuff of immediate importance, but told that I’ll have to make an appointment to come in and get everything else.

Even though I pretty much figured this was coming, it was still a bit of a surprise.  I headed back to my desk, packed up a few essentials, and quietly headed out the door and to home.

And, for the first time in 15 years, I’m unemployed.

During the rest of the morning and afternoon, I was in communication with my now former colleagues, who kept me up to date on the carnage.  In total, 6 people were let go.

Happy holidays indeed.

Posted in Uncategorized | Leave a comment

Sightseeing in Stockholm

This has been in my queue for a couple of months now and I’m just now finally getting around to finishing it up and posting.  The article refers to a trip I took to Stockholm for the Broadband Forum during the week of September 8, 2008.


I was in Stockholm for the week attending a broadband specifications conference.  The conference was scheduled to start Monday afternoon and run through until Thursday afternoon.  Scandinavia was at the top of my list of places I really wanted to get to, so I was really looking forward to attending.

I scheduled my flights to arrive in Stockholm Sunday afternoon and depart Friday morning.  Ideally, I should have scheduled my flights to either arrive the day before or to leave a day later so that I could do some touring, but I sort of dropped the ball on that one.  However, with a late afternoon arrival and things not starting until Monday afternoon, there was some opportunity to catch some of the sights.  I also knew that I’d at least get to the downtown area and see some nice architecture and experience some fine local cuisine most evenings, so I wasn’t too worried about having so little time.

The flight got into Stockholm pretty much on time, but by the time I got through customs, got my bag, and got to the hotel, it was a little after 7pm and I still hadn’t even checked in yet or figured out what was around.  I ran into an acquaintance in the lobby and given the lateness and my level of fatigue, I decided to eat at the hotel and try to make it an early night.  No big deal, I still had Monday morning to catch a couple of things.

The alarm went off at a reasonable hour Monday morning and I went about getting ready to head out.  I was going to need some cash and a 7-day metro pass, so that was to be the first order of business.  I was staying at the Quality Hotel Globen, which is part of the much larger Globen City complex that includes an arena and a shopping mall.  The mall was only a couple hundred metres from the hotel, so that was to be my first stop.

The mall was just opening when I arrived.  There were lots of people, but it wasn’t particularly busy.  I wandered around the mall, looking for a bank machine and having a look at what the stores were offering, especially since I needed to pick up some sort of souvenir for Olivia.

I eventually found a bank machine, but I still needed the metro pass.  I got to a set of escalators and headed down, which took me to the bottom floor of the mall.  There were only a few stores on this level and so there was not a lot of traffic.  I walked a couple dozen metres past another bank machine and stopped to look around for a moment.

To my right was an ICA store (which I believe is a grocery chain).  To my left was what appeared to be some sort of lotto booth.  I looked at the lotto booth store for a moment, trying to determine if there was some sort of sign that said I could buy a metro pass there.

I heard what sounded like a semi-hollow aluminium can hitting the floor and I turned around to see the can roll past my feet.  The can started belching out thick orange smoke.

I was watching the can, wondering why in the world it was there, when a very loud noise started up.  It was coming from back where the escalators were, so I spun around to see what was going on.  There was a corner wall blocking my view, so I started walking towards the sound.  After a few steps, I was able to see past the wall and found the source of the noise.

Two men wearing very fluorescent lime green jackets with blue stripes were standing in front of a door.  One was wielding a very large gas-powered circular saw, like you would use for cutting concrete or rebar or some other tough metal, and trying to cut into the door.

“That’s odd,” I thought to myself.  “I suppose maybe they’re doing some sort of maintenance work.”

The smoking can re-entered my thoughts and again I wondered about the relevance.  It was smoking quite a lot at this point and the lotto booth was completely filled.

I continued looking at the two men.  The one not operating the saw was looking around and turned in my direction. That’s when I noticed the reflective ski goggles.

The man made eye contact with me and waved me away.  I was about 10 metres away and there were a lot of sparks flying, so I figured he just wanted to make sure I didn’t get too close.

Having had enough of that, I decided it was time to head out.  There was a door leading outside a few metres away, so I headed towards it.  A man with a panicked look on his face was kicking the smoke can out of lotto store and talking on his cell phone.

It occured to me just then that these guys weren’t trying to cut opening just any door.  It was the door to the room containing the bank machine I had just passed.

That’s when it finally all came together.

These guys were robbing the bank machine.

My first thought at this point was, “Well, I really don’t need to be here, so I need an exit RIGHT NOW.”  I very quickly walked to the (what appeared to be) automatic door.  Nothing happened.  I tried pushing the door open. Nothing.  I tried pulling the door open.  Still nothing.

Ok, great.  A couple of guys are robbing a bank and I can’t get out of the mall.  “Ok, ok, no problem.  They’re busy with the door and probably don’t want things to get any more complicated than they already are,” I told myself. That’s when I had the brilliant idea.

“I know.  The escalator is just over there, so I’ll very quickly walk along the wall past the would-be robbers and make my way up the escalator.”  I started walking back towards the escalator.

I got around the corner again and stopped to see what the two where up to.  One was still busy with the door.  The other was nervously glancing around in the area of the escalator, his arm raised up into the air.

That’s when I noticed the gun.

I really don’t know anything about guns, rifles, pistols, and the like.  I do know the difference between a revolver and something like a Glock/9mm/etc.  This particular gun was black and looked like the latter.

“Oh, this is just fucking great,” I murmured to myself.  “I can’t go out the automated doors because they won’t open. I can’t go up the escalator because these guys are armed.  The mall is filling up with orange smoke.  What the fuck am I supposed to do now?”

I turned back towards the door that I couldn’t open and saw the man still on the phone.  This time, however, he was frantically slapping a black pad next to the door.  He slapped a couple more times and the door that I couldn’t open finally opened.  So it was an automatic door after all.  Seeing my opportunity, I ran out.

Once outside, I took a few seconds to catch my breath and figure out what to do next.  I turned right and started walking down the sidewalk.  All I really knew at that point was that I wanted to be as far from the situation as possible.

I walked a couple hundred metres and came across a set of stairs to the right that went up to the plaza between the hotel and the mall.  I had initially climbed a set of stairs right outside of the hotel and walked across the plaza to get to the mall.  Wanting to get back to the hotel as soon as I could, I decided to climb up the stairs.

Once I got to the top, I could hear sirens.  I figured that it must be the police, so I decided that instead of heading straight to the hotel, I’d hang around the plaza to see how long it took them to arrive and to see what happened once they got there.  There was a steady stream of people exiting the mall, that orange smoke trailing behind them.  It was really starting to fill up the entire building.

I wanted to see what was going on, but also be out of the way.  Off to the left was a park bench.  I decided to have a seat there and watch the event unfold.

Not 30 seconds later, a “side” door to the mall opened and two men dressed in fluorescent green jackets stepped out. I glanced at them and then quickly looked down along the plaza.  Further away, I saw a few more people dressed in similar jackets.  At first I just figured that the coats must be pretty popular.  I glanced back to the two men.  One of them looked right at me and that’s when I noticed the ski goggles and the big black bags they were carrying.

“Oh my god, you have GOT to be fucking kidding me!” I said aloud (not that they could hear me).  “Why can’t I get away from you two?!”

Although it looked like they were looking right at me, they were really quite occupied with what they were doing and paid no attention to me.  They very quickly opened a door to a stairwell and disappeared.  Over the next few seconds, I could hear some banging, like something large and metallic was being dropped (something like a crowbar).  A few seconds after that, two men wearing regular street clothes emerged.  They very calmly walked over to their waiting motorcycles (well, one was a motorcycle and the other a scooter), donned their helmets, placed the black bags over the fuel tanks, and drove down along the plaza and out of sight.

A few minutes passed and I was still sitting on the bench in disbelief of everything that just happened.  The police finally showed up and I walked over to the wall along the plaza to see what was going on.  While I was standing there, someone next to me asked what was going on.  I mentioned that a couple of guys were trying to rob a bank machine in the mall and that they came up onto the plaza and drove away on motorcycles.

My initial plan was just watching the police for a few minutes and then walking away, not wanting to get involved at all.  However, after talking to the person next to me and watching the police begin interviewing people, I figured that I should probably head down the stairs and mention that I saw the guys originally show up and start cutting into the door and that I saw them leave.

It looked like there were plenty of witnesses, so I doubted that I’d be able to offer something that someone else hadn’t already provided, but I figured I’d wait anyway.  As it turns out, it looked like it was a good thing that I told my story.  There were plenty of people who witnessed the actions in the mall and lots of people saw a couple of guys riding away on motorcycles, but, as near as I could tell, I was the only person who actually saw both parts.  I have no idea if my ability to link the two events together will have any effect on things, but at least I felt like I had contributed in a meaningful way.

After the interview, I headed back to the hotel and tried to clear my head.  At this point, the morning was shot and it was time to get ready for the first working group session.  So much for getting any sightseeing done.

The police called me about an hour after the initial interview.  They wanted me to show them the doors that they had come out of and the stairwell I had mentioned, and where they went on the bikes.  After that, I never heard from them again.

I spent a few hours trying to find news articles about the incident on the internet.  It was quite a while before I found anything and, of course, just about everything was in Swedish.  Interestingly enough, Google Translate doesn’t really do a good job translating Swedish to English.  Despite that, I was able to discern some information about the incident.  One thing I found particularly interesting was the report that the thieves had escaped in a car.  That certainly wasn’t what I saw.  I suppose they could have ridden the bikes just a few hundred metres to a car and then driven off. *shrug*

And that was my first full day in Stockholm.

Posted in Travel | Leave a comment

HD update

Quite a long time ago I spent some time talking about the not-so-good HD signal provided by Eastlink.  Some days were good, some days were bad.  Some channels were consistently good, some were consistently bad.  I had called into Eastlink to inquire about the signal issues and they had mentioned at that time that my location had known issues, and that they were eventually going to solve the problems.  I don’t really watch a lot of TV so, for some reason, I seemed to be ok with that.

Fast forward a whole big pile of time…

It has literally been months since I last had the HD TV on for actual viewing of HD television.  If the TV is on at all these days, it’s because I’m playing a video game (I love Rock Band and Olivia loves Mario Kart) or, very rarely, I’m watching a movie.

Olivia fell asleep in our bed tonight (she had a very busy day).  I wanted to see a bit of the hockey game, so I figured this was as good a time as any to turn on the big TV.  I noticed all kinds of new HD channels.  I haven’t really had any time to check them out, but it looks like there may be a couple of cool science/nature channels (Equator, Oasis, etc).  I suspect it’s some sort of free-view happening and will be ending shortly.

The other thing I noticed, especially once I flipped over to CBC to watch the game, was that the signal quality was very good.  CBC tends to be good, but their hockey broadcasts always seem to suffer from blocking problems on Eastlink.  That really was not the case at all tonight.  Yes, there was some very minor problems, but, for the most part, the signal quality was bordering on excellent.

I don’t know if I just caught everything on a good night or if Eastlink is finally starting to get its act together, but I look forward to testing out the signal quality again over the next few days, just to see.

Not that I’m likely to actually watch it or anything.  Someone remind me why I’m paying for this? :)

Posted in Technology | Leave a comment

A new attempt at an old blog

I’ve already got a blog on blogspot (http://mikedigdon.blogspot.com) that I tend not to update, but I figured it might be fun to play with WordPress for a while and see if maybe that inspires me to write more.

You know, because I have so much free time.

Posted in Uncategorized | Leave a comment