3 Annoying Things About Ford Sync

I’ve had a Ford Escape for about 4 years now and one of the things I really love about it is the integration of the Microsoft Sync system with Bluetooth devices. From both a safety and convenience standpoint, it’s fantastic being able to use the phone handsfree and to stream Bluetooth audio to the stereo with a minimum of effort.

That said, there are a few really major annoyances that are easily correctable but have yet to be addressed in any firmware updates.

  1. When you get into the car and maybe settle in listening to a news story or catching some scores, there is nothing more annoying than the “911 Assist Disabled” message that appears and interrupts anything playing on the radio for about 10 seconds. The 911 Assist feature will automatically call 911 if you are involved in a collission. Besides being a feature that I am not interested in having happen automatically, but the constant reminder that I don’t want the feature turned on is very frustrating. I don’t know how many times this has happened to me, but it always seems to be at the most inopportune time and I’ll miss something that I wanted to hear on the radio. They added a firmware update a few years ago to at least suppress the spoken message telling you that you had disabled the feature. That was a major improvement. But the 10 seconds of silence while the display tells you that it has been disabled is incredibly annoying. Yes, I disabled the feature. Please stop reminding me of my choice.
  2. The Bluetooth audio streaming feature is fantastic. It’s nice not to have to plug in USB but instead to control and operate my iPhone to play podcasts and music over the stereo via Bluetooth. The playback is flawless and pretty seamless. The annoyance is that if you are not streaming Bluetooth, but instead are listening to the radio, the Sync system will still kick in and start Bluetooth playback on your iPhone. What this means is that every time you get into your car, your iPhone will silently be playing back and streaming audio to Sync even though you aren’t listening to that input. The result is an incredible drain on your iPhone battery. It’s incredibly annoying to constantly check your phone only to find that it is silently playing and sucking the life out of your charge. The only workaround is to Pause Bluetooth streaming while listening to it before switching to another media source. Even this technique seems to work less than half the time. To my way of thinking, this is a major gaffe that probably affects a lot of people.
  3. This is a minor quibble, but knowing the nature of Bluetooth playback, it would be nice if the song tile and artist would show on the display. It seems like an oversight in the design that would make the experience a lot better.

Again, I love the integration between Bluetooth devices and Sync for the most part. It makes for a much better driving experience and is certainly much better than the days of plugging in AUX inputs and fiddling with tapes and CDs. But a few minor improvements in the technology could go a very long way in helping make it a better all around product.

5 Things About Bell Fibe TV That Are Great/Suck

I recently switched from Bell TV (Satellite) to Bell Fibe TV in the hopes of reducing my bill and still retaining the programming that I’d like. I decided to write this post tonight because that decision has inadvertently caused me to miss watching the Senators game (but more on that later).

Bell has a real push on to get customers to move from satellite to a wired service. I imagine it  enables them to bundle additional services (internet, cellular) and to reduce the cost/complexity of installation.

After about 4 weeks on the service I have some strong thoughts. My installation was pretty smooth because I already had RG-6 going to each drop and opted for that instead of CAT-6. 

Here’s the good:

  1. Better Pricing – Hands down, Fibe is much better priced than satellite. The Better package gives me most of what I want. Because of the number of simultaneous programs that can be recorded (4 HD), timeshifting which is available in the Best package isn’t really necessary. As well, you don’t pay a silly surcharge for getting HD channels.
  2. Local Channels are HD – On satellite, the locals that were provided were mostly standard definition. With the ability to localize multicasts by city, this means that the local CBC affiliate is now HD for me. This is great for those nights when a Senators game is not the national broadcast on CBC. I used to have to rely on OTA (over-the-air) to get an HD signal.
  3. On Demand Programming – There is a ton of on-demand programming available, ranging from kids shows to episodes of current run shows that you may have missed recording.
  4. Consolidated PVR – This was the biggest selling point for me. One receiver acts as a PVR. All other remote receivers use that receiver to record programmes. The interface is pretty seamless and intuitive. It’s nice to start watching something on one TV, pause it and move to another.
  5. No Weather Dropouts – Very heavy snow or rainstorms would create outages with Bell TV. Usually they didn’t last long but did happen at inopportune times. It’s nice not having to worry about that anymore.

And then the complaints:

  1. Guide Sucks – The guide is horrible. It looks great, navigates quickly but ultimately is lousy. You cannot filter out all of the channels you are not subscribed to like you could with satellite. Satellite showed you the channel in a different colour, or you could hide unsubscribed channels altogether. Not so with Fibe. I guess they want you to see what you are missing so that you’ll be prompted to upgrade. Instead you have to go through the labourious task of setting up Favourites to only show channels you want… ONE AT A TIME. And all that sharing technology between the receivers? Not for the guide. You’ll need to go through that painful exercise for each one.
  2. No Sportsnet Senators channel – This is the one that prompted me to write tonight. Despite my research before switching services and confirmation from the Bell’s own site, the Sportsnet Senators channel which is used when Sens games are bumped (tonight in favour of the Jays home opener) is NOT available to Fibe customers. Well at least not in Ontario. I had this confirmed by Bell. Please lodge a complaint with them if you’d like to have this added as per their own site.
  3. Programming Timers – On satellite, any timer you set started a minute early and 2 or 3 minutes beyond the scheduled time by default. You can extend the timing on Fibe as well, but for EVERY programme you schedule as you set the recording. Doing this by default would make a lot more sense. I’ve missed the end of a few shows already because of this.
  4. No UHF Remote – A minor quibble, but the IR remote seems to require that you be directly facing the receiver. It doesn’t have much field of vision from an outside angle. The UHF remote with Bell TV is much better, even allowing you to put the receiver in a ventilated enclosure with no line of sight.
  5. Sacrifice of Internet Bandwidth – Again, this is a minor quibble. I had Fibe 25 internet service before adding television. The marketing material fails to inform you that you will be capped at 15 instead. It’s understandable that they want to reserve bandwidth for excellent TV performance, but they should be a little more forthcoming with that information.

Overall, I’m fairly happy with the service, with the consolidated PVR trumping most issues. The good news for Bell is that most things on the complaint list can be fixed. It’s only software after all.

How to Work from Home

The past year has seen a lot of change in my professional life. After spending 17 years working from home on my own business, my involvement in our startup Health Wave, has meant that I’ve returned to an office environment after nearly 2 decades of working alone.

While there have been some adjustments on my part in getting used to working in the same room with others, in an open space environment no less, for the most part the transition has been pretty seamless. Amongst our team, the subject of working from home has come up a few times. Braatzy (our CEO, who is used to working in ANY environs thrown at him, be it office, train, airport, taxi) suggested I impart a little wisdom and guidance on how to do it the right way (or at least in the way that it works for me).

First off, let me opine that I don’t think working from home is for everyone. There are some people who need the externally imposed structure of an office, set hours and someone checking in on them offering guidance. And for those that will be successful at it, it’s still a learned process. Looking back to 1995 when I suddenly had to start working out of my house, I realize that it probably took me at least a year to get disciplined and do it correctly.

So here are my thoughts about how to make the transition:

  1. Have a dedicated space for work. I can’t stress enough how important it is to pick an appropriate place in the house to work from. Working from the kitchen table or from the couch isn’t going to cut it. While some people may have a small apartment and don’t have the luxury of a free room, if you have an office, spare bedroom or some other space (preferably with a door), stake out that spot and consistently use it as your work area. For me, I’ve almost always had either a spare bedroom or an actual office with a proper desk.
  2. Respect the bounds of the office. Again, this may be difficult if you have limited space, but as much as possible, treat that space and your presence there as “work time”. It’s important to let your family or housemates know that when you are in your “office”, treat it like you aren’t home. The same goes for you when you are finished working for the day. Close the door, leave the space and put work aside.
  3. Always shower and dress for work. I’ll bet some people laugh at this because one of the romantic notions of working at home is “hey I can work in my pyjamas”. I never sit down to my desk without first having showered and dressed for the day. It just puts you in the right frame of mind to treat home and work as separate places, even if the trip to work is 10 steps down the hallway. As to dressing for work, I’d say you’d look pretty silly wearing a suit, but dressing in a manner that would be presentable (even if casual) in front of a client or co-worker will put you in the right frame of mind to do better work. Check out what this recent Cracked article had to say about it.
  4. Have consistent hours. As much as possible, start and end your workday at the same time. It’s very important to keep work and personal life separate. When I first started working from home, it was very tempting to just work on into the evening every night. Eventually it takes a toll on you and you’ll actually become less productive. There’s nothing wrong with working til 5 or 6 and having dinner and then “going back to the office” from 8 to 10 some nights. Just don’t try to combine the two, like working in front of the TV in evenings. When you are working, you are working. When you are relaxing, relax. You can’t cheat the system.
  5. Get rid of distractions. One of the big pluses in working from home is many office distractions are eliminated. There’s a lot of time wasted in offices with people socializing beyond a reasonable amount; with excessive meetings; and from just spacing out because of the lack of airflow or some other comfort complaint. The advantage of working at home is that you have complete control over the environment. Don’t squander that opportunity. I personally like listening to music or possibly some talk radio while working, so long as it doesn’t break my train of thought. Is a TV a great thing to have in your office? Probably not. Tempted to try to do laundry and kill two birds with one stone? Not a good idea. Being a stone’s throw from “home” makes it really tempting to try to multi-task household duties. The stop-start of juggling work and home will eat away at your time in small chunks, but more importantly will interrupt your train of thought while trying work through whatever task is at hand.
  6. Get out of the “office”. I mentioned that traditional offices have a lot of time wasted with excessive socializing. But we are social creatures and do need that on a regular basis. I’ve found it really a great break in the day to schedule a coffee with a friend or a Skype session with a colleague. You will go crazy if you are cooped up all day, every day alone. I found that I needed to schedule a coffee, lunch or some other break on a regular basis to keep me from sitting in front of the computer for extended, endless sessions. Go for a bike ride at lunch or play a sport (I play ball hockey) to break up the day. You’ll find after the break, you’re excited to get back into work. 
  7. Don’t be a slave to technology. This one extends to any work environment. I’m astounded by how many people jump every time their phone rings, when they get a text, when they receive an email, an instant message comes in and on-and-on. Instant communication is a blessing and a curse. If you allow yourself 5 or 6 different mediums to be distracted, you’ll take hours to accomplish what you could have in single hour. Computers can multi-task; human brains really can’t most of the time. If you need to be available, pick ONE means of access and tell those who need to get you what that is. Turn everything else off. Resist the temptation to hawk over your email and instead check it at timely intervals through the day – most of it doesn’t require your immediate attention.

I’d love to hear comments and feedback from others in their experience working from home. It’s great if your employer gives you that freedom to do so. Make the most of the opportunity and prove to them that you’re capable of making the most of it.

Handling Holidays and Business Hours

It seems I’m always apologizing for not writing blog posts more often. I looked back and see that the last entry was back in July. Things have been tremendously busy to say the least.

I ran into a quick requirement the other day for NDstorefront’s new admin application. An important metric to track is the time between order placement and fulfillment. Pretty straightforward requirement, right? Of course upon further inspection, it became clear that in order to have meaningful data on these times between order placement and shipping of the order, we’d need to take into account business hours. For example, if an order is placed on a Saturday night and fulfilled by the distributor on the following Monday, it’s effectively same-day fulfillment, as Monday is the first business day following the order date.

To that end, I located a pretty useful gem called business_time that handles this quite nicely. It’s an extension to ActiveSupport that adds some nice extensions to Time and Date to say things like:

4.business_days.from_now

You can configure the business hours as well to properly manage times outside of operating hours like so:

BusinessTime::Config.beginning_of_workday = "8:30 am"
BusinessTime::Config.end_of_workday = "5:00 pm"

I won’t go into the details of implementation as the documentation is quite good. This of course is only half a solution as it really only accounts for weekdays versus weekends as workdays. There is holiday support in the gem, but you must configure the list of holidays. I really didn’t want to be in the business of configuring and maintaining a set of holidays for each year. As well, there are all sorts of special cases as to when statutory holidays are observed as was the case in our last Christmas season. December 25th fell on a Sunday in 2011 and here in Ontario, that effectively meant Monday and Tuesday were stat holidays (with the observation of Boxing Day being shifted one day because Christmas was shifted as well).

Seems like a possible nightmare. Enter the holidays gem.

This is really well written gem by a fellow Canadian Alex Dunae out of Vancouver (Island). He’s tackled the non-trivial task of determining holidays for particular locales, including handling tricky cases like the one mentioned above, Easter (which is really tricky because it can fall in different months) and whether you want the actual holiday dates or the observed dates.

For my purpose, I needed to fork the gem and add some functionality to handle some dates for Ontario in a different manner. In practice, New Year’s Day is observed on a Monday when falling on a weekend as it is granted as a statutory holiday. The gem also didn’t quite have the support for the case where Boxing Day falls on a Monday , but needs to be shifted to Tuesday to make way for Christmas Day. Fortunately, modifying it was a breeze. Alex has used YAML files to describe the rules that in turn build the code required via Rake task.

With a modified version of the gem in hand, I was now able to feed the holidays into business_time. I worked on the assumption that we would be deploying a new app within 2 years and only needed to project that far forward with holidays:

Holidays.between(Date.civil(2011, 1, 1), 2.years.from_now, :ca_on, :observed).map{|holiday| BusinessTime::Config.holidays << holiday[:date]}

And that was it. I was able to look back on some recent data we had collected on shipments by our distributor and get an accurate reflection just how long it was actually taking to fulfill orders.

Customizing ActiveAdmin

Has it really been 3 months since I last wrote a blog post? Embarrassingly: yes. Things have been pretty busy and there’s been lots learned over that time.

I thought I would write a quick post about customizing the ActiveAdmin gem. I first saw ActiveAdmin at RailsConf and thought that it was a pretty cool idea to simplify the tedious task of creating CRUD interfaces for administrative tasks. It’s something you have to do in virtually every project, but is a pretty mundane exercise of repeating virtually the same code for each model you need to manage.

I’m not going to go into detail on setting up the gem for initial use because I think they’ve done an excellent job of it, but I will share some code samples that go above and beyond what appears in the documentation. One of the pitfalls of tools like these is that often the easy stuff is easy, but anything that requires customization is not. Happily, I’ve found this to be untrue with ActiveAdmin.

Adding a Custom Action

ActiveAdmin is DSL-driven and they’ve anticipated that users will want to add to the controllers that are automatically generated under the Admin namespace. In my example, I am using ActiveAdmin to list all of my application users. I wanted to add the ability for the administrator to be able to impersonate or sign in as a particular user.

My basic registration of the User model in admin/users.rb looks like this:

ActiveAdmin.register User do
  filter :username
  filter :email

  index do
    column "Username", :sortable => :username do |user|
      link_to user.username, schedules_path(user)
    end
    column :email
    column :user_type
    column :current_sign_in_at
  end
end

To add the impersonate action, there is a single DSL block that needs to be added:

  member_action :impersonate do
    sign_in(:user, User.find_by_username(params[:id]))
    redirect_to root_path
  end

Adding the member_action call to the registration definition will add both the appropriate controller action and route. Adding the new link to support the impersonate action is as simple as referencing the new named route:

  index do
    column "Username", :sortable => :username do |user|
      link_to user.username, schedules_path(user)
    end
    column :email
    column :user_type
    column :current_sign_in_at
    column "Action" do |user|
      link_to 'Impersonate', impersonate_admin_user_path(user)
    end
  end

Of course, the corresponding collection_action call is available as well.

Removing the New Button

Out of the box, one of the default actions is to provide a ‘New :model’ button. In my example, managing Devise users manually was not necessary and I wanted to remove this button from the layout. It’s easily handled by adding the actions keyword to the registration block.

I specifically only wanted to show an index and added this to the block:

  actions :index

Huh. Really? That simple.

Default Sort Order for Resource

If you’d like to set a default sort order for your resource index, it’s quite simple as well. On registration, add an options hash:

ActiveAdmin.register User, {:sort_order => :username} do
...

All in all, my first experience in using ActiveAdmin in a new project has been pretty worthwhile. As I tackle more sophisticated customizations, I’ll publish a few more posts about it. As well, there is a Google Group for addressing any technical questions about the gem.

Cartographer Plugin for Rails 3/Google Maps 3 support

Maps are integral part of any application with spatial data. In the past, I’ve utilized Google Maps interface with the YM4R plugin. It was always a little cumbersome in spots but did the trick. There was also the restriction of having to register a key for use in each API call.

But what if you wanted to take advantage of great version 3 features like Street View or Driving Directions? You’d be a little wanting as the YM4R plugin only supported V2 of the API.

Enter the cartographer plugin (https://github.com/joshuamiller/cartographer). This plugin provides both v2 and v3 API support, as well as clean Rails 3 integration. I feel the code is a little cleaner too. Here’s a brief tutorial of how to add it to your application.

Installation

Either install the plugin for via:

rails plugin install git://github.com/joshuamiller/cartographer.git

or

git clone git://github.com/joshuamiller/cartographer.git vendor/plugins/cartographer

Implementation

Next, you will need to add some basic code to your controller to create the map object. I prefer to create a helper to do this as it will be used frequently.

module GoogleMapsHelper  
  def map_init    
    @map=Cartographer::Gmap.new('map')    
    @map.zoom=:bound    
    @map.icons << Cartographer::Gicon.new  
  end
end

I typically add code to the model to be mapped to create the geomarker and info window.

class Site < ActiveRecord::Base  
  def geomarker    
    Cartographer::Gmarker.new(:name=> 'site', :marker_type => "Building", :position => ll)  
  end    

  def ll    
    Array.[]( location.y, location.x )  
  end  
end

From within the controller, call the initialization method and add a marker.

class HousesController < ApplicationController  
  include GoogleMapsHelper
  def index        
    if @site      
      map_init      
      @map.markers << @site.geomarker    
    end          
  # and more code...  
  end
end

Finally to your view, add the necessary code to render the map to a div with the specified id.

<div id='map'>  
  <%= raw Cartographer::Header.new.to_s %>    
  <%= raw @map.to_html %>  
</div>

And that’s it! Pretty simple and very clean in my estimation. I’m now not dreading the upgrade of my mappable applications to Google Maps v3.

exception_logger gem 0.1.8 supports jQuery

There’s an older but popular plugin called exception_logger that I’ve encountered in a few different Rails 2.x project. I found it a useful little tool for tracking uncaught exceptions in your production application, including views for managing them and supporting an RSS feed. The plugin fell into a state of disrepair and was showing signs of age. It would no longer run under Rails 3 due to changes to the way that exceptions are rendered in a production environment. As well, it used older Rails remote calls and prototype.js on it’s management page.

Enter Roland Guem (git user name QuBiT) who undertook the task of converting the plugin to a gem and made it Rails 3 compatible. The only issue left was that it meant you still had to include prototype support in your application. In an effort to try to contribute a little more to Open Source, I undertook my second project and converted the calls to unobstrusive jQuery. Needless to say, the code looks a lot cleaner and is easier to maintain going forward. With the release of the gem today (0.1.8), I’ve been able to upgrade a couple of production applications. I’m looking forward to tackling a little more in the Open Source domain as github really makes it a straight-forward process.

Follow

Get every new post delivered to your Inbox.