May 19, 2013

Google I/O 2013

Google I/O 2013 was my second I/O and it was as spectacular as the first. After a bit of a headache getting my hands on tickets the rest went flawless.

Android Track

There were fantastic announcements in the Android track, most impressive the switch from Eclipse to IntelliJ. Easier APIs for location - including using sensors like accelerometer, gyroscope for interior mapping - improve how developers can consume location updates from the phone.

The biggest eye-opener in the Android track were some fantastic talks about UI with fresh ideas to design for tablet with tips and tricks to utilize those bigger screens nicely. Another talk about Google Play Services API was incredible, as Google has a way to update APIs, regardless of OS version, s without having to wait for manufacturers. An example of this is the new location API, which is available as low as Android 2.0. I assume this is the same way that the GCM clients are updated on devices.

There were excellent talks about monetization and discovery. The short version is that free-to-use models seem to work best. Unlocking features with in-app purchases will create user retention (assuming your app is good). This is counter intuitive to me, being used to more traditional payment models from iOS, where an app costs X and remains free for its lifetime. Android users are apprehensive to spend cash without seeing the app first - odd considering they have a trial period on purchases and subscriptions.

An interesting library provided by Google is Volley. A networking library that provides caching (LRU, I believe) for resources of a variety of types, including images. It also provides a custom view for networked images. NetworkImageView - why Google (and Apple for that matter) don't provide these as part of the framework is beyond me. The library also provides an easy way to deal with view recycling while AsyncTasks are running. Generally appears to make life easier for networking.

Accessibility in Android 4.2 has taken a giant leap. While it's not quite VoiceOver it's a fantastic step in the right direction. I hope to implement some of the new accessibility items on some of our apps. I don't fully agree with the drawing of gestures or the confusing TalkBack menu.

The animation session was a nice deep-dive into how animations are scheduled and what can be done to properly animate views. There's too much information in my notes I still have to go over to get a proper handle on things.

Chrome Track

The Chrome track shed some light on the WebP format and how to better deal with high pixel density screens in efficient manners. I was disappointed nobody talked about the clown car method.

The PageSpeed Insight plugins were quite impressive, I hope I can give the nginx plugin a whirl soon. Currently our build processes do all this for us when we deploy. Having that automated by a company that specializes on optimizations like to seems an easy way to save development/configuration time.
While the module will rewrite HTML to reorder / defer loading of CSS and JavaScript, it was not mentioned if the module can rewrite inline data-url images to JPEG or WebP.

A repeating theme for the (mobile) web was ensuring something reaches the screen within 1000ms. Even with modern cellular networks the issue is latency, not bandwidth. The key is reducing the number of redirects (and thus DNS lookups) and generally trying to reduce round trip times. Something should be on the screen within the first second to keep the user's attention. I hope to blog more about this in the future as we have an increasing interest in hybrid applications at Labs.


The AfterHours party was impressive in usual Google-style. Musical performances provided by (the) Billy Idol and Steve Aoki. Both of whom told us to get paid, and that Google is awesome!

ArcAttack was there playing a variety of tracks. Despite offering they could not tell us more about the physics behind the musical Tesla coils. Nerd highlight, of course, was Vader's March.

A gargantuan, hydraulic forearm and hand provided entertainment lifting full-size oil barrels 20-plus feet into the air, crushing them, and dropping them with a floor-shaking, satisfying thud.

Automotive robots mixing drinks were a highlight. You could walk up, make an order of a variety of cocktails, and wait for the robots to create them. One robot would fill glasses with alcohol and mix, while two waited patiently for the beverage, mixed them gracefully and poured them back into a glass for final delivery by conveyor belt. The mixing had this near human-like agility to it that made the robots look quite odd indeed.

As always the catering of meals was delicious, and filling. Thanks Google, thanks to the Moscone staff, great event! I can't wait to be back in San Francisco.

May 18, 2013

I'm done with United

I used to love flying. It was magical, an occasion. Now, thanks to obnoxious security measures and increasingly incompetent staff of certain airlines it's a chore. Vacations no longer start at the airport, they start at the destination and end in the cab to the airport before departing home.

As a kid we always flew Star Alliance, they were/are the easiest way to get to Canada and back. The Air Canada / Lufthansa hubs in Frankfurt, Munich, and Toronto had the shortest flights and best connections. Star Alliance carried over into my adult life where I simply book Air Canada to get back to Germany, and around the world.

Sadly, using Star Alliance means I have to use United when I fly to the US, which always ends up with me being frustrated, today pissed. UA, consistently, is the airline that loses my luggage, overbooks flights and bumps me to standby, and sets the bar for airline staff incompetence and rudeness.

I'm prepared to avoid the entire Star Alliance if it means I don't have to fly a connection operated by UA (or its connection partners). I'm prepared to fly a UA code share if the flight is actually operated by Air Canada or Lufthansa.

After an awesome vacation and conference in San Francisco I got to the airport with plenty of time to spare to get checked in, through security, and hang out at the gate. I got to the check in counter and checked in - already frustrated I had to pay $25 USD to check one back. When a staff member came around to tag my bag I was asked if there was anything fragile in it. I answered there were two bottles of wine, so I'd appreciate a fragile sticker. I've flown with bottles or cans in my checked bag for years and have never had a problem. I was told that due to a new policy I can no longer transport bottles in my suit case (and thanks to the TSA I can no longer take them as carry on), and would have to go back to the main entrance to get the bottles properly packed - for a fee - return here and check them - for a fee.

Off I go back to the main entrance to find an airport-owned store, the "Airport Travel Agency", buy a $26 box, pack my wine, get the box taped and shrink wrapped, and head back to the UA counters to check it.

I got to the front of the line and asked an agent what to do to check a second bag into an existing check in. In response all I got was "Move it along, go to the machines, they're open. Keep the line moving, folks." And no response. As always when I'm frustrated I swore under my breath "Thanks for fucking listening." - not my best trait.

Oh goodie, that got the attention of the agent! A loud conversation at the front of the line started telling me to just use the machine, with my questions going unanswered - I have no idea how to use UAs check in machines to check an additional bag to my existing check in. Granted, I could've just tried, but good customer service, to me, is having my question answered rather than being ushered through a line to a machine like cattle.

I don't care if the agent has answered the same question a thousand times that day, as the face of UA it's an agent's responsibility to make me feel welcomed.

I finally got all my items checked - oh, the second bag costs $35 to check - and am now fuming at myself why I (by flying Star Alliance code shares, or having work book my flights) continually enable UA to receive money and business they simply don't deserve for their quality of service.

I'm hoping to use Delta for more US destinations, WestJet as a backup. Anything to avoid UA operated flights.

April 30, 2013

South America

I've hit the ground running after my return from South America, and I'm struggling to really sit down and write about my experiences. I will hopefully find the time soon to put my travel diary into real words here.

I've quickly sorted through some of my pictures for your enjoyment.

Here's a few highlights:

  • Surfing in Lima, Peru
  • Completing the Lares Trek pain-free
  • Machu Picchu
  • Biking the Death Road just outside of La Paz, Bolivia

April 6, 2013

Off to South America!

Tomorrow morning I depart for a two week vacation to Peru and Bolivia. With some friends, and strangers, we'll be exploring Lima, Cuzco and La Paz.

After a few days of relaxing in Lima we are flying over to Cuzco. A few days of acclimatization will be followed by a hike on the Lares Trail up to Macchu Picchu. Finally we spend a few days in La Paz. My companions continue their treks through various other countries (lucky...), while I return home.

My past travelling has covered Europe and North America, so this opportunity to experience a new continent and several cultures that I don't consider predominantly "Western" is extremely exciting. I'm really looking forward to meeting new people, experiencing new cultures, hiking through the Andes, and witnessing (what I hope to be) a majestic experience of mountain-top ruins.

See you in two weeks with some pictures and experience!

February 11, 2013

SaskTel LTE Frequencies

This is a follow up to my long-winded state of Canada's 3G+ networks. The article is also a good refresher on some of the terminology used here, if you're unfamiliar.

All major carriers (Bell, MTS, Rogers, SaskTel, Telus) are using AWS Band 4 on 1700/2100. This is in line with USA carriers AT&T, and MetroPCS.

Verizon, Sprint/Nextel, Leap, and US Cellular, all run on some variations of the 700/1900, or 1700/1900/2100 bands. Their LTE devices will not connect to a Canadian data LTE network. Ensure your devices are capable of AWS Band 4 over 1700/2100.

What is LTE?
LTE stands for Long-Term Evolution. It's (probably) the final chapter in what's been coined by the marketing machine as 4G. You'll see it marketed as 4G-LTE, most likely.

It has real-world tested speeds of 75MBit/s-100MBit/s down, 20MBit/s-50MBit/s upload. To put that in perspective, your home internet, most likely, isn't more than 25MBit/s down, 5MBit/s up.

What about coverage?
In those areas where there is no LTE coverage (regardless of carrier) your device will fall-back onto existing 3G/4G infrastructure. That is, UMTS/HSPA for Telus, Bell, and UMTS/HSPA/GSM for Rogers.

Who's got LTE-Voice?
LTE-Voice is a network component where voice and data run over LTE. Currently, from what I understand, no Canadian carrier has this LTE-Voice component active, meaning your phone will drop back to 3G during a voice call.

What's with all the frequencies?
LTE was long heralded as a saviour to the insanity that is GSM/UMTS/HSPA frequency-hell. With that said, thanks to lack of international involvement, slow governments and standardization bodies, LTE is now making customers roll their eyes even more at wireless choices.

The Canadian carriers did a great job during the spectrum auctions, and re-using existing spectrum and it appears as though all major carriers have settled for the same frequency. Meaning an LTE device from Rogers, will port over to SaskTel, vice-versa.

The American carriers, with larger coverage areas, and increased competition struggled harder to come to agreements. For example, AT&T and MetroPCS are on the same frequencies for up/down links, meaning their devices should port from one network to another. But an iPhone 5 on AT&T will not work on Verizon, as their LTE spectrums are completely different.

Empty response from Django after POST request

I am assuming you're serving up your application through Python, Django, uWSGI, and nginx.

There is a chance that an improperly configured uWSGI server will return a 200-code, empty response body when the initiating request had a large POST body.

Larger post bodies, such as those sent by twilio, are dropped by uWSGI, resulting in the above response.

To save you some time digging through logs, the easiest solution is to configure your uWSGI server with a larger post-buffer setting. At SaskTel Labs we've settled on 4096 bytes.

January 1, 2013

My Top 2012 Albums & Tracks

2012 was a year of a lot of personal and professional change for me. Music has always been a great escape from reality for me. Without much talk, here's my personal list of "Top Albums" of 2012 - some of which were not released in 2012, but were played a lot. They're in no particular order.


  • Bloc Party - Four
  • Bibio - Mind Bokeh
  • M83 - Hurry Up We're Dreaming
  • Gold Panda - Lucky Shiner
  • Justice - Audio, Video, Disco
  • Mumford & Sons - Babel
  • City & Colour - Little Hell
  • Manchester Orchestra - Simple Math


  • Nine Inch Nails - Right Where It Belongs
  • Prokovief - Juliet's Death
  • White Buffalo - Black & Blue