I haven't had an opportunity to clean it up, but I published it at http://www.codeplex.com/solitaire.

Now that I work here, I'm starting up a blog on blogs.msdn.com.

Yeah!

Finally settling in. Have an office, computer, phone, login alias and mentor to help me get setup. Still drinking from the firehose of corporate training, there is a lot to learn. Looks like I even have a feature to work on, which is cool, cause I’m ready to jump in and go.

All in all, an exciting time. Now if my wife and I can just get the house hunting done, and settle down so I can do my job. <grin>

So, after several years, I got the job. The problem with getting "the job", is, well, "Oh ****, I got the job" I'm now faced with a couple of interesting issues.

1) I have to get to the job. For me and my family, that is clear across the country from Virginia Beach, VA to Redmond, WA. I can't go much further without leaving the country.

2) I have to do the job. Ok, that shouldn't be a problem. :)

3) I need a new life goal. Well, I don't need to worry about that yet, first I have to get there..


6/1: I was going to talk about the whole trip, but I'll just post a few comments:

After 8.5 years in a house, I've got way more stuff than I thought.

Getting three dogs to Seattle has been a chore. We ended up going to Regean International to make it a non-stop flight, so a four hour drive starting at midnight, then an 8 am flight from the east coast to the west coast made for a very long day.

It's expensive here!

Our house in Virginia sold in 1 day, so it was one less thing to worry about.

I start at the NEO tomorrow, so we'll go from there.

Towards the end of April, I accepted a position a Microsoft working as an SDET in DevDiv on a currently undefined (to me) product. It's currently just about 2 weeks away from my June 2nd start date, so I thought I'd start blogging about the experience.

I've been wanting to work for MS since TechEd 2001 (long story) but only actively pursuing it since Fall of 2006. Prior to this most recent round of interviews, I had been to Microsoft for three sets of in-person interviews and one phone screen that did not go anywhere. (Various reasons, but for the most part, it just wasn't the right fit)

This time, however, the everything fell into place. The job I applied for was a Program Manager position on a currently unspecified extensibility product. I'm a developer at heart, but I've done Dev Lead work in the past, and extensibility is an issue that is near and dear to me, so I applied for the position and followed up with the original blogger to make sure my resume didn't get lost in the shuffle.

Not only didn't it get lost in the shuffle, but I had a phone screen about two days later, and a plane trip at the end of the following week.

Here's where things get interesting... As I said, I've been to MS 3 times prior for in-person interviews. It's a grueling process and generally, the better you do, the longer it takes. (At least you get lunch) It's a two way interview, a chance not only for MS to evaluate your skills and passions, but a chance for you to evaluate MS and the team. Personally, I've tried to ask questions about the process used, and the relationships between the disciplines. I've learned a lot this way. And since this was a PM interview, I got to see the MS process from a different perspective than earlier dev only interviews.

Interviews started at 8:30 and went on through and past lunch. I thought I held my own, but I was done by about 2:00 :( Still, that was several hours long. However, when I got back to the hotel, I got a call from the recruiter that said they thought I would be a better fit for a developer or tester position and would I be interested in interviewing for one of those. (Hmmm. Yes!) They couldn't get together enough people to do interviews on a Friday afternoon, but I spoke with the hiring manager, and agreed to stay through the weekend.

Monday morning came, and I started the process again. Started later in the morning, but same grueling process. This time I spoke to several more people, and had to solve a wicked, wicked whiteboard problem late in the day. (A non coding problem but definitely a problem solving exercise, and no, I won't tell you what it was)

All in all, I felt pretty good about things as I got on my red-eye to come home and go back to work the next morning. A full day of work after 8 hours in a plane is not easy, but it was all worth it when they called with a job offer! Definitely a worthwhile trip...

Coming up... Getting to Seattle...

Two weeks ago, I posted about my Solitaire program with improved WPF animations. I'm still working on code cleanup to release the source, but I'd like to document some cool tricks I learned about Borders that might come in handy.

(As an aside, I said I had an interview. Well, after two cross-country flights, and two grueling rounds of interviews I've been offered a job which I'm going to accept. I'll talk more about that when I can)

All of the cards used in the WPF version of this program were from OpenClipart, including the card backs. I've no problem with the card faces, but I wanted to include several different backs, including the ability to import custom ones. There were a couple of challenges with this. I wanted a rounded corners, a drop shadow, and the ability for the picture to fill the entire inside of the border with it's rounded edges.

The rounded corners were easy enough, just use the CornerRadius property.

<Canvas x:Name="mainCanvas" Background="Green" Width="250" Height="250">
    <Border BorderBrush="White" BorderThickness="5" CornerRadius="15">
    </Border>
</Canvas>


sample1

The drop shadow proved to be a little more difficult, since WPF doesn't provide 3D Borders by default. However, a little searching turned up a method to create the a 3d look for square borders by nesting two borders.  Some experimentation, and I found this would work quite well for a drop shadow.

<Canvas x:Name="mainCanvas" Background="Green" Width="250" Height="250">
    <Border BorderBrush="DarkGray" BorderThickness=".0,.0,2,2" CornerRadius="18">
        <Border BorderBrush="White" BorderThickness="5" CornerRadius="15" >
    </Border>
</Border>
</Canvas>

sample2

Note that you have to set the CornerRadius on the outer Border to a slightly larger value or you get a gap between the outer and the inner border.

Now comes the hard part, getting the image inside the border.

I used the following image, and dropped the <image> tag right into the inner border.

happy sample3

As you can see, it doesn't completely fill the border AND the square corners of the image overlap the rounded corners of the border. Not good. I turns out one more trick is all that's necessary. Instead of putting the image inside the border, you make the image the border of the background. Also, a third nested border gives the black border around the image to give some demarcation to the inner image, and completes the card.

<Canvas x:Name="mainCanvas" Background="Green" Width="250" Height="250">
    <Border BorderBrush="DarkGray" BorderThickness=".0,.0,2,2" CornerRadius="18"
    Height="190" Width="140" Canvas.Top="30" Canvas.Left="55"
    >
        <Border BorderBrush="White" BorderThickness="5" CornerRadius="15" >
            <Border BorderBrush="Black" BorderThickness="1.5" CornerRadius="12">
                <Border.Background>
                <ImageBrush>
                    <ImageBrush.ImageSource>
                        <BitmapImage UriSource="c:\temp\happy.jpg" />
                    </ImageBrush.ImageSource>
                </ImageBrush>
            </Border.Background>
            </Border>
        </Border>
</Border>
</Canvas>

sample4

So there you have it, all the steps to make a card, and hopefully some tricks to add to your bag of tricks.

I've been working on a Solitaire program on and off for years (pretty much since .NET 1.0 was in beta) The back-end engine/framework was pretty straightforward, but I could never get the animation quite right. I've kept it up-to-date with each release of the framework, updating for generics, and even trying DirectX, but I could never get it quite right.

When WPF came along and I came across some SVG Clipart for the cards, I was inspired to try again. This time around, the cards looked pretty good, and the animations (when they displayed were very smooth) but I kept having trouble with threading, so when the deck was shuffled, it only showed one card move, and that was the last one! Frustrating, to say the least, to come so far, then get hung up!

However, this week, when working on a Silverlight project, I relearned how to do animations, particularly in code, and finally (FINALLY!), I've gotten it so that it draws very smoothly, animates all actions and actually looks pretty good. (IMHO)

I'm actually amazed by how much I gained by going to Storyboards for the motions. Instead of having to fuss over each animation, and try to wait while it was done, I could do entire sets of moves with a ParallelTimeline so that a while stack of cards could move in tandem without any real manipulation necessary. The initial deal, or a pull from the deck looks like all the cards are being carelessly thrown out, but they all land exactly where they need to go. And it was all done in at least 50% less animation code than any other version I've tried in the past.

Of course, there's a lot of other stuff to fuss with, like better mouse handling and memory usage and more variants, but I'm really pleased.

Also, the rules code is almost completely abstracted from the animation code, so I think it could even be ported to Silverlight or XNA with minimal fuss.

Mind you, not tonight <grin>

At any rate, here's the current install: Solitaire

I'm going to clean up the source and release it shortly, but I've got an interview coming up this week that I want to prepare for. Wish me luck.

W00t! It's been a good week to have an 8525. Last week, AT&T released WM6 for the phone, and this morning, with no announcement, 3G got turned on. (I'm guessing they will make an announcement after it's stable.) At any rate, I've been playing around with it for the morning, and it's an incredible difference. Web pages come up pretty quick, maps (Google maps & Live Search) are very responsive. It actually usable as a real time platform for always on connectivity (as opposed to just email alerts)

I'm tempted to try an write up some code for browsing my personal inventory to see how well it works.

Update: Wow! 3G is fast. I was actually able to use my phone for real lookups "in the field" so to speak, without having to wait a 1/2 hour.

Wow! 3G really sucks down the battery. Good thing I have a car charger. <grin>

About a month ago, my 360 died with the Ring of Death, so I took it back to Best Buy using their Product Replacement Plan. I chose to upgrade to a 360 Elite for the bigger hard drive. Get home, transfer some save games off a memory card, load up all my downloaded content, load up the household profile, and it looks like I'm good to go.

But then... I load up Puzzle Quest, and I have to activate it everytime I try to play. It's not a problem, since it still recognizes me as the owner of the product, but it's still awkward. But then, I loaded it up under my son's account, and he can only play it as a trial version. Now, that really sucks, since he was almost done when the console died :(

I looked online, and found this is a common problem. The downloads are tied to the console and the gamer tag. If the console changes, only the gamertag that purchased them is able to continue playing them.

So I called up 1-800-4MY-XBOX, and explained the problem. The rep said he could help, got a list of my games, and spoke with his supervisor. Turns out, that after a 1/2 hour on the phone, they can't help me because it's not the same unit type!

So here I am, Shiny new 360 unit, and nobody in the house can play any of the casual games except me! And given the issues with all the failures, and the potential for the life-cycle of the 360 to go well beyond 5 years it  seems like there should be a better way to handle marketplace downloads and longevity.

Since you can transfer a gamertag through the "Recover My Gamertag" function, and that disables the tag on the previous console, it seems like it would be easy to update the download information to tie to the new console. When the old console connects to Live, just update to change those to trial versions. (I could imagine that someone could use the system offline forever, but they won't be able to connect to live for other games, so it would really end up being a minimal impact) Either that, or send me a disc with all my downloads that I can throw in the play my arcade games!!!

DRM really needs to be resolved if there is any thought of long-term viability of digital downloads. I like the concept, but I also like the thought that I can fall back to physical medium on those games I purchased that way.

(As an ironic aside, I'm not using HDMI to connect the 360, I'm using a VGA cable. The HDMI cable went to the Tivo since that only needs one cable to carry the HD single to the TV, not the two required by the 360)

Maybe someone will come up with a better way to handle this, and let my son play Puzzle Quest without having to repurchase it. And fix the bug where *I* have to log in every time.

Ok, done ranting.

Finally! It looks like the made it available on Nov 1st. You can download it here. I've flashed my phone, and am getting everything else setup again. Looks pretty good.

More Posts Next page »