Where we’re going, we don’t need “roads!”

roads

Buses

Second day at new job, first day taking the bus there and back.  So, how was it?  I felt a little like Doc Brown in the morning – let me explain.

Ottawa has quite a lot of dedicated bus lanes along the major arterial routes – one of which is the major highway which goes the width of the city.  This morning I got on the bus outside our house and headed to the Blair station where I would transfer.  However, as we entered the highway, traffic was INSANE.  It was stopped as far as I could see in both directions….but not for us!  My view was like this:

IMG_20181114_073034.jpg

I really wanted a set of Doc Brown shades as I looked out to the empty bus lane ahead and the suckers sitting in the traffic to our right.  This is what I’ve been sitting in for the past 17 years and by the looks of the traffic, today would have been a 1.5 hour commute day.

After we stopped at the station and I changed buses, it was clear what caused all this.  There was a 3 car crash on the highway taking out one of the 2 lanes.  It’s all this variability that makes the commute in a car so painful….and what I did not miss today.  My total door to door time today was about 50 minutes and it should be that duration most days.

Coming home was even better.  If I walk around 10 minutes from the office, I can get one of the peak service buses that goes right to my door (literally, the bus stop is on my driveway).  I tried that tonight and what a major win.  The bus service actually starts at the station I get on at so there was 3 of us on the bus at the start.  Getting a seat was not a problem.  Door to door, it look around 30 minutes.  At peak rush hour.  Where has this been all my life??!!

Meat

As if the day wasn’t already starting well with the good bus experience, some of the chaps at lunch introduced me to Meat Press for lunch.  As a meat lover, it was AMAZING.  I had the duck sandwich which was certified “Dave Delicious“.   I knew it was going to be good when you walk into the place and see the fridge of joy right ahead

IMG_20181114_120636.jpg

Cake

Finally, capping off a day of win, we had cake again!  Our support wiz had her birthday so it was another excuse for cake.  I’m hoping to keep the 100% cake percentage up tomorrow with more cake!

if-the-peasants

Transit for Dummies

Double-Decker-Wrapper-Small

Next to the creme egg, my all time favourite choc bar has to be the Double Decker.  As the old adverts used to say, “It’s big up top”.  That’s how I felt today riding a double decker bus for the first time in Ottawa as I prep to move from a car commute to a bus (and hopefully train) commute this week.

For the past 16 years, I’ve been doing the ‘rat race’ commute in my car from the suburb of Orleans to the end of the earth that is Kanata.  With there being only one major highway across the city, it’s a drag – mostly because there is an accident every night without fail that snarls traffic.  Now that I’ve changed jobs and it happens that the office is a) much closer to home and b) has almost no parking, I’m going to give taking public transit a go.  I expect this to be interesting.


 

train

Until next year, transit in Ottawa means the bus.  However, hopefully in Q1-2019, light rail will be opening which should drastically cut down the commute time and make things more reliable.  I say should because the project has been delayed twice now and I suspect there will be some teething problems in the beginning.   Still, when it does eventually open there will be trains every 5 minutes and end to end, the line will be 25 mins.  Luckily, my new office is very close to one of the new rail stations so I’ll be able to get to work in around 35 minutes Vs the highly variable 50m – 1.5 hours now (2 hours in snow storms).

So, why this blog?  Well, I’ve taken public transit a few times and some of the experiences have been “interesting”.  I hope to document some of these more interesting experiences here.  Unless I last a week and end up switching back to my car!

Fire!

300px-Amazon_Fire_TVI’d been using a Zotac Zbox for the past few years as an XBMC client pretty successfully. It has a great form-factor and the built-in remote gives it a reasonably high “spousal acceptance factor”. Had a few issues along the way but using the OpenElec distribution of XBMC worked well. Until last weekend when I awoke to the sound of…nothing. No fans, no hum of lights, nothing. It’s dead, Jim!

For my second screen, I have a Raspberry Pi also running OpenElec so I “promoted” it to the main device on our every day TV. It was “ok” but the GUI is incredibly slow and scraping for new content..well, it’s an overnight job on a big library. So I was about to go pick up a new Zbox for around $300 but figured I’d research what is new in XBMC devices. After many (many!) hours, I came to the conclusion that the Amazon FireTV may be “the one”. Trouble is, they are not available in Canada. I’d found several listings on ebay but it was looking like a $50 premium to get one. Short story – had it shipped to the US and had a friend forward it up. Gadget: ACQUIRED!

Onto the setup. Connection was silly easy – ethernet (it does have wifi) + HDMI and done. The remote is bluetooth so no need to even have line of sight. XBMC was insanely easy to install since Amazon have made it super easy to “sideload” apps (ie. get them on there without having to go though the app store). There’s no need to hack or root the box to install apps like XBMC – it’s just a menu option! Score. Here’s what I did to get XBMC going:

  • Download the XBMC apk file
  • Download adbfire. You don’t NEED this but it makes life stupid simple
  • Enable “developer mode” on the FireTV (under settings->system)
  • Use adbFire to load the XBMC app

    That’s it! XBMC then appears under settings->system->apps. You launch it as usual and “it just works”. I added my library and plugins and was up and running in no time. The library scrape speed is an order of magnitude faster than the Rapsberry Pi (and even a bit faster than the Zotac). I think that’s down to the quad-core proc and flash storage.

    One other tweak is making XBMC launch from the main menu rather than having to go to settings->apps each time. It’s reasonably easy to do this using a tool called Llama. There’s some good instructions here

    The other nice thing about the Amazon FireTV is it’s integration with Amazon video and specifically Prime. Prime is pretty cool with the amount of content available (especially on the TV show side). Being in Canada, we don’t get video access using prime but that’s easily “getaroundable” using a DNS service (I use SmartDNSProxy but there are zillions around). Once I had this setup, a US Amazon account (.com, not .ca) and a free preview of Prime (it’s $99/year after the first month and has other benefits), I had Prime on my AmazonTV. I did have an issue getting video playing which turned out to be my HDMI cable (Prime relies on HDCP which means you need a good HDMI connection) but after that…the world is good!

    If you’re looking for a good XBMC box and can get hold of a FireTV, it’s a fantastic solution. And it’s only $84! It’s like they are paying me for a gadget! 🙂

  • This beanstalk is elastic!

    jack-and-the-beanstalk We run a fair bit of stuff on Amazon Web Services (AWS) at work and have used Elastic Beanstalk quite a bit for several deployments. It’s amazing how far it’s come as a container/deployment service over the years and I figured I’d drop a few notes about some handy stuff I’ve discovered along the way in customizing it.

    Elastic Beanstalk (EB) is basically a ‘wrapper’ service around several AWS stalwarts – Auto scaling and load balancing being the big 2. It also provides a pretty handy bootstraping and software deployment mechanism for several containers (php, ruby, java, etc.). We use Java/Tomcat but the same basic functionality applies to all of the containers. The basic software deployment and update mechanism is pretty cool by itself and saves a lot of messing around with custom images and deployment tools like chef, puppet, etc. It also is reasonably easy to hook into auto-deployment schemes via a CI system if desired. The real goodness though (IMHO) is in the extensions.

    EB extensions are basically pre-deployment ‘bits’ that can be bundled with your application and used to customize the environment. They are documented in an “ok” way but a lot of the real goodness is hard to find. Sure, there’s the basics of run this shell script before deploying your app but there’s some pretty powerful hooks into customizing the underlying environment that is used by the beanstalk too.

    I recently worked on a project that needed quite a few extensions to make it layout how we needed things. I’ve put the extensions in a github repo here https://github.com/dnorth98/beanstalk-extensions but figured I’d just quickly describe some of the neat features here that I’d found along the way:

    Customizing Resources

    The first neat thing is being able to customize the resources that are auto-created by the beanstalk itself. Specifically, in the 01_aws_resouces extension, we are customizing the security group, the load balancer and the auto-scaling group. We’re also auto-creating a new SQS queue that we’ll use in a later extension. Being able to ‘tweak’ the underlying resources is SUPER handy and allows you to create a real all-encompassing application bundle.

    Grabbing files from private S3 buckets

    The second handy extension installs a small python script called S3get. This just simply gets a file from an S3 bucket….however, because it can use instance IAM role credentials, you don’t need to worry about access keys. Make sure you set the instances in the beanstalk to run using a role and this works like a charm.

    Updating DNS

    Another handy extension will auto-update a Route53 DNS zone with the name and IP of the instance when it’s bootstrapped. This can be handy if you need direct access to the instances behind the ELB or if you just want friendly names. Again, if you use roles, you can use instance credentials.

    Elastic IPs

    In our case, we needed each instance to have an Elastic iP from a known ‘pool’ (don’t ask!). This extension uses python and the AWESOME boto library to grab EIPs from a pool (provision more if needed) and assign it to the instance. However, because multiple instances can be coming up at the same time and because EIPs can be “stolen” by 2 instances attempting to assign the same one at the same time, we use an SQS queue with a single message as a “lock”. It’s not perfect but it’s proven to work pretty well in production with auto-scaling up and down. There is undoubtably a better way to do this but it’s not bad for now.

    Custom metrics

    Yet another really cool thing is being able to publish custom metrics to cloudwatch and then report on them later. In this case, we just needed a single metric showing how many processes were running on each instance of a specific type. This again uses python and boto and just shows how a custom metric can be posted to cloudwatch by just using a simple script in a cron task.

    There’s a few more bits and pieces in the various scripts but needless to say, I’m a huge fan of Elastic Beanstalk and just how customizable it is. In a later post, I’ll discuss how we’ve integrated being able to do updates direct from our CI system (Jenkins in this case) using some small tools we developed and a great Jenkins plugin.

    Innovation Day: The Return (3D)

    Ball machineWe had our quarterly “innovation day” at the office yesterday. If you read my last post on the “Coffee Shamer”, you’ll know I’m full of good ideas (or “full of something!”) but initially I wasn’t planning on doing anything this go around. Until I was driving home in the space car and an idea just popped into my head that seemed viable and may just work. I can’t reveal the idea here because it could end up being something product related but it was a highly rewarding experience working on it during the day with a co-op we have with us for the summer. We worked pretty well as a small team divving up the work and using our relevant strengths to turn out something that was what I’d describe as a strong prototype that clearly conveyed the idea. We actually ended up winning a prize for our work which was neat (Pebble watch – more on that later!!).

    What was cool though was not just winning (which is good as I LOVE to win!) but the number of ideas that came out from the people participating that were genuinely cool stuff. I suspected going into it that there would be fairly stiff competition and I was right. Frankly, I wish we’d been able to do this ages ago and it’s something every workplace should do IMHO. Good for morale and often there are some ideas that just seem so obvious when shown and fall into the “why don’t we already do that?!” category.

    This time around was all software but next time I need something that I can interface with for this Pebble watch!

    The Coffee Shamer

    yuno_refillToday at work we had “Innovation day” which is actually kinda cool. Basically, for the day, we can work on any project we like – anything at all. Generally, most people work on tools or enhancements to existing software (which generally works out very cool) but I wanted to do something totally different.

    Enter – the coffee shamer. See, we have a problem around the office that there’s always someone who takes the last cup of coffee and doesn’t brew another pot. I suspect there are several offenders but catching them in the act is a challenge. I’d had an idea a few years ago of creating some kind of alarm to let everyone know when someone had taken the last cup but not put on another brew…I just didn’t know how to implement it. Until this year I found this blog post. This chap had used something called an Arduino to measure the weight of the pot and sound a buzzer. Ah ha! Engaging research mode, I read everything I could find out about Ardunios and knew I had to have one. So I ordered a kit from Canada Robotix which is a great starter kit for getting going with an Arduino plus a buzzer and a force resistor. I floated the idea around the office to a few people and we figured we’d go for it and make it.

    So, I did a few basic experiments with the Arduino and did some more reading and gradually came up with the idea of what we’d do…we’d detect the level of coffee and sound a buzzer and blink some LEDs as in the sample blog post. Then, I was watching a YouTube tutorial on serial communications by Jeremy Blum and he used a ‘receiver’ written in a language called Processing. Showing how reasonably easy serial communication was, this led me to the next level – we’d take a picture of the guilty party and post it to a web page. Genius. Here’s what the basic Arduino side looked like with the force sensor in place under the jug

    coffee_shamer

    So, onto Innovation day and I briefed the team on the basic idea and we set to work. One quick side note. This would make an excellent Agile ‘lab’ project as we really used all of the agile principals – small teams, task breakdowns, estimation, rapid prototypes, strong communication, etc. After having a power bump, we also quickly learned “save often” but that’s another lesson 🙂 We split the work as follows:

    Kgirl and I would work on the circuit and calibrating the Arduino.
    Kguy would work on the receiver with processing and taking the images
    Mguy would work on generating the “guilty party” web material

    Things worked out pretty well. On the Arduino side, the main problems we had was that the force resistor I’d purchased was really too sensitive. It was meant to measure very small force measures (finger tips) rather than the weight of a pot. For example, an empty pot was showing a reading of 950 out of 1024 so almost at the top of the scale. This meant that even half filling the pot gave us a very small change in value. We also found that taking a single reading would bounce around a bit so we introduced a ‘smoothing’ read where we took 20 samples and averaged them 1ms apart. This made a huge difference in the stability of our readings. We also decided to only read every 5 seconds which helped too with the variability. Finally, on the Arduino side, we had to account for the fact that when a user was filling their cup, they were actually applying force to the resistor and hence affecting the reading. We found a 10s delay took care of this when in the FULL state.

    The processing piece came together reasonably quickly but Mguy had some issues with the web side but it all came together in the end. Our demo had a small issue when the Mac we were using to be the serial receiver crashed but after that, it actually worked! One of the most interesting projects I’ve worked on and I learned a TON of new stuff. OK, maybe not all 100% related to work but definitely some interesting new skills.

    Here’s the Arduino and Processing code we used. The Arduino code needs some cleanup but the basics are all there.

    Arduino

    int fsrAnalogPin = 0; // FSR is connected to analog 0

    int greenLEDPin = 3;
    int yellowLEDPin = 4;
    int redLEDPin = 5;

    // how long to sleep for before taking a second reading
    // This is used when we detect EMPTY. In a real setting
    // this would need to be long enough to allow a user to
    // refill the pot
    #define TIMETOLIVE 10000

    // Serial messages
    #define TAKEPICMSG 1
    #define GUILTYMSG 2
    #define GOODGUYMSG 3

    // Threshold values
    #define NOPOT 942
    #define LOWPOT 950

    // States
    #define INIT 0
    #define EMPTY 1
    #define FULL 2

    int fsrReading;
    int fsrReading2;

    int currentState = INIT;
    int sentGuiltyMsg = 0;
    int sentGoodGuyMsg = 0;

    void setup(void) {
    Serial.begin(9600); // We'll send debugging information via the Serial monitor
    pinMode(greenLEDPin, OUTPUT);
    pinMode(yellowLEDPin, OUTPUT);
    pinMode(redLEDPin, OUTPUT);

    }

    void loop(void) {
    fsrReading = readForceSensor(fsrAnalogPin);

    if (currentState == INIT)
    {
    // This was helpful in troubleshooting when hooked
    // up to the receiver
    blinkLEDS();
    }

    if (fsrReading <= LOWPOT)
    {
    setLowLED();

    if (currentState == INIT)
    {
    currentState = EMPTY;
    } else if (currentState == FULL)
    {
    // reset the goodguy messsage flag
    // which was set in the FULL state
    sentGoodGuyMsg = 0;

    // We may be in an alarm state here
    sendMessage(TAKEPICMSG);

    delay(TIMETOLIVE);
    fsrReading2 = readForceSensor(fsrAnalogPin);

    if (fsrReading2 = LOWPOT)
    {
    setFullLED();

    sentGuiltyMsg = 0;

    if (currentState == EMPTY && !sentGoodGuyMsg)
    {
    sendMessage(GOODGUYMSG);
    sentGoodGuyMsg = 1;
    }
    currentState = FULL;
    }
    }

    delay(5000);
    }

    // This takes 20 samples 1ms apart and averages them
    // smoothes out our readings and makes a big difference
    int readForceSensor(int sensorPin)
    {
    int numReadings = 20;
    int readings[numReadings]; // the readings from the analog input
    int index = 0; // the index of the current reading
    int total = 0; // the running total
    int average = 0; // the average

    // init the array
    for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;

    for (int thisReading = 0; thisReading = numReadings)
    // ...wrap around to the beginning:
    index = 0;

    // calculate the average:
    average = total / numReadings;
    delay(1); // delay in between reads for stability
    }
    return average;
    }

    void setFullLED()
    {
    digitalWrite(greenLEDPin,HIGH);
    digitalWrite(yellowLEDPin,LOW);
    digitalWrite(redLEDPin,LOW);
    }

    void setHalfLED()
    {
    digitalWrite(greenLEDPin,LOW);
    digitalWrite(yellowLEDPin,HIGH);
    digitalWrite(redLEDPin,LOW);
    }

    void setLowLED()
    {
    digitalWrite(greenLEDPin,LOW);
    digitalWrite(yellowLEDPin,LOW);
    digitalWrite(redLEDPin,HIGH);
    }

    // Write the code over the serial interface
    void sendMessage(int msgID)
    {
    Serial.write(msgID);
    }

    //Super cool light show on initialization
    void blinkLEDS() {
    digitalWrite(redLEDPin, HIGH);
    delay(100);
    digitalWrite(redLEDPin, LOW);
    delay(100);
    digitalWrite(yellowLEDPin, HIGH);
    delay(100);
    digitalWrite(yellowLEDPin, LOW);
    delay(100);
    digitalWrite(greenLEDPin, HIGH);
    delay(100);
    digitalWrite(greenLEDPin, LOW);
    delay(100);
    digitalWrite(redLEDPin, HIGH);
    delay(100);
    digitalWrite(redLEDPin, LOW);
    delay(100);
    digitalWrite(yellowLEDPin, HIGH);
    delay(100);
    digitalWrite(yellowLEDPin, LOW);
    delay(100);
    digitalWrite(greenLEDPin, HIGH);
    delay(100);
    digitalWrite(greenLEDPin, LOW);
    delay(2000);
    }

    And here’s the Processing code. NOTE that the ID of the serial port is hard-coded and must be set accordingly.


    import processing.video.*;
    import processing.serial.*;

    import java.io.File;

    final Integer SERIAL_PORT_ID = 5; // TODO Specify correct port-id
    final String FINAL_IMAGES_DIR_NAME = "Images";

    Serial port;
    Capture cam;
    Integer imageNum = 0;
    String lastImageName = null;
    Integer lastCmd = 0;
    String sketchDirPath = null;

    void setup() {
    sketchDirPath = sketchPath("");

    println("Sketch directory: " + sketchDirPath);

    size(640, 480);
    startCamera();
    initializeSerialPort();
    }

    void startCamera() {
    String[] cameras = Capture.list();

    if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
    } else {
    // The camera can be initialized directly using an
    // element from the array returned by list():
    cam = new Capture(this, cameras[0]);
    cam.start();

    println("Using camera: " + cameras[0]);
    }
    }

    void initializeSerialPort() {
    println("Available serial ports: ");
    println(Serial.list());

    port = new Serial(this, Serial.list()[SERIAL_PORT_ID], 9600);
    }

    void draw() {
    processLastCmd();
    }

    void processLastCmd() {
    switch(lastCmd) {
    case 1: // Take an image, might be guilty or not guilty
    takeImage();
    break;
    case 2: // Last image was definitely of a guilty individual!
    markLastImageAsGuilty();
    break;
    case 3: // Take a new image and this guy is not guilty
    takeImageOfNonGuilty();
    break;
    default:
    // println("Unrecognized command read from serial-port: " + lastCmd);
    }

    lastCmd = 0;
    }

    // notification that there is something to read on the serial port
    void serialEvent(Serial port) {
    lastCmd = port.read();
    }

    void takeImage() {
    while(!cam.available()) {
    println("Waiting for camera to become available...");

    try {
    Thread.sleep(300);
    }
    catch(Exception e) {
    println(e);
    }
    }

    lastImageName = "Image-" + (++imageNum) + ".png";

    cam.read(); // read frame into memory
    image(cam, 0, 0); // have to display image so save() can capture and save it
    save(lastImageName); // save to temporary storage on disk

    println("Saved un-judged imaged to disk: " + lastImageName);
    }

    void markLastImageAsGuilty() {
    moveLastImageToFinalLocation();

    println("Marked image " + lastImageName + " as guilty and moved!");
    }

    void takeImageOfNonGuilty() {
    takeImage();
    moveLastImageToFinalLocation();

    println("Non-guilty image moved: " + lastImageName + ".");
    }

    void moveLastImageToFinalLocation() {
    File oldImageFile = new File(sketchDirPath + "/" + lastImageName);
    File newImageFile = new File(sketchDirPath + "/" + FINAL_IMAGES_DIR_NAME + "/" + oldImageFile.getName());

    try {
    if(! oldImageFile.renameTo(newImageFile)) {
    println("Failed to move " + oldImageFile + " to " + newImageFile + "!!!!!");
    }
    }
    catch(Exception e) {
    println("Failed to move " + oldImageFile + " to " + newImageFile + "!!!!!");
    }
    }

    There’s just one more thing…

    Tags

    , , , ,

    frontpagecolumbo1I’ve been using my XBMC setup for some time now and quite frankly, it rocks. As noted in previous posts, I’m using the OpenElec distribution on a Zotac ZBOX and it’s almost perfect. Almost. The problem I’ve had is that powering off our receiver or switching inputs causes the sound to be lost on power up. This has meant frequently rebooting the ZBOX – not the end of the world because it boots very fast, but annoying nonetheless. After much research, it’s a software problem with AMDs Linux driver and there’s very little chance of it being fixed so I’d resigned myself to just having to reboot all the time.

    Until now. Thanks to a bizarre but outstanding product called the “HDMI Detective“. This product does one thing – emulate to your device that the display (or receiver) is always powered on and sending a device ID. It’s insane there is a market for this but it works very well and 100% solved my problem. No sound loss anymore and no impact on quality – video or audio. The only downside? The cost – it’s around $120! But it’s better than the alternative which was to buy another ZBOX.

    The trail of paper

    I like to give props to cool services and products I’ve found helpful. Now I’m doing some DevOps work, a chap introduced me to a handy tool called PaperTrail (papertrailapp.com). It’s such a basic idea but so well executed that it’s gold if you’re looking after a few systems. In short, it’s a log aggregation service. I’m currently using it for a couple of systems but as we do a lot of work with a cloud service in Amazon, I’m planning to roll it out to the entire infrastructure. As we use Elastic Beanstalk, it’s really not super easy to get to the logs so we’d been using some custom tools to drop them to S3 and then have a look at them there. It works but it’s “meh”. Now with Papertrail, I should be able to drop all the logs to PT and group them by the many different environments we have. I’ve got some work to do on machine IDs (given that with Beanstalk, machines come and go) but I think it’ll be great.

    Speaking of nifty tools, last week I came across the “extensions” capability for Elastic Beanstalk. There’s another “feature of WIN” (FoW). Using it, I was able to get Java7 installed on our beanstalk instances and get around the fact that the default AMIs only have Java 6 on them. In a previous project, we’d gone down the road of building our own AMI and quite frankly, it was a pain in the read end. This was before extensions existed though. Now, with extensions, I think it’d be pretty rare that one would need to build a custom AMI.

    Finally, the NAB show is on this week in Vegas. For years, the chap I worked for tried to get me to go but I always said nah as I hate to fly. Finally, last year I went and totally loved it. It was long days in the booth and I was on setup and teardown but what a fantastic experience. Gutted I won’t be going this year but that’s the penalty for “JobScrewUpGATE 2013”.

    Papa Sam

    Been a while readers…been a while. I’ve not had much time to do much of anything since I started my new work gig back at the end of January. It’s been quite a ride so far – get up, work (skip lunch, no time), home, eat, fall asleep on couch. Repeat. So far, the new gig has been quite different than I was expecting and has some really good parts, some good parts, some meh parts and some really meh parts. I think today after meeting up with some old work chums for lunch and having a good chat with another, things are becoming a bit clearer as to how I can approach things without becoming the human stress ball every day. And it comes down to “Don’t try and boil the ocean”. That’s actually hard for me to do…I like everything to be “just so” and being rather OCD, things get to me when there’s not order in the universe. I think that’s the hardest thing I’m having to come to terms with. My prior mission was very much project based…give or take some odds and sods, we pretty well knew the overall mission and what we’d be working on – at least for short periods. Now, it’s back to ‘event driven’ where cases come in that need worked on and each day is different. I remember now why I dislike this model and I think it’s back to the “balance in the force” side of me.

    On the plus side, the opportunity to learn new things is immense. This is something I’m really digging and I’m finding that it’s not just purely technical stuff that gets my interest but a lot of the process side of things is interesting too. I’ve also found that being “the noob” has some other benefits in being able to look at existing processes and see potential areas of improvement without having any baggage of “well, that’s the way it’s always been”. The other plus is some of the people I’ve “met” around the world are great and super helpful. One person in particular in Cali is just mega to deal with and actually motivates me a ton every time we talk. Really do get the idea that a company is truly it’s people.

    Really do miss my old work chums a hell of a lot though – the local guys and the folks in India. Amazing the kinds of relationships you can form with people working on a common purpose and towards a common goal. But I guess the only constant is change.

    Lewis better win a race this year!

    Translucent Transcoding

    h264I’m slowly working my way through ripping (copying for non-nerds) my DVD collection to my Network Attached Storage (NAS) and it is sloooww work. I’m using an excellent tool called DVDFab which, while it’s name is rather bent, works very well. I’ve not found anything it can’t handle yet and it has that “set it and forget it” quality I like. I think I’m around 1/3 of the way through my collection (it’s rather a lot) but I’ve been happy with the results so far. I’m using h.264 (mpeg4) and AAC 5.1 audio for everything and most films are coming out around 1GB or so (I’m using the MKV container). I decided to go with h.264 because my Raspberry Pi (see previous postings) has native hardware decoding for that codec and so far, the performance has been just fine with everything ripped.

    I’m also mega impressed with the library and scraping ability of XBMC. I’m a bit OCD when it comes to organization of…well, anything, so it’s important (to me!) that everything is classified correctly. XBMC does a great job of correctly classifying everything as long as you name the files correctly. I did have to spent around an hour organizing all the seasons of my latest obsession show “Man Vs Wild” but that’s because the bonehead downloads were not correctly labeled. A quick shout out to 2 indespensible tools – bulk renamer and the renamer, both of which rock and have saved me HOURS.

    Been spending quite a bit of time researching OTA (over the air) TV reception after a tip from a chap at work. There’s really not many channels we can get here but I do like the idea of picking up HD channels for free and with a bit more work, I may even be able to convince Mrs. Guppy we can get rid of our Satellite TV. It’s looking like a honking antenna and an HD Homerun device is the way I’m going to go but I think I’ll wait until the snow melts to climb the roof and look at mounting an antenna. The Homerun device in particular is brilliant – feed it a signal, it outputs streams just over a regular IP network (and of course because XBMC is brilliant, there’s an add-on).

    Have to say..what a world this whole XBMC/Zotac experiment has opened up!