Friday, December 18, 2009

Interviews - Don'ts and Don'ts

Fresh off the job hunt I can sort of laugh at some of the lessons learned.

I've always thought of myself as a bad phone interviewer and I was wrong.  I'm actually much worst than bad...  I feel much more relaxed when at in-person interviews.  My track record at in person is not too bad, probably 8/10 lifetime record.  My track record for phone interviews? 5 in 100?


How bad are my phone interview skills?  You don't have to be a coder to observe how I can spiral downwards, absolutely freeze and become a complete idiot (more than normal).  Here are some excerpts from last weeks hilarity, none of them were from the company that hired me, rest assured.




Interviewer:  Mark, what prompted you to apply to our company?
Me:  Oh, my friend suggested I apply...

Interviewer:  How can you describe the differences between .Net 1.1, 2.0, and 3.5?
Me:  Ummm.....Ummm......Ummm.....I work with them all the time!....Ummm.....Ummm.....I can't think of any.  Sorry.

Interviewer:  What are the differences between a const and a readonly in .Net?
Me:  A cont variable is a fixed, defined value that cannot be changed by the program, the readonly...?  Hmmm, haven't used one in a few years so not sure how it is different from the const...

My favourite response:

Interviewer:  So how is a protected method different from a private?  (This was basically a question to see if I've ever programmed before)
Me:  Ummm....well, a private method is private to you know, umm, the container object.  The protected method is available to the associated objects.
Interviewer:  Well, who can access the protected method?
Me:  Well, the associated objects, it's public to all associated stuff.

FAIL.

I luckily didn't freeze up on a couple other phone interviews...

Merry Christmas to all!

Monday, November 23, 2009

CDs and DVDs - Why?

I remember when I saw my first CD, it was back in the mid-80s. Revolutionary, you could skip to different song within a second. But that was more than 20 years ago! DVDs delivered more storage, but the same issues as the CD – it easily scratches.

 I remember soon after the CD came out I spent ½ years worth of allowances to purchase my first high storage drive, the Commodore 1581. It could store a whopping 1 Meg of storage (great for my BBS – The Surf Board!), but what I remember distinctly is that it was the first time I used the 3 ½ floppy. Sure you can make fun of the disk now due to it’s low storage, but since the actual magnetic disk was encased in plastic, you could throw it across the room, rub sandpaper across it, and it would still work.

Last week my wife got a DVD from the library for our 3 year old son, Bear and the Big Blue House, and I was frustrated due to the frequent skips. How long does a DVD last with 3 year olds handling it? About 5 minutes I would guess. I feel we’ve advanced so far in all aspects of technology, yet we still seemed plagued with this bad storage medium.

Blue Ray? Slightly better, but still not adopted everywhere. Solid State HDs seem very promising, but I’m not seeing Bear and the Big Blue House on a 2 Gig stick at the library. Or a USB port on my TV that will allow me to play it.

I’m hoping soon CDs and DVDs will be relics on the wall, as for now I’ll continue to Fast Forward and rewind past bad frames…

Thursday, November 12, 2009

Asyncronous file upload in asp.net

I recently had a customer request a feature to upload files to their account.

It's an interesting architectural dilemma, since the file is on the client, the file is to be stored on the Server (in my case, not even the web server), and I definitely wanted to avoid postbacks since it was a rich web app and a postback would look/behave badly.

Some options are AjaxUploader, while it looks solid, I didn't want to pay for the service at the time since paperwork for this type of functionality was more work than coding from scratch.

Another option was the AsyncFileUploader which comes with the latest Microsoft Toolkit, screenshot below. It does an automatic upload on selection, and provides a mind-numbing green background on success, and a red background if it was unsuccessful (which is a nice feature!)


Unfortunately, this great control had errors with IE6. Since a lot of our users are on IE6, this is a show-stopper.

I adopted an idea from a co-worker, kludgy, but effective. Essentially, you put a file upload control in an iFrame (so a postback within the iFrame doesn't postback the entire page), then send a Javascript message from the code behind when the file upload is complete. There were several challenges with this:
  1. asp.net name mangling
  2. Lots of Javascript
  3. Updating the asp.net grid within the UpdatePanel so a full page refresh doesn't happen
Here was the result, works pretty well:

Notice that the filename can be clicked to be viewed, and the delete option, these are all done in the asp.net code behind and done without full postback since the grid is within an UpdatePanel.

So how do you update the grid on file upload?

I added a linkbutton on the grid with associated codebehind (I kept the LinkButton1 name for posterity):
  
protected void LinkButton1_Click(object sender, EventArgs e)
{
   LoadDocs();
}
Now, when the file uploads, simply call the javascript function uploadNotify, via ServerCode:
ClientScript.RegisterStartupScript(this.GetType(), "uploadNotify", script);
Now, the final step? Write the uploadNotify script on the parent page:
function raiseAsyncPostback() {
   __doPostBack("<%= this.LinkButton1.UniqueID %>", "");
}
The UniqueId is resolved to the mangled name (this nuisance now resolved in .net 4.0 - yay!)

That's what it takes! Kludgy, but effective, and gives you highly customizable options. Personally, I'd wait for the Toolkit version to be spiffed up, looks really good.

Thursday, November 5, 2009

Silverlight Autocompletebox with custom dropdown

I needed to create an Autocompletebox for selecting staff. I wanted a robust select so you can type in the first name of the employee, last name, staff id, or even the office the staff member resided in, and the list would be filtered and selectable in the dropdown.

Once selected, the box could fire an event that would load additional info about the employee. Here is what it looks like, this is before I put in pretty formating, keep in mind I'm a coder, not an artist. :)

I decided to get the staff member via a WCF call, here is the GetStaffList() call I defined and am returning a custom class so I can specify the exact search criteria.

[OperationContract]
public List GetStaffList()
{
   Csla.ApplicationContext.ClientContext["HostName"] = // I used CSLA, put address here;

   List staffList = new List();
   StaffViewListClass staffListClass = StaffViewListClass.GetStaff();

   foreach (StaffViewClass staff in staffListClass)
   {
      staffList.Add(new StaffSearchClass(staff.FullName, staff.FirstName,
                  staff.OfficeName, staff.StaffId));
   }
   return staffList;
}

And here is the custom class definition:

[DataContract]
    public class StaffSearchClass
    {
        [DataMember]
        public string FullName { get; set; }
        [DataMember]
        public string StaffId { get; set; }
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string OfficeName { get; set; }
        [DataMember]
        public string DisplayValue { get; set; }

        public StaffSearchClass(string fullName, string firstName, string officeName, string staffId)
        {
            FullName = fullName;
            FirstName = firstName;
            OfficeName = officeName;
            StaffId = staffId;
            DisplayValue = StaffId + " " + FullName;
        }
    }

Note the use of [DataContract] and [DataMember] attributes. These are important so the ServiceReference knows about them.

The next phase was to create a custom searchable Autocomplete box. Jeff Wilcox Microsoft MVP has a great "missing guide"

Step 1: In your Silverlight project, add a Service Reference to your WCF Service.

Step 2: Get the Staff Data Asyncronously. Here is my MainPage() method:
public MainPage()
        {
            InitializeComponent();

            SilverlightAuto.StaffService.StaffServiceClient client = new SilverlightAuto.StaffService.StaffServiceClient();

            client.GetStaffListCompleted += new EventHandler(client_GetStaffListCompleted);

            client.GetStaffListAsync();

        }

        void client_GetStaffListCompleted(object sender, SilverlightAuto.StaffService.GetStaffListCompletedEventArgs e)
        {
            List list = e.Result.ToList();
            uxAuto.ItemsSource = e.Result.ToList();

            uxAuto.ItemFilter += SearchStaff;

        }

Important to note: In my ServiceReference completed event, I've added an ItemFilter to my Autocompletebox control (uxAuto). This is necessary to custom bind my search criteria (remember that I wanted to search on First name, last name, etc). Autocompletebox can't assume what you want to search on, but makes it pretty easy to customize.

Here is the SeachStaff method, you can put whatever search criteria you want, but be aware of performance if you are parsing a lot of data.

bool SearchStaff(string search, object value)
        {
            search = search.ToLower();
            SilverlightAuto.StaffService.StaffSearchClass staff = value as SilverlightAuto.StaffService.StaffSearchClass;

            if (staff != null)
            {
                if (staff.StaffId.StartsWith(search))
                    return true;
                else if (staff.FullName.ToLower().StartsWith(search))
                    return true;
                else if (staff.FirstName.ToLower().StartsWith(search))
                    return true;
                else if (staff.OfficeName.ToLower().StartsWith(search))
                    return true;
            }

            return false;
        }

As a reference, here is the Xaml for the autocomplete box. Note you need to add the System.Windows.Controls.Input declarative.

  
        
            
                
                    
                        
                        
                    
                
            
        

So remember the requirement that I needed to populate some other stuff once the staff member has been selected? That was tricky, there is no obvious event to hook into when the user has been selected, but if you look, I have an event on DropDownClosed. Seems like an odd event to tie into, but works exactly like I wanted it to since when a staff member is selected the box closes!

Overall I am really impressed with this control. I used to have to do a lot of custom coding to re-create this behaviour in web forms, and it's really kludgy to do in AJAX, if you are lucky enough to get something close to this functionality.

Monday, November 2, 2009

Halloween candy consolidation?

It occurred to me while raiding looking through my son’s Halloween candy yesterday, that all people bought the same candy to give out to treaters. In fact, I think if I held up my son’s loot next to the Costco "mixed" snack size candy, they would be identical.

Apart from M and M’s, snickers, butterfinger, and Hersheys snack size candy, there were no unique candies. If I’m not mistaken, most of the treats came from the same manufacturer, Mars Inc. (or Hersheys). There were also a lot less houses participating, my guess is every second house did not give out treats. My era? 1 in 10 did not participate.

Next year I am going to search for some unique treats, and buy a lot of the full size bars for the cool costumes – let’s treat the kids right!

Thursday, October 8, 2009

My dad was right!


Sometimes I'll admit my dad does things differently (ok, a lot of the times), but after reading a post from my fellow namesake Tim Kadlec, it turns out I've been opening a banana the wrong way my whole life!

My family has made fun of my dad for the past decade for the way he opens the banana, but he was being way more efficient the whole time. A humble lesson for me today, always keep an open mind. Lesson #2, you're never too old to learn a thing or two from your folks.

Check out the video, stem down from now on!

Sunday, July 19, 2009

45 miles of Bongo

I've created a new route that I would like to share with anyone that would like to join me on a killer route that will destroy your legs.

Click here for more detail



The route starts in West Seattle, goes through the heart of Seattle up a neverending ascent up Jackson Street, then goes around Mercer Island. Once around Mercer, you can stop at washrooms and fill your water up because guess what? You are only halfway done. Go back to the Sound, across to West Seattle and loop around the North End of Alki. For the finish take an uninteresting ride through an industrial area to the killer climb known as Highland Park drive. Next to Montreax, this thing will leave you spent.

Monday, July 13, 2009

STP in a day - epilogue

RAD and I got up at 03:15, ate breakfast and drove up to meet the team at 04:30. Nothing like doing an all day ride on 4 hours sleep!

Felt pretty good riding in the morning, Spiz got a flat but overall everything was going smoothly. We ate and rested in Centralia, but soon encountered pretty strong headwinds and most notably the heat! It was 30C outside but felt like 40 on the bike. Frequent water stops helped.

There were plenty of stops, by estimate I ate 6 Peanut butter and jelly sandwiches, 3 turkey wraps, 10 bananas, 6 slices of Banana bread, 10 Fig newtons, 10 Oreos, 5 SweetNSalty bars, 2 Cliff bars, 2 oranges, 2 Gels, 5 bottles of Gatorade, and 10 bottles of water.

We crossed the finish at 8:45p and after stopping to change at the hotel, I enjoyed some tequila and Pork sliders.

Yes, we look like dorks but c'mon, it 05:00 at this point...



Thursday, July 9, 2009

2 days before the Seattle to Portland (STP)

Another sold out event at Cascade so there will be 10,000 riders to contend with on Saturday at 05:00, I'll definitely need a coffee before the race.

I've set a goal this year of riding the STP in a day. It's 330 km and most will ride this in two days. I am one of the insane 2500 riders that will attempt in a single day.
The good news is that the ride is very organized and there are plenty of stops for food and rehydration. I've also trained for this cause I think it will be a long day in the saddle. Hope to finish in under 12 hours.

Team Bike Run Swig consists of The Guth, Spiz, RAD, Suzie, and myself. We will meet at Suzie's at 04:30 (like I said, I'll need coffee!) and bike over to Husky Stadium for pictures and the start.

Pack List:
Bike Shoes
Socks
Shorts and BRS Jersey
iPod Shuffle
Pump
2 Gels/Bars
2 Bottles Gatorade
ID and $$
Cellphone
Sunglasses
Helmet
MultiTool
Spare tube
Tire levers
Race Packet with bib number
Sunscreen

Sunday, June 14, 2009

2009 Flying Wheels Century

Yesterday I rode the 2009 Flying Wheels Century, basically my first organized ride and it was definitely eventful. I learned first hand to "expect the unexpected". I rode with The Guth, Spiz, and Guth's friend Olson AKA "Olly".

We set out from Marymoore at exactly 08:00, I packed only a couple of gels since I heard that the pit stops have tons of food and water. The first hour had a pretty steep hill that left everyone out of breath, but everything seemed pretty normal.

Mile 35 - I pull a muscle in my left calf. Great, I now have 65 more miles gritting my teeth in pain. I decide to just not bend my left ankle for the rest of the ride which semi-works. I thought of Tyler Hamilton at the Tour de France years ago and sucked it up.

Mile 38 - Olly pukes on the side of the road.

Mile 40 - I get a front flat for no apparent reason. Russian guy stops to help me pump - I owe him a beer but don't see him again.

Mile 80 - Everyone is pretty tired and guess what's in store...a 3 mile hill! The folks at Cascade have a sense of humour. :)

Mile 85 - The Guth and I unexpectedly create our killer drink mix. The Guth aptly describes it as "A lemon-lime roundhouse" that nearly knocked us off of our bikes.

Mile 99.5 - Blow my rear tire out. Yes, that number is correct, literally 1/2 mile from the finish I hear a loud gunshot blast and jump off my bike. The photographer 100 yards away yelled "Whoa dude, was that your tire?". I completely blow my rear tire out and have to walk across the finish line.

All in all a great day, very hot conditions but I think we fared pretty well. The pit stops were incredible, I ate delicious food and snacks throughout the day. Spiz had his GPS running so here are the details of the ride. Next stop, STP in a day!

Thursday, May 28, 2009

North End Training Camp

Looks like we are going to head up to Bellingham this weekend for a North End training camp for bike season.

We are going to do this route on Saturday, stay overnight at Spiz's and I'm heading back Sunday morning. The route looks fantastic with initial views of the Pacific Sound for the first half of the day and views of Mt. Baker for the second half.

Unfortunately Robin can't make it, the poor guy hasn't received his Passport yet, so he will miss out on all the fun. Skoda, more beer for me! :)

Saturday, May 2, 2009

Homemade Power bars

Ok, since I am constantly sucking down Cliff Bars, I decided to try to make my own and see what I could do. After reading a great article on how to make your own energy bars, I made a few tweaks, rolled up my sleeves, and got to work.





My Ingredients


3 1/2 cups rolled oats
2 scoops protein powder
1 T cinnamon
1 cup nonfat dry milk
1/2 cup chopped dates/raisins
1/2 cup chopped nuts
1/4 cup Ovaltine

1 banana mashed
1/4 cup molasses
1/4 cup light corn syrup
1/4 cup Honey or Agave syrup
1 t Vanilla extract
1/4 cup juice
2 egg whites
1 T vegetable oil
1/4 Cup apple sauce

Optional
1/4 cup Peanut butter
1/2 cup chocolate chips

Instructions

1. Thoroughly mix all the ingredients in a bowl
(mix the dry ingredients together before adding liquid ingredients, then mix everything)

2. Put spoonfuls on the waxed paper (use some non-stick spray on the paper)
and form into bars (I use a plain table knife for doing this.)
Spreading the spoonfuls out a bit as you put them on the paper makes this much easier

3. Bake at 330°F for approximately 17 minutes or until the bottoms of your bars are golden brown

Here is what they looked like before going into the oven:















And then after baking:
















The batch yielded 14 bars and were very close in size to a Clif Bar.


I did a nutritional analysis of these bars (yes, I know I'm a geek) and here are the final numbers:


Calories per bar: 253.5

Fat per bar: 6.4 g

Protein: 9.0 g

Sugar: 22.8 g



These numbers were extremely close to the Clif Bar as well! (Almond/Cherry was used in comparison)

The fat content was a little higher in my bars due to the added nuts, but you can tweak as you like. I opted to add chocolate chips, and next time may add Peanut butter, look forward to a revised recipe soon!

All in all, they turned out great, fit great into the snack ziplocks (which are reusable so less waste). If you try, let me know how they turn out!