Oct 182012
 

Back in June I decided to change my keyboard layout with the hopes of increasing my typing speed. I have touch typed for 20 years on a QWERTY keyboard and was getting about 54 words per minute. First I tries Dvorak layout, but had a tough time even learning the keyboard never mind typing with any speed. Then I switched to the Colemak layout which I was able to get some speed on very quickly.

I’m currently typing at 60 words a minute. That’s a 10% improvement, and I’m sure there is still some speed left to be gained, but I’m not sure I’ll ever make it to my original goal of doubling my typing speed. That would be 108 WPM, and at this point I’d be thrilled with 80 WPM.

If I could go back, I’m not sure if I would switch again. More speed was my original goal, and I think I could have increased my speed faster if I had done as much practice with QWERTY as I have done with Colemak. But here I am, I have switched and I don’t think I’ll be going back.

The Colemak layout is noticeably easier to type on. Much less reaching for common letters (I’m looking at you E, R and T). My typing hasn’t suffered too terribly on QWERTY keyboards, but I can no longer touch type, I have to watch the keyboard.

Up next on my experiments with typing, mechanical keyboards. I have noticed in my practicing that there are times when I’m not sure whether I have typed a letter or not because of the mushy keys. I’ll monitor my WPM before and after that switch when I finally fork over the money for a >$100 keyboard.

 Posted by at 5:59 pm
Sep 262012
 

I’ve had a few people ask me over the last few weeks what my long term career goals are.  The first time someone asked me, it caught me a little off guard.  It’s not a question I get asked a lot, and it’s not something I’ve really given any thought to in the last few years.  My answer was that I didn’t have any career goals, that I was happy doing what I was doing.

Do I really not have any career goals?

The more times I was asked about my career goals the more I became embarrassed by my answer.  Why didn’t I have any career goals?  Shouldn’t I have a goal?  Without a goal aren’t I just drifting through life?  Then it finally occurred to me, I do have a career goal.  It just doesn’t involve moving up the corporate ladder.  Or down, or across. 

My goals* are:

  1. Continue writing code
  2. Continue learning and improving
  3. Continue working with current technology

If I stop with #2, then I’ve failed at #3 and should probably stop with #1 for the sake of anyone who might have to maintain my code.

 

*I know these are not great goals as they are not measurable, but that’s as close as I can get to good goals for my career.  If you have suggestions for how I might clarify them please leave a comment.

Aug 282012
 

*Not a technical blog, you’ve been warned.

Over this last weekend we had our neighborhood block party.  This year, my contribution was to plan the live music portion of the event.  For this I was able to get 2 solo acts and a 3 piece band to commit to playing for "all the hot dogs they could eat." 

In the end one of the solo acts and the band couldn’t make it due to family emergencies.  To fill the gap I decided I’d play a few tunes even though I previously decided to leave myself out of the show.  I told myself it was because I hadn’t been practicing for a year of so, but there was more to it.

I enjoy playing music.  I like going down to an open mic with some friends and belting out a couple of tunes, and I always had fun performing in the band I was in a few years back, but I was really dreading playing music for my neighbors.  It wasn’t the crowd, and it wasn’t my neighbors friends, it was my neighbors that I didn’t want to play in front of.

It’s not that my neighbors are judgmental, mean, or anything like that.  Quite the opposite, they are all great people and  I knew the would be supportive even if I bombed.  I couldn’t ask for better neighbors.

So why did I dread playing for them when I was perfectly comfortable going into a bar and playing for a bunch of strangers who always left an awkward silence where the polite applause are supposed to go?

There’s 3 reasons I hate playing for friends and family:

  1. I respect their opinions.  If I didn’t respect their opinions, they wouldn’t really be my friends would they.
  2. I don’t really trust their compliments.  I know that if I bomb they probably won’t tell me, they’ll focus on the positive unless I press them for an honest opinion.  I did that once, it confirmed what I already knew but it really sucked to hear it from someone I respected.
  3. I’m going to see them again and again and again.  The nature of strangers is that you rarely, if ever, see them again.

So there it is, that’s why I hate performing for friends and family.

 Posted by at 2:15 pm
Aug 222012
 

When Microsoft announced they were entering the PC hardware market with their Surface tablet a lot of the media reacted as if it was a shot across the bow for OEMs.  That Microsoft was going to try to take significantly market share and in the process drive some of the current OEMs out of the market.

The biggest threat to OEM’s is not Microsoft entering the hardware market with the Surface.  The biggest threat is the fact that PC obsolescence is obsolete.  You no longer need to upgrade your computer every few years.  Most users already have more processing power, RAM, and disk space than they need.  A computer that was built 3 years ago is still perfectly suited for what most users do today.  Sure, they could probably benefit from an SSD, but they don’t need it the same way you needed to upgrade a 3-year-old PC a decade ago.

The evidence is all around us.  Look at the minimum requirements for the last few versions of Windows:

XP Vista Window 7 Windows 8
Processor 233MHz 800MHz 1GHz 1GHz
Memory 64MB 512MB 1GB 1GB
Disk 1.5GB 20GB 20GB 20GB

There was a significant jump from XP to Vista, a small change from Vista to Windows 7, and now change from Windows 7 to Windows 8.  I can’t imagine running any of these OSes on the minimum requirements, you can’t even buy a minimum requirements PC at Best Buy.

For most users there is no reason to upgrade other than a hardware failure.  And when users do upgrade, they will probably be happy with “yesterday’s”  technology, not the higher margin, latest and greatest.  In the past hardware manufactures depended on the consumers need to upgrade their obsolete hardware, but now they must find a way to get consumers to want to upgrade.  Apple has been great at creating hardware that makes consumers want to upgrade whether they need to or not.  I think that is what Microsoft is trying to do with the Surface, to make consumers want to buy a Windows tablet even if they don’t need to upgrade.

The biggest threat to OEM’s isn’t the Surface, it’s their inability to create “must have” hardware.

 

*Yes, there will always be some users who will benefit from the latest and greatest hardware, I’m one of them.

 Posted by at 12:56 pm
Jul 172012
 

For the past few weeks I’ve experimented with alternate keyboard layouts with the long-term goal of increasing my typing speed.

At first I tried Dvorak, which is the most popular alternative layout.  I found it cumbersome to learn.  Almost every key is in a new position.  After a couple of weeks of practice I had mostly memorized the layout, but was still only typing at 16 WPM.

Then, while clearing out some bookmarks I found a link to the Colemak layout.  I’ve considered switching layouts for some time, so I wasn’t surprised to find the bookmark.  Like Dvorak, Colemak is designed for efficient and ergonomic touch typing in English.  Unlike Dvorak, it is based somewhat on the QWERTY keyboard.  Only 17 keys have moved.  The transition was easy.  I memorized the new layout in just a couple of days and was typing at 30+ WPM within a week.  I seem to have stalled, but I think the issue now is learning to type words (or letter combos) instead of typing letter by letter.  That’s something I expect will come with time.

Here are my observation of the learning process:

  • There is a noticeable difference in how much finger movement is required compared with QWERTY.  I hope this difference will result in more speed and comfort in the long run.
  • I had no problems switching between layouts until I was above 25 WPM on Colemak, then I started to get confused when on QWERTY.  I switched to Colemak completely after I hit 30 WPM 2 days later.
  • My speed at a typing test seemed slower than regular typing when I tested on QWERTY, but I definitely copy text faster in Colemak than I type my own thoughts.  This has improved since switching to Colemak full-time.
  • TypeRacer is a great place to practice.  You race others in short (<2 minute) races, and the quotes you type are at least somewhat interesting.  It also tracks and graphs your progress.
  • Slow and accurate beats fast and inaccurate.  If you mistype, it takes 3 strokes to make a letter.  At 30 WPM you type 2.5 characters per second.  You are better off spending the time to type the right letter the first time.
  • I don’t type as much as I thought.  With Visual Studio’s Intellisense I only type 1 or 2 letter then press Tab to complete for most things.  I honestly thought I typed more.

 

A really cool tool for comparing keyboard layouts.  It calculates the distance traveled, percentage home row and some other stats to help illuminate the differences between layouts.

Stats for this post (except the grid):

QWERTY Colemak Dvorak
Distance 74.50m 38.16m 44.29m
Same Hand 38.25% 32.45% 22.16%
Same Finger 5.0% 1.333% 3.291%
Top Row 52.70% 18.45% 24.95%
Home Row 28.86% 65.20% 61.07%
Bottom Row 15.87% 11.91% 9.666%

QWERTY is a clear loser here, its primary advantage is its monopoly.  The relative merits of Dvorak vs Colemak are debatable.  Are Colemak’s higher home row percentage and lower same finger percentage worth the trade for higher same hand and bottom row percentage?  Colemaks biggest advantage over Dvorak is the ease of learning if you are already proficient with QWERTY.

 Posted by at 3:56 pm
Jun 122012
 

In my last post I set a goal to switch to the Dvorak layout over the next few months and I’m looking to double my typing speed.  To do that, I am practicing typing on the Dvorak layout for a 10-15 minutes a day for a while and as my speed improves I’ll add time.  I’ve found that switching layouts is startlingly easy, so I thought I’d share how to do it (instructions are for Windows 7 and may vary for other versions).

Click Start and type “intl.cpl” into the search box.  This will bring up the Region and Language control panel.  Click on the Keyboards and Languages tab.

Capture1

Click Change Keyboards

Capture2

Click Add and select the keyboards you want to add.  I just added United States-Dvorak.

Go to the Advanced Key Settings

Capture3

From here you can assign Hot Keys to switch between layouts.  If you highlight the “Between input languages” and click the Change Key Sequence, you alter what key combinations cycle between languages and keyboard layouts.  I removed the cycle between languages because I only use US-English, and I assigned the Left Alt-Shift to cycle between keyboard layouts.

Capture4

The last thing I did is back on the General tab, I went to the properties of the Dvorak keyboard and I changed the icon to a keyboard with a red border so that when my keyboard is in Dvorak mode the little Language Bar icon on the right side of the task bar is a read keyboard instead of the standard one.

QWERTY

image

Dvorak

image

 

No for the best part, or worst part, I’m not entirely sure yet.  When you switch layouts, the switch only affects the app you were in when you switched layouts.  So, I can keep my browser in Dvorak for typing practice, but Outlook and Visual Studio stay in QWERTY.  I think this will come in handy in the long run as I can keep a say Outlook in Dvorak, and Visual Studio in QWERTY or vice versa depending on productivity.  Eventually I’ll switch the default…

 Posted by at 12:21 pm
Jun 072012
 

So, I read one blog by Steve Yegge linked from CodePoject about typing speed (which is a great read if you have the time).  Then Steve Smith tweeted his blog post on the same subject, which was in response to Jeff Atwood’s post.  Apparently all 3 articles are from 2008, but I read them like they were news today.

Was that enough name dropping?

I read those 3 articles, and all 3 have the same premise.  You should be a fast efficient typist if you write code for a living.  They go almost as far as saying it’s the most important skill.  I don’t think that’s true, but being a better typist will most likely make you a better programmer.  If I code type as fast as I thought, I could either put out a bunch more code per day, or I could put out the same amount of code, just better thought out.  Or some combination in the middle – a little more slightly better thought out code.

They also linked to this typing speed test.  Steve Smith and Jeff Atwood were both in the mid 80′s and Steve Yegge claims 120 WPM.  I have no reason to doubt Mr. Yegge, but his measurement may be from typing his own thoughts whereas the rest of us used the typing speed test where you are copying text and I think there’s quite a difference.  I suspect Steve Smith and Jeff Atwood would easily put out 100+ WPM of their own thoughts.

Of course I tested myself and came up ~55 WPM.  I did the test 3 times at 54, 56 and 54 WPM.  Each test had between 1 and 3 errors.  I was not impressed with my performance (partly why I took the test 3 times), so I’ve set a goal to double my speed on that test.

My plan is this:  I’m going to switch to Dvorak layout for ~10-15 minutes a day and practice with some sort of online typing tutor.  Once I have the keyboard memorized and I’m typing >30 WPM, I’m going to add a few hours a day in Dvorak, the rest in Qwerty.  Once I hit >50 WPM, I’ll switch to full-time Dvorak, and continue with the typing tutors for the 10-15 minutes per day until I reach 110 WPM.

Through this I’m going to try to update here every week or two to report progress.

 

 Posted by at 5:06 pm
Jun 052012
 

A quick post showing how to create a combo box that shows a single line, shows multiple lines when expanded. Obviously you can extend this to show any two datatemplates for collapsed and expanded.

ComboBoxExample

The first thing I did was create the data templates that control how the address is going be displayed. When it’s collapsed, I just wanted to show the AddressName and AddressType on one line:


<DataTemplate x:Key="AddressComboCollapsed" >
    <StackPanel Width="150" HorizontalAlignment="Stretch" >
        <DockPanel HorizontalAlignment="Stretch">
            <TextBlock Text="{Binding Path=AddressName}" 
                       DockPanel.Dock="Left" 
            />
            <TextBlock Text="{Binding Path=AddressType}" 
                       DockPanel.Dock="Right"
                       HorizontalAlignment="Right"
            />
        </DockPanel>
    </StackPanel>
</DataTemplate>

When it’s expanded, I want to show the whole address and suppress AddressLine2 if it’s blank:


<DataTemplate x:Key="AddressComboExpanded" >
    <GroupBox BorderThickness = "1"
              Margin = "0,0,0,3"
              Width = "Auto "
              HorizontalAlignment = "Stretch"
              Header = "{Binding Path=AddressType}">
        <StackPanel Margin="3" 
                    HorizontalAlignment="Stretch"
                    MinWidth="250">
                <TextBlock Text = "{Binding Path=AddressName}"/>

            <TextBlock Text = "{Binding Path=AddressLine1}"
                       Name = "tbAddr1"
            />
            <TextBlock Text = "{Binding Path=AddressLine2}"
                       Name = "tbAddr2"
            />

            <!-- City, State, and ZIP display -->
            <StackPanel Orientation = "Horizontal">
                <TextBlock Text = "{Binding Path=City}" />
                <TextBlock Text="," Padding="0,0,5,0"/>
                <!-- Put a comma between city and state -->

                <TextBlock Text = "{Binding Path=State}" Padding="0,0,5,0" />
                <TextBlock Text = "{Binding Path=PostalCode}" />
            </StackPanel>
        </StackPanel>
    </GroupBox>

    <DataTemplate.Triggers>
        <!--If the "AddressLine2" portion of the address is blank, then
            HIDE it (no need to display an extra blank line)
            
            This only works is AddressLine2 = "", not if it's null
        -->
        <DataTrigger Binding = "{Binding Path=AddressLine2}" Value = "">
            <Setter TargetName = "tbAddr2" 
                    Property = "Visibility" 
                    Value = "Collapsed"
            />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

The step was to create a AddressTemplateSelector class that inherits from System.Windows.Controls.DataTemplateSelector.DataTemplateSelector, and override the SelectTemplate method.


public class AddressTemplateSelector : System.Windows.Controls.DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        ContentPresenter presenter = (ContentPresenter)container;

        if (presenter.TemplatedParent is ComboBox)
        {
            return (DataTemplate)presenter.FindResource("AddressComboCollapsed");
        }
        else // Templated parent is ComboBoxItem
        {
            return (DataTemplate)presenter.FindResource("AddressComboExpanded");
        }
    }
}

After that, it’s just a matter of importing the namespace of the DataTemplateSelector into the Window, merging the Resource Dictionary that contains the DataTemplates, and setting the ItemTemplateSelector of the ComboBox.


<ComboBox Height="30" Width="200"
            ItemsSource="{Binding Path=Addresses}">
    <ComboBox.ItemTemplateSelector>
        <dt:AddressTemplateSelector/>
    </ComboBox.ItemTemplateSelector>
</ComboBox>

Point of Interest

If you look closely at the templates, you’ll notice that the expanded template is wider than both the combobox and the collapsed template. This allows you to have the list be wider than the original combobox. That’ll be a nice feature when I move on to the state selection combo (display only StateCode, but show StateCode + StateName when expanded).

 Posted by at 7:50 pm
Jun 042012
 

WMPowerUser posted some interesting stats on what capabilities applications are requesting.  Interesting stuff, but they clearly haven’t published an app, or at least not an ad supported app.

First let me say that I have only published a single app so far, so I’m not some amazing expert.  My app, Chess Tactics, doesn’t actually need any capabilities by itself.  That being said I have quite a few capabilities listed.  Most of these capabilities are required by Microsoft’s ad control, with one additional capability required by MTIKS (a utility I’m using usage and error detail).

Here’s my capabilities list and why I include it and why I think it’s required:

  • Phone Dialer
    •  MS Ad Control – so you can dial a phone number direct from an advertisement
  • Networking
    •  MS Ad Control – to download ads for display and report any clicks
    • MTIKS – Send data back for reporting
  • Web Browser
    •  MS Ad Control – to display the ads
  • User Identity
    •  MS Ad Control – to track what the users interests are across apps
    • MTIKS – Track user loyalty across app versions and user device upgrades
  • Media Library
    •  MS Ad Control – No idea at all
  • Device Identity
    •  MTIKS – To track what devices are using my app in case a particular one become problematic

 

None of these capabilities indicate an app is trying to do anything nefarious.  I would expect pretty much every app to need these capabilities.  Now if an app wants access to my microphone, it better have a damned good reason.

Between collecting stats, serving ads, and apps that use network service to provide value, I think it’s out of line to say that 95% requesting network services is “larger than necessary”.  In fact, it makes me wonder what the 5% of apps that don’t require network access are.

If you know why the MS ad control needs access to the Media Library please let me know in the comments.

 Posted by at 11:45 pm
May 302012
 

A response to a request for everyone to share how they got started down the road to become software developer.

I wrote my first code on a Kaypro II.  My mother bought it around 1987, and there were 2 things you could do on it.  You could use the word processor (I think it was WordStar) or you could program in some variant of BASIC.  I did a little of both.

My mother had a handful of programming books left over from getting her Associates degree a few years earlier, and I would copy some of the sample applications, or try to do some of the problems in some of the chapters.  Between the things the books left out and the bugs I added while hunting and pecking the code into the computer I had plenty of debugging to do.  In some ways I wish I had some of that code, but mostly I’m glad the evidence has been destroyed.

Next my mother bought an IBM pc running Windows.  My recollection was 3.1, but I’m almost certain I got it before 1992 so who knows?  I don’t remember how much ram it had, maybe a couple of MB?  I do remember the disk was 25mb.

The first challenge with that was to try to get this one flight simulator running on it.  I spent weeks modifying the autoexec.bat and config.sys on a boot disk to loaded the absolute bare minimum into memory and get every configured just right to be able that flight sim.  Then I spent countless hours playing purchased and/or pirated games and playing in Q-Basic.

Around that same time I got a programmable calculator for my high school math class.  I started writing programs to do the math problems for me.  I still had to show the work, but I could be certain the answer was correct.  I also created a simple black jack game and a two player howitzer game with random landscape and wind.

All that and I chose sports medicine as my major in college?  Yup.  How I got from sport medicine back to software development would be a whole post in itself.

So really, it was my Mom who got me started down this path.  She not only bought the computers, but she taught me how to debug.  How to work through the problems.  How to go step by step until you see where things where things go wrong.  Skills I still use every day.

Thanks Mom.

What’s your story?

 

 Posted by at 1:18 pm