Posts on this site are never sponsored.

Canadian credit cards that waive foreign currency transaction fees

Most credit cards charge a 2.5% transaction fee on top of the exchange rate on US-dollar and other foreign currency transactions. There are a few credit cards that currently do not charge this fee; they are all Chase-issued cards:

They are worth considering if you do a fair amount of purchases each year outside of Canada. $1000 of purchases would typically cost an extra $25 in transaction fees; $5000 would typically add another $125 in transaction fees. Of course, there are many other factors to consider when choosing a credit card, such as rewards program, annual fee, insurance benefits, customer service, interest rates (if you do not pay your balance in full each month), and much more.

If you have a US-dollar bank account, you could also look into US-dollar credit cards, such as this one from BMO that has a $25 annual fee ($35 starting September 1, 2012) that is waived if you spend at least $1000 US in a year. This saves you the transaction fee for US purchases, saves you the exchange rate buy-sell spread (since you almost never get the mid-rate), and insulates you from exchange rate fluctuations. At the moment there are no Canadian-issued, US-dollar credit cards without an annual fee (except when part of a banking bundle or with a minimum spend).

Free TypeKit alternative: Google Web Fonts review

Fonts for websites has long been a complex issue. There are a few standard fonts that most visitors will have. Straying outside of that set of fonts brings up challenges of: load time and Flash dependency (with sIFR), licensing and complexity (with Cufon), maintainability and bad SEO (with images), or cost (with TypeKit).

Google Web Fonts is a free alternative that currently has 501 open source fonts to choose from. It’s not the perfect solution, but it is compatible with most browsers (going back to Internet Explorer 6+ and Firefox 3.5+, for example) and very easy to install on a website.

1. Select a font or fonts to use on the Google Web Fonts site, such as Francois One:

Francois One Google Custom Web Font

2. Include the relevant Google stylesheet call:

<link href="" rel="stylesheet" type="text/css" />


Include the relevant Google JavaScript call:

<script type="text/javascript">
  WebFontConfig = {
    google: { families: [ 'Francois+One::latin' ] }
  (function() {
    var wf = document.createElement('script');
    wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    wf.type = 'text/javascript';
    wf.async = 'true';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(wf, s);

3. Use the font in your stylesheets as per normal:

#header h1 { font-family:"Francois One", "Century Gothic", "Trebuchet MS", "Arial Narrow", Arial, sans-serif; }

Note that you should always use a list of fonts to provide fallback options if the technology and/or fonts are not supported.

One of the drawbacks of Google Web Fonts is what is commonly called “flash of unstyled content” — for some visitors, site elements will show in a fallback font before the selected font style is applied.

Apache mobile redirection and testing user agent strings

If you decide to set up a separate mobile website rather than use a responsive design, you need to implement some logic to detect a mobile browser and perform the redirection. There are many approaches to this, depending on your specific needs and your hosting and site environment. For example, you could use Apache Mobile Filter or a third-party hosted service such as Mobify.

A simple method is to perform the redirection via Apache rewrite conditions and rules in your virtual host configuration or .htaccess file.

Sample Apache rewrite rules for mobile redirection

The identification of whether or not a visitor is using a mobile browser is based on the user agent string. There are many mobile devices and thus many possible mobile user agent strings; is a great place to download lists and starter scripts for detecting mobile browsers.

The example Apache configurations below assume the following scenario:

  • Your main site is at and the mobile site is at
  • When a mobile browser (but not a tablet) visits the main site for the first time, it should get automatically redirected to the mobile site.
  • On the mobile site, there is a link back to the mobile site that appends the GET parameter “fullbrowser”. If a user clicks that link, they should be kept on the full site and no longer get automatically redirected. (This is implemented by setting and checking a cookie to indicate that they went back to the full site.)
  • For mobile users who clicked the link to go to the full site, they would also be shown a link to go back to the mobile site that appends the GET parameter “mobilebrowser”. Clicking this link would remove the cookie that was set in the previous step; this means that the next time they visit the full site, they should again be redirected to the mobile site.
RewriteEngine On
## Set the mobile-to-full cookie if a specific GET Parameter is set, and
## the client is a mobile platform

#The domain / sub-domain on which a GET parameter can be sent, if used; not necessary
#RewriteCond %{HTTP_HOST} ^yoursite\.com [NC]
RewriteCond %{QUERY_STRING} fullbrowser [NC]

#Set the cookie for a year
RewriteRule .* - []

## Reset the mobile-to-full cookie if a specific GET parameter is set (i.e. if they click on a "back to mobile site" link)
#The siteaccess on which a GET parameter can be sent, if used
RewriteCond %{QUERY_STRING} mobilebrowser [NC]
RewriteRule .* - []

## Redirect mobile devices if no cookie is set and no GET parameter specifies no-mobile view

#If no GET parameter
RewriteCond %{QUERY_STRING} !fullbrowser [NC]
#If no cookie set
RewriteCond %{HTTP_COOKIE} !fullbrowser=1 [NC]

# These user agent strings are taken from
RewriteCond %{HTTP_USER_AGENT} android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|
mmp|netfront|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|
as(te|us)|attw|au(di|\-m|r\ |s\ )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(i
t|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.
w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|i
kom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\
-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\ )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(
e(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\ )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-
|81|83|85|98)|w3c(\-|\ )|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-) [NC]

#The (public) siteaccess to be redirected to the mobile platform
RewriteCond %{HTTP_HOST} [NC]
RewriteRule ^(.*) [L,R=302]

Testing website behavior with different user agent strings

Once you have implemented mobile redirection (or any redirection for that matter) you need to test it. When it comes to testing user agent strings from different devices, it is obviously difficult to test directly on multiple devices. Thankfully you can modify the user agent string in your browser with extensions / plugins such as this one for Google Chrome.

Selecting a user agent in Google Chrome

When I don’t need to test the display output, I prefer to use cURL in order to avoid browser caching. (Sometimes you’ll solve a problem and think it’s still broken, or vice versa, because your browser has cached the page or the redirection.)

cURL is a command line tool that, among other things, lets you test the HTTP response of a web page and also enables you to change the user agent string (via the -A parameter). It is readily available and/or installable on Linux and Mac operating systems; on Windows you can use Cygwin to get Linux-like commands.

Here is an example to test the response of a web page using an iPhone user agent:

$ curl -I -A "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"

HTTP/1.1 302 Found
Date: Sat, 30 Jun 2012 22:11:25 GMT
Server: Apache
Content-Type: text/html; charset=utf-8

“screen” Linux command: running long server operations independent of your network connection

If you’ve manually executed any script on the command line of a remote server that took more than a few minutes to finish, you probably know how the completion of the script is dependent on your connection to the remote server. If your Internet connection drops, even temporarily, or if for some other reason you disconnect from the remote server, the script will also stop. This can be very frustrating if your script was expected to run for a few hours and you have to start it over from scratch.

nohup is one way to keep the script running no matter what happens; however, for various reasons I prefer to use it only for continuous, indefinitely running processes. For processes that are supposed to eventually finish, I recommend using screen. The basics of screen are straightforward:

  1. Type “screen” to open a separate shell session. Then run your command.
  2. Type “CTRL+a” to invisibly bring up its menu (in other words, to have it listen to your screen-specific instruction). Then type “d” to “detach” from the screen. Your command will continue to execute
  3. Optionally log out or drop your connection. Then log back in.
  4. Type “screen -r” to resume your session.

Telus and Shaw promotions and retention plans

After a mediocre experience with a smaller Internet provider, I am resigned to using the big companies for Internet and TV services. (If you’re looking for a landline phone plan, consider a VoIP provider.) In Metro Vancouver, if your building is not serviced by Novus, that means you have a choice between Telus and Shaw.

Telus and Shaw’s regular monthly rates are less than inspiring. However, they are always running promotions for new customers; and, just like with many cell phone companies, if you are an existing customer, you can get a much better rate if you ask for it.


At mall kiosks, retail locations, through advertisements, and direct mail, Telus and Shaw run continuous promotions for new customers only. Typically a “new customer” is someone who has not been a customer for the past 30 days to 6 months. They also have deals for students, usually around September each year. There are multiple marketing campaigns running at any time. Do a Google search to find out about what’s current, especially regarding direct mail promotions.

However, the low rates in their promotions typically don’t last very long (often 3-6 months), at which point the monthly fee can more than double. This leads many people to switch providers every year to take advantage of the latest deal. This is, of course a hassle for the customer.

A list of promotions I’ve recently received:

Retention plans

While Telus and Shaw spend a lot of time and effort attempting to lure new and not-so-new customers, they seem to neglect their existing customers when it comes to deals. However, this is not entirely the case; they have so-called retentions departments who will listen to why you want to leave them and attempt to keep you by giving you a better deal. They just seem to want to make you work for it.

A few notes on retention departments and plans:

  • Often you’ll find that if you indicate on the automatic phone menu that you are a new customer, you get through to someone right away. If you indicate that you are an existing customer, you get put on hold. You can press the appropriate number to indicate that you are a new customer, then simply tell the customer service representative that you are an existing customer. (Sometimes they all ask you for your existing account number no matter what.)
  • Typically to get to the retentions department, you have to say that you want to cancel your service or are willing to cancel a part of your service.
  • Be calm and courteous. Being aggressive and/or hostile does not make most customer service representatives want to help you. They spend most of their day on the phone, and can get tired and cranky like the rest of us. They also aren’t the direct cause of any of your distaste (if any) for the company.
  • Many people have recommended that you should indicate how a friend or family member is getting a better rate (if it’s true) and also what the competitor is offering. However, I was once thanked by someone at Telus for not trying to haggle by bringing up Shaw’s rates. I was also thanked for being honest and for not trying to “game” them. The best approach likely depends on who you talk to.

Got any tips for getting a good home or small business Internet / television / phone plan? Share them in the comments!