Saturday, June 10, 2017

Cutting the Cable in Austin TX with a Tivo and Digital Antenna

After spending around $12,240 on cable TV for the past 17 years, I finally decided to join the 2nd millennium and say goodbye to my cable company and hello to digital broadcast TV.

Here's my step by step guide to cutting the cord on cable with a Tivo in Austin TX. 

1.  Find out if you can receive any digital TV signals.  Visit the FCC at www.fcc.gov/media/engineering/dtvmaps and see how many stations you can receive.  Here's what Austin looks like.




2. Purchase a few digital antennas and see which one works the best and take the rest back.  The price has nothing to do with quality.  Antennas may be actively powered or passive.  The powered may be better for far away stations, but they may not be good for close stations.  Consumer Reports tried to recommend specific brands, but after testing, they could not recommend any since the antennas would do well in one area, but not another.  At the recommendation of the Best Buy guy I tried this one which costs $33.  See more notes below on antennas.
 3. Mount the antenna on the wall near your TV, or better yet on an interior window.

4 Hook up your antenna to the back of your Tivo.

5. Convert the Tivo from cable to over the air (OTA).
The tricky part with the Tivo is that you have to go through the complete initial setup again. On the main menu select "Settings and Messages"/"Help"/"Restart or Reset"/"Repeat Guided Setup" to repeat the setup.  Select "Antenna only" on all the settings.
Tivo will then scan your antenna and show you all the stations it found.

 6.   Remove poor quality stations.
Tivo found 20 OTA stations, but not all came in well and many were in Spanish.
After subtracting those , I now have these stations in Austin TX:
18-1 PBS
18-2 create
18-3 PBS
18-4 PBS
21-1 ABC
24-3 Justice
36-1 NBC
36-2 COZI
36-3 ION
42-1 CBS
54-1 CW
54-2 GRIT
54-3 Laff

 7. Make sure everything is working correctly and then call the cable company to cut the cord.

My bill went from $150 to $ $90 with taxes.
That is still way too high for just internet at 100Mb, but it's a start.
How much do you pay for internet and phone?

Epilogue:
After trying the RCA antenna for a while I was disappointed.  I took that back to Best Buy, and  I got a better cheaper one ($20) from Amazon: the Mohu Leaf Metro TV Antenna, Indoor, Portable, 25 Mile Range. It works much better.
Then for my other TV I tried the Intoam Leaf, but it could only pick up 10 stations clearly.


Friday, June 09, 2017

Agile Austin Lean / Kanban SIG Group Lunch Meeting - Theory of Constraints

Jim Brission from Agilecoaching.org gave a great noon talk to the Agile Austin Lean / Kanban SIG group.




Jim started by showing I Love Lucy's famous chocolate scene


My Notes::
Recommended book:  The Goal


Intro:  In hiking you can only go as fast as your slowest person.

Process of Ongoing Improvement (POOGI)

1. Identify system's constraint
   (Optimizing other steps is a waste)
2. Maximally exploit the constraint
3. Subordinate every else
4. Elevate Constraint fix it, make it faster
5. Iterate

Where do we see constraints in Software Development?
Any handoff - QA, Technical Writer, Release team
That guy
  - knows the device driver, the kernel
  - is a super debugger

Drum-Buffer-Rope

Drum sets the beat
Buffer is inventory
Rope pulls work into stockpile

Double Loop Learning
  Action Strategies / Results & Consequences
  Governing Variable (values, assumptions, frameworks, beliefs)

Critical Chain Project Management - CCPM
Start with
  Network of tasks and dependencies
  Estimates
Order
  No task starts before dependencies met
  No multitasking of individuals
  Minimize Project Duration

Buffer: Time, Money, Scope
Put buffer at the end of a project, not in individual tasks.

Fever chart

Product owner can save the day by paring down the scope

Cost Accounting
  Created after industrial revolution
  Measures efficiency of men adn machines - unit production per dollar of man or machine
  Cost Accounting not good for software development
 
ABC - Activity Based Costing
Invalid Assumptions
  Local efficiencies lead to global efficiency
  (.e.g, making one machine faster, doesn't necessarily help the throughput - unless its the most constrained operation)
Bad things that are viewed as good things in Cost Accounting
  Build up inventory (keep machines/people busy)
  Fill everyone's plate with work
    or minimize personnel to ensure all are fully engaged
  Show high productivity rather than high value


Tuesday, June 06, 2017

Agile Austin "Attacking Things Incrementally"

Walter Bodwell spoke to 55 people at Agile Austin this month.

 
Yassar opened the meeting






 Walter was a great speaker.  He made the audience feel comfortable and people participated well.  We broke into small groups and discussed how to break down some current issues we had at work.

Here's my personal notes:

Simplicity the art of maximizing the amount of work not done is essential.
Small stories are best:  easier to estimate, enables earlier testing, less risk, faster feedback, easier to pivot, easier to tell when done.
Stories can be too small - overhead can be too big.
At least 5-9 stories per iteration.
Ideally .5 to 3 days  per story.

Barriers to small stories: get past all or nothing; some developers don't want to itemize large tasks, overhead can be too great.

 When splitting a story each "slice" should add incremental user value.
Reprioritize and resize after splitting

Who does the splitting?  Product owners and developers
Split stories vertically (Ui and Middle Tier and DB) so user can see value
Don't split horizontally e.g., DB, because user can't see value or be tested

Questions to ask yourself:
How will we test this slice?

Ideas for splitting:
Handle most important users first
CRUD - Start with just Create and Read; wait on Update and Delete
Do the happy path first
Make it work, make it work fast

Why Small Releases?:  Easier to defer to next release; earlier revenue opportunity; earlier feedback; pivot faster;

When doing a code rewrite, put both system out so users can still use old system.  Sometimes a feature is written in such a way that a customer can do something odd and create something very valuable to them which is not documented nor was it intended.


 

Test Driven Development Workshop

I recently led a Test Driven Development workshop using C# at work.  Here's the exercise I created to show how to do TDD.

 Introduction:

Red/Green Refactoring is starting with a failing test, and then making the target software work.

Remember to write the simplest thing that could possibly work

Ping-pong is having a pair of programmers work together.  The first programmer writes the test,  and the second makes the test pass

Workshop Background:
We just bought a zoo and employ jr. high students to write queries against our db for our web site.
The kids work hard, but their construction of URL strings to hit the web service is often bad.
We see final queries like
     https://WeBoughtAZoo.com/api&location=Asia
     https://WeBoughtAZoo.com/api&location=South America?type=reptile&pen=a2#4&time
        
    You need to write a helper URL builder function to make errors less likely, something like,
          
string url = Utilities.BuildUrl(host, name1, value1, name2, value2, ....)

Here's my example project. 
Clone solution and files from https://github.com/fincher42/TestDrivenDevelopmentWorkshop/tree/master

file ZooQuery.cs -- just a main program -- you will not change this file.
using System;

namespace TestDrivenDevelopment
{
    public class ZooQuery    {
       public static void Main(string[] args)
       {
           string host = "https://WeBoughtAZoo.com/api";
           string url;
            url = host + "?location=Africa";

          Console.In.ReadLine();
       }
    }
}

Utilities.cs -- this is where we write a function
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestDrivenDevelopment
{
    public static class Utilities
    {
               //this is where ReSharper will create the method BuildUrl
    }
}

UtilitiesTest.cs -- this is where we put the tests defined in the comments below
using System.Collections.Generic;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web;
using TestDrivenDevelopment;
using System;
using System.Linq;

namespace UnitTestProject1
{
    /*    Workshop tasks, Expected URLs:
     1. Simple name-value pair:
     BuildUrl(host, "location","Africa");
     2. Name-value pair with non-url friendly characters:
        BuildUrl(host, "animal pen","#16"); //(note: # in hex is 23)
     3. Multiple name-value pairs
        BuildUrl(host, "type","mammal","continent","Africa","size","small","food appetite","carnivore","animal pen","#16");
       code error conditions:
     4. Check for bad number of parameters
        BuildUrl(host, "type","mammal","continent");
     5. Check for bad host value, needs to look like a host name
    */
    [TestClass]
    public class UtilitiesTest
    {
     //your tests go here. 
    //Use Snippet to write the initial outline of the test

    }
}

 
Have one person create the test, and pass control to another person to upgrade BuildUrl() so it will pass the test. I have 5 exercises, so with 10 people everyone will get to code.