2008-05-27

Random Notes from DemoCampOttawa9

All right, I want to jot down a few comments about DemoCampOttawa9 before I go off to bed. Now, I'm a software developer. I'm not a startup entrepreneur, nor an investor, nor someone in any way qualified to comment about how insanely great or ridiculously and laughably stupid a business idea is, so I'll just stick to talking a tiny bit about what I saw tonight. Oh yeah, the pics are up on flickr right here if you're interested, the license is Creative-Commons, and sorry about the wacky colours, it was your typical low-light restaurant / bar room.

DemoCampOttawa is a semi-regular series of meetings where members of the Ottawa high-tech community can go up on stage and show off hardware, software, services they're working on.

First, a big congrats to Alec Saunders for being a smooth and lively host. A nice thing about this evening is that no one that presented was a slick, practiced, PR person - every single presenter was a techy, and that made for an accessible, informal feel.

First up was a presenter from SIMtone. From the demo, they basically seem to rent you a WinXP virtual machine running in a datacenter. You don't just connect over RDP however, they provide a light Java client that runs on very modest hardware that can give you access to your VM instance. The presenter didn't have time to explain how they balanced the hosted VMs across physical boxes, or how much CPU and bandwidth you're allowed to use, etc, but he was accessing it over WiMax and it seemed to work OK. [note: we have WiMax service in Ottawa???]

 

We got an engineer who implemented a GPU on a Xilinx FPGA. He had it running live on a demo board, but didn't go into much detail about whether he was generating the video signal himself too or if he had much extra hardware on there to do that, etc.

This is Richard Mayer from Protecode. He demo'ed an interesting Eclipse plugin and associated web service that fingerprints external code added to your development projects and tracks the licenses under which it's distributed. It seems the big value here is in the massive database of publicly-distributed code they've built up. Their software can identify not only third-party libraries and source files added to a project, but small chunks of code pasted in as well.

 

Martin demoing Stockify, a web app for evaluating value stocks. The app looks at historical P/E ratios and earnings growth of public companies.

And finally, Joel and Pascal from picsphere, which makes workflow-management software for event photographers. We've seen plenty of photo-workflow management apps before, but this one seemed to have novel ways of importing the pictures, keeping them tagged by subject, and allowing instant sales at the point of capture (from what I could see in the demo). They were pretty cool because they really didn't project the condescending elitism you usually get from everyone in the photography industry, they felt more like purveyors of software for a more regular-guy, amateurish market (and probably a much larger one, IMHO).

Phew, that's it. I'll surely attend the next meetup, this was overall an interesting night.

2008-05-26

Does Google Desktop Search Have Selective Memory?

For frequently used applications, I have shortcuts (that get indexed by Launchy) and/or aliases set up in SlickRun, which are both fantastic little productivity enhancers.

When it comes to infrequently-used programs, however, I don't have shortcuts to them so I prefer to just use Google Desktop to search for the filename and click the first hit [essentially, I want to use Google Desktop as the 'locate' command under unix]. Sometimes though, it doesn't find what I'm looking for, even though IT'S RIGHT FRACKING THERE ON THE DRIVE:

google_desktop_1

CropperCapture[234]

You might start thinking: "Aha, it just doesn't index filenames in .exe" (even though that would be awfully inconvenient), but that wouldn't be true either:

CropperCapture[235]

Sigh.

My tech isn't working the way I want it to tonight. When will I start winning?

2008-05-23

Conflict!

This coming Monday (May 26th), there are two events in Ottawa, both starting at 19:00 :
  • A showing and then discussion panel on "The Story of Stuff", presented by the Sierra Club Ottawa. The panelists include Tracey Clark, who's the managing director of Bridgehead coffee shops. I'd really like to sit in on this.
  • DemoCampOttawa9, the tech event of the month for the Ottawa tech community.
Hmmm. I think I'll probably end up going with the nerds instead of the hippies, but this is one of those nights I really wish I could be in two places at once.

2008-05-19

Non-Reciprocal Recognition

Confession: I see people. They recognize me. I don't recognize them.
They'll remember me, I won't.
sucks to be me

2008-05-04

A snack-sized bite of Java for tonight

With Java autoboxing, always pay attention to what your primitives get boxed into.

Here's an easy little bug to introduce if you don't pay attention: consider these methods of the Map<K, V> interface:

V put(K key, V value)
V remove(Object key)

So you put a value into a map, and remove it. Easy enough.

Pop Quiz

So what does the following return?

public static String test() {
HashMap<Long, String> map = new HashMap<Long, String>();
final long some_key = 1;
map.put(some_key, "foo");
return map.remove(1);
}


...



...



...



...



Answer: null.



This is why it's important to remember the definition of the put, get and remove methods. While the generified [nda - yes that's a word, according to the Sun docs] flavour of put(K, V) ensures the key is an instance of K, for whatever K you declared for this generic map, the get and remove methods weren't generified and simply take an Object. This can bite you, as in the above function, where autoboxing essentially caused the following calls to happen, though it probably wasn't the programmer's intent:



    map.put(new Long(1), "foo");
map.remove(new Integer(1));


Even though Integer(1) and Long(1) have the same hashCode() value, they fail the equals() test, so key lookups when using the wrong wrapper class will always fail. The fix, of course, is to declare your keys as the right type when calling get() or remove(), and be careful, as the method signature will allow anything to be passed in, so you'll never know at compile-time you got it wrong.



 



Happy coding!



2008-04-29

Rogers vs Bell

So I was hanging out with a friend (who will remain nameless for reasons you'll see very soon) a while back, and I saw his new BlackBerry Pearl:

- So, you got a BlackBerry, huh?

- Yeah man, it's great!

- How do you find the Bell network?

- Actually I'm with Rogers. Cheaper.

- ...

- ...

- Dude, YOU WORK FOR BELL, don't you get service for free or something?

- Nope, it's still cheaper with Rogers

 

I was floored! If this isn't a great endorsement of Rogers Wireless, I don't know what is. (Yes, I know their data plans still suck, but it seems they "suck less" than the alternatives.) I can't imagine what it must be like working for a company that would treat its employees so poorly they'd sign a service contract with their biggest competitor.

2008-04-20

Argh! Missed it!

Totally non-techie post today for food geeks: it seems that La Bottega in Ottawa received a single Spanish jamón ibérico last Friday. I missed my chance to buy a few slices, reading about it only after the fact on Ron Eade's (the Citizen's food editor) blog, which I was only recently made aware of. Damn.

It is easy to underestimate the significance of this news item, but thankfully, in his video post, Eade reminds us that this is quite notable, as it is the first time jamón ibérico (made from pasture-fed black pigs of certified race) is available in Ottawa. In fact, until 2005, it was illegal to export it to North America, and since the ham must cure for three years before being ready to sell, it's only now starting to appear on our shores, and is a tad expensive (La Bottega was moving it at 200$ per kilogram).

2335311163_8c43106017

[sure, I paid 30$ CAD for the plate above last month but look at that marbling!]

Ottawa food enthusiasts have no doubt noticed that much cheaper (but still delicious) jamón serrano has been available in local food shops for a while now, which is made from white pigs with less restrictions on feeding.

2008-04-13

Is Deploying a Wireless Network More Secure Than Not Deploying One?

Yes, I think it is. Long-winded explanation follows.

Me: I'm a guy who loves to work on a laptop. I've owned my little Thinkpad since 2004. I have dragged it between Ottawa and Montreal dozens of times, hauled it through Spain and the United States while vacationing, it's been through several coffee shops in Ottawa, and even tonight, with three other computers in my apartment much faster than this one, I'm in the living room, writing this post on the faithful machine. If you call me up and need help with a build script or a complicated subversion operation, I'll run over to your cube with it and we can hack on the problem together, each on our own screen. Or anyway, I would if there were wireless network access points at the office.

Which there aren't.

(Yes, I'm well aware of the irony of working for a company that makes network equipment. No need to point it out.)

The subject came up on Friday evening, as a bunch of us engineers were sitting around having a beer before leaving for the weekend. Someone (I swear it wasn't me this time) wondered out loud why in this day and age, we didn't have wireless APs at the office. Asked our CTO: "Why don't we just drive to Futureshop and spend the fifty bucks?"

I suppose it's always been a "nice to have" feature of the office, never a true requirement, and commercial-grade WAPs are more expensive than the consumer versions from Linksys. I've also heard mentions that there might be concerns about the security of the setup, given that we lease a floor on a building housing a bunch of other companies. I realized after the discussion, however, that the security argument was bunk, and having no WLAN could actually put us at much greater risk than having one.

It is an oft-repeated saying in security discussions that humans are often the weakest part of a security system. In his book Secrets and Lies, security guru Bruce Schneier again reminds us, as he has before, that an inconvenient security system is self-defeating because humans will simply end up not using it. In Chapter 17, he relates this story:

It has been said that the most insecure system is the one that isn't used. And more often than not, a security system isn't used because it's just too irritating.

Recently I did some work for the security group in a major multinational corporation. They were concerned that their senior management was doing business on insecure phones - land lines and cellular - sometimes in a foreign country. Could I help? There were several secure-voice products, and we talked about them and how they worked. The voice quality was not as good as normal phones. There was a several-second delay at the start of the call while the encryption algorithm was initialized. The phones were a little larger than the smallest and sexiest cellular phones. But their conversations would be encrypted.

Not good enough, said the senior executives. They wanted a secure phone, but they were unwilling to live with inferior voice quality, or longer call setup time. And in the end, they continued talking over insecure phones.

This is exactly the risk that an office takes by not deploying secure, properly configured WAPs managed by the IT team. Wireless networks are a convenience for many. There are some (albeit still rare) laptops appearing that don't even have a network jack anymore; and this is just the beginning of that design trend. Sooner or later, someone will get fed up and install a rogue access point, connected to the corporate LAN, and quite possibly insecurely configured and allowing routing to every resource on the network. It may already have happened. Wishfully thinking otherwise is simply ignoring the human part of the equation, hardly good practice of security.

2008-04-06

A Firefox Search Plugin for the Ottawa Public Library

The Ottawa Public Library has a very neat service where you can look up a book online, request it to be delivered to whichever branch is closest to you, and be notified by email when your the chosen tome is available for pickup. If a book is already checked out, you can simply request the next available copy to be delivered.

oplheader-logo

Seeing how I do quite a bit of reading these days, I set about creating a Firefox search plugin to easily search their catalog. In truth, I just wanted a quick way of looking up a book in the library catalog when I'm on Amazon.ca or I read a book recommendation on a blog.

Installing this search plugin

  1. Navigate to your Firefox profile directory (%APPDATA%\Mozilla\Firefox\Profiles\whatever).
  2. If it's not already created, create a new folder called "searchplugins" (without the quotes).
  3. Copy this file (ottawa_public_library.xml) to the searchplugins folder, then restart Firefox.

Usage

It's dead simple. Open the search engines drop down menu and choose the new "Ottawa Public Library" option:

opl_search

Now type in keywords from the book's title and hit enter:

opl_search2

This plugin does a search using the "Keywords in TITLE" option, as I thought that was the most useful. Hope you find this useful! Tell your geeky friends!

Edit: ah yes, I forgot to say, the XML file includes a copy of the library's logo, taken from their favicon.ico file. I haven't asked the city of Ottawa for permission to redistribute the icon, but I'm quasi-certain it wouldn't cause a problem. If I get complaints I'll put a new icon in there.



Another update: There's been some interest in this, so here's an easier way to install: Click here to install the Firefox search plugin for the Ottawa Public Library

2008-04-03

Resolved: Boingo Refunds Their Double-Charge

A couple co-workers have been asking me for an update, so here...

Last weekend, I wrote a post (link) about how after logging on to the Boingo wireless service from two different airports on the same day, I was charged twice despite having purchased a 24-hour pass. At that time, I contacted their phone service, where a customer rep explained it was normal, and advised me to read the user agreement next time.

Luckily, I didn't have to do a credit card chargeback; as a result of my blog post, I was contacted by Boingo's PR firm, and apparently the phone rep I talked to was incorrect: what happened was simply a software glitch. They've refunded the second (erroneous) charge, so it looks like this was just a one-off problem, and not the shady business practice I initially suspected. Phew! All is now well.

2008-03-31

Read Jason's post about Stat(CVS|SVN) if you care about repository analysis

My good friend Jason, one of the two talented developers that form micro-ISV LavaBlast Software, just put up a post about exciting happenings in the StatCVS and StatSVN world. Although I'm no longer really involved with those projects, I'm happy to see these developments, and want to give a kudos to guys like Jason Kealey and Benoit Xhenseval and all their collaborators for all the great effort they've put in.

As for myself, I'll be involved in more SVN-related tooling projects in the coming months, but I can't talk about that just now... :)

I need to reply to Jason's conclusion about coming back to Java development, though, especially the note about explicitly creating Integer objects:

"Personally, I enjoy loading up a recent version of Eclipse and working in Java once in a while because it helps me observe the best in both worlds. I much prefer coding in C# because of the easier string manipulation and the fact that everything is an object so you don't have to explicitly create an Integer object from your int to insert it into a collection. However, when working in VS.NET, I dearly miss the automatic incremental compilation feature that Eclipse runs when you save a file."

If it's been a little while since you've looked at Java, know that J2SE 1.5 brought a lot of great improvements especially in the Concurrent and Collections namespaces, as well as new language features. One such usability improvement is known as autoboxing, which means basic numeric types like int or float are automatically "boxed" into their object containers (Integer, Float, etc.) when required, like when adding an element to a collection, and "unboxed" when the native type is required. Just thought you'd like to know, Jason ;)

[It goes without saying that you should always be mindful of the performance impact of creating a bunch of temporary objects like this! Operations on Integers are always going to be slow-ish because they're immutable, and new objects are created for every value you use.]

2008-03-29

Watch Out For Boingo Wireless in Airports (scam alert?)

Be very, very careful with Boingo Wireless hotspots.

On a recent trip from Madrid to Ottawa, I had a 6-hour layover in Newark Liberty Airport (EWR). I decided to go ahead and pay $7.95 USD for a 24-hour access pass on Boingo Wireless so I could catch up on news and mail, while passing the time. I didn't want to subscribe to anything (I'm not a frequent-flier, I just happened to want access that day), so I bought a day pass:

CropperCapture[217]

Here's what it says:

"Don't travel much? Get a Boingo AsYouGo account for just $7.95 per Connect Day for locations within the U.S. & Canada and $9.95 internationally. A Connect Day includes unlimited access in any location for 24 hours. No monthly fees apply."

I used the pass I bought on March 24th, 2 hours 35 minutes in Newark (EWR) and then 5 minutes in Ottawa (YOW) while waiting for checked luggage to arrive (email addict!). Note that the plan description says "in any location", not "in any single location". Imagine my surprise when I found two charges on my credit card bill: one on March 24th (expected), and another one two days later on March 26th! I called customer service, and they refused to reverse the second charge, informing me that it was incurred when I logged in for a second time in another airport.

I've reviewed the user agreement at [https://signup.boingo.com/signup/DisplayBCA.app], especially Section 3, "Locations and usage", and at time of this writing, it doesn't appear to me to contain any language restricting usage of a day pass to a single location, or any warning that logging in from a second location during the same 24 hour period will result in a new charge. I've since written to their customer service to explain the situation and request a refund of that second charge. I'll update this post when I hear back from them.

UPDATE: Sounds like it was simply a software glitch! I've been refunded.

2008-03-24

Metro Madrid: You Fail at the Internet

Exhibit A: Line 2 is closed between Banco Espana and Opera.

OK, no big deal, I heard about some sort of closure in the paper, but before I go out I want to look up which stations are closed, and what the current status of the line is. Should be some sort of notice on the website, right?

Exhibit B: Metro Madrid's landing page, with current news items (March 23rd, 2 days after the line was partially shut down)

CropperCapture[19]

You fail at the Internet.

2008-03-20

User-Hostile Design

This post is in the spirit of this fun one. I spent two nights in a hotel in beautiful Malaga (ES), and was confronted with these 'interesting' controls:

Here's the equipment:

 

Both rotating knobs have a small unmarked button on them, which can be pushed in, then comes back out by itself immediately. I was not able to figure out what either of those buttons did.

The left knob is marked with temperatures from 20C to 50C, so purportedly controls temperature, but there's no mark anywhere around it to act as a pointer, letting the user know which temperature is selected. Not that it matters much, I've tried spinning it in both directions, with and without holding the button, and never felt the temperature change from "warmish". It spins much more easily in one direction than the other, leading me to believe the direction with the most resistance must be doing something.

The right knob selects the flow and function (showerhead, telephone-style showerhead, bathtub spigot, those 3 body jets on top, and the 4 jets below those [which I never managed to turn on]), by turning in one direction, which you can do if the flow is on high. Keep turning (harder) when the flow is on high and it will switch functions (yes, think about it). The functions are marked 'T', 'C', 'C', 'L', 'E' (how clear!), I don't know in which language those letters might stand for something. The button apparently does nothing. Since switching functions can only happen by spinning one way, if you miss the one you wanted, you have to go through the whole array once more, spraying water out of every one of those holes.

WORST. SHOWER. CONTROLS. EVER.

2008-03-19

Must we really drive so fast on a narrow mountain road?

You know those stories you keep seeing filed under "miscellaneous" with titles like "35 tourists plunged to their deaths in some other country blablabla"?

Well now I get it. Took a bus ride in Spain - the roads are super narrow and winding, there's only a few feet between the road and certain death, and the driver is treating his bus like it's a sports car. I had white knuckles the first thirty minutes until I got desensitized to it.