The ASP.NET MVC Information Portal


A few days ago Dan Hounshell released his latest project: the ASP.NET MVC Information Portal.  This is a great resource for anyone wanting more information about this new framework from Microsoft.

"The ASP.NET MVC (Model View Controller) framework is one of the most talked about and long awaited additions to the Microsoft world of web development. Find and follow all the news, announcements, blog posts, tutorials, tips, and other resources on AspDotNetMVC.com"

This is definitely a site I'll be using as I dive into the MVC.NET Framework in the very near future.  I really like the "In Action" section of the website (notice The Lounge in that list?).  It's cool to see live sites that are using the framework and hopefully we'll see more and more sites being added to that section in the coming months.

Great work Dan!

Technorati Tags: ,,

author: Michael Eaton | posted @ Tuesday, July 01, 2008 9:36 AM | Feedback (1)

Lansing Day of .Net Wrap-up


On June 21st, I attended the first Lansing Day of .NET.

After picking up a presenter mouse from Target Saturday morning, my friend Chris and I arrived at the event around 8:30 (just as the first session was starting).  As I was walking in, I ran in Patrick Foley, Alan Stevens (along with is wife) and Dan Rigsby (along with his wife).  After a quick registration, I hit the speaker room to catch up with people and to try and put some last minute changes into my slide deck and verify my VM was working.

I was in the second time slot of the day which was good because it meant the attendees would be somewhat awake. :-)  I was happy to see several of my tweeps/friends in the audience (including Chris, Dave Redding, Alan Stevens, Mike Wood and Alan Barber - I'm sure there were more, so I apologize if you're not in this list).  I forgot my notes at home, so my talk (Introduction to Castle ActiveRecord, or Stop Writing CRUD!) was pretty much from memory and I know for sure I missed a couple of points I wanted to make.  The session was only an hour, so I felt a bit constrained by the time (most events I've been to have had 70-75 minute sessions).  Other than that, I think it went pretty well.  I need to do a better job of not leaning against the wall (that was one thing my tweeps commented on).  I've got a few weeks before I give this talk at Codestock, so I'm going to be re-working it a bit.

After my session, I bounced between Jay's IoC talk and the speaker room.  While it sounds silly, some of the *best* conversations at events like this happen during the sessions - whether they're in the speaker room or the common areas. 

Lunch, of course, was boxed lunches. :-\ I sat and talked with Jason Follas, Chris and a few others.  At one point, I caught up with a couple guys I worked with years ago (Pradeep and Fritz).

After lunch, I bounced between Patrick Steele's Monorail talk and the speaker room.  The next session I attended was Jennifer's "Intro to WPF", but I bailed pretty quickly.  The pace of Jennifer's talk was faster than my brain wanted to keep up with, and there wasn't much I hadn't heard from talks at other events.

For the last session, a bunch of us decided to hit Len Smith's NHibernate session.  As he is quick to point out, the talk didn't go so well.  I'm not sure what happened, but he struggled through most of the talk.  I can tell you from experience that once something goes wrong, it can be very difficult to recover.  I also know that NHibernate is a big subject and you can really only scratch the surface in an hour.  If he gives the talk again, I'll make sure I check it out because I do think it's good information.

The absolute *worst* part of the day was having to listen to the Mayor of Lansing talk.  It would be one thing if the guy had an IT background, but he was there for the photo-op and that was it. :-\  He had no clue who we were, what we were doing or why we were doing it.  Please...if you're organizing an event, try to keep the politicians away.

During the giveaway's, I won a copy of Snag-it from TechSmith.  I was really hoping for Camtasia, but no such luck. ;-)

After the event, about 20 of us headed to the after-party at Jeff's house.  I'm not sure I can do it justice other than to say it was the event of the year. :-)  It's always cool to see friends in a completely relaxed atmosphere.  There was great food, music and lots of good conversations.  Jeff and his wife did an amazing job of putting this party together!  I was introduced to Keith's "The Elder" drink which consisted of vodka, cranberry juice, orange juice and Sprite.  It was good enough that I eventually had a second. :-)  While she couldn't make the event, Sarah and her husband showed up at the party! 

Chris and I started the 90 minute drive back home around midnight.  It was a great time, but we really had to get going.  As in Cleveland, I was a bit sad having to leave all my friends, but I know it won't be long before another event rolls around and we'll see each other again. :-)

Pictures from the event: Jeff's album, Ryan Doom's album

 

Technorati Tags: ,,

author: Michael Eaton | posted @ Monday, June 30, 2008 8:21 AM | Feedback (1)

I will be speaking at Codestock!


I got the notification today that I'll be speaking at Codestock in Knoxville, TN on August 9th!  I'll be doing my "Introduction to Castle ActiveRecord, or Stop Writing CRUD!" talk.  I'm really looking forward to this event because this will be my first trip to Tennessee!

Here's the description of the conference from the website:

"CodeStock's mission is to bring the best and brightest code experts to East Tennessee for a one day conference open to all developers. This is not a trade show with slick salesman giving prepared demos - this is a gathering of real programmers learning about the latest in technology from each other."

Check out the website, register and hopefully I'll see you on August 9th!

Technorati Tags: ,

author: Michael Eaton | posted @ Monday, June 16, 2008 12:00 PM | Feedback (0)

Upcoming events for June, July and August


These are the events I'm attending over the summer months:

Lansing Day of .NET, Lansing, MI - June 21st (speaking)

Ann Arbor Give Camp, Ann Arbor, MI - July 11, 12 and 13th

Codestock, Knoxville, TN - August 9th (possibly speaking, don't know for sure yet)

Devlink, Murfreesboro, TN - August 22, 23rd

The two trips to TN are gonna be killer, but I'm still looking forward to them!

Looking to September, there are a couple events that are up-in-the-air for me: The Chicago Day of .NET and the Agile Summer Camp.  I'm leaning toward the Agile Summer Camp (partially because I've been asked to help with some of the organization), but I've also submitted a talk for the Chicago Day of .NET.  We'll see what happens as September gets a bit closer.  There's talk of another Ann Arbor Day of .NET in October, so I'll be blogging about that as it gets closer.


author: Michael Eaton | posted @ Monday, June 09, 2008 7:35 AM | Feedback (4)

How did you get started in software development?


Update: June 5, 2008, June 6 and again on June 7, 8, 10 - Here are my tweeps that have answered so far.

I realized recently that while I know my tweeps (twitter friends), I don't really "know" them. ;-)  I know most of them were band dorks (I love my tweeps, so hopefully they realize I'm just yanking their chains <g>) in school and some still play some kind of musical instrument.  I know some like to smoke cigars, some are vegetarians and some I know some have served in the armed forces.  I know one majored in drama and communications and some most like to drink beer.  What I don't know is how most of them got started in software development.

Ok, so here are the questions. :-)  My answers are included.  Like I said, this is mainly directed at my tweeps, but if you're a non-tweep and still feel like answering, cool. :-)  If you answer on your own blog, please link back and/or leave a comment so I know!

How old were you when you started programming?  Believe it or not, I was probably 20 (1992) before I first started programming.  Prior to that, my only experience with computers was an "exposure" class in 6th grade!  To go totally against the grain of most of my friends, I was 19 or 20 when I got my first computer (a rockin' 386sx-25 with 2mb of RAM and a 130mb drive -- yes, that's megabytes).

How did you get started in programming?  I actually got started in programming after getting completely obsessed with that rockin' 386. ;-)  I spent every waking moment learning everything I could about DOS and Windows 3.1.  I was totally into things like Stacker, Desqview and QEMM and wringing every last bit of performance out of that 386.  I spent hours and hours on local BBS's, downloading all sorts of programs and games (at the blazing speed of 2400 bit/s).  There came a point that I finally asked the sysop of one of the boards about programming because I felt the need to make the computer bend to my will.  He referred me to one of the BBS members.  I contacted him and 15+ years later, we're still really good friends. :-)  

What was your first language?  Believe it or not, my first language was probably the batch language (batch files)...if that doesn't count, then it'd definitely be qbasic.  QBasic (think edit.com from back in the day) was a trimmed down version of QuickBasic, but it was enough to get me hooked.

What was the first real program you wrote? Honestly, that was so long ago, I don't really remember.  I think my first DOS program might have been a front-end for the format command.  I know for sure my first Windows app was a replacement for progman.exe. ;-)

What languages have you used since you started programming?  qbasic, QuickBasic, Visual Basic for DOS, Borland Turbo Pascal (for DOS and Windows), Borland Delphi, perl, a tiny bit of Powerbuilder, some C, pascal (in college), a tiny bit of COBOL (in college), C# and VB.NET.  I suppose you could throw SQL in there as well.  I might have missed one or two languages, but if I did, they were probably worth forgetting.

 

What was your first professional programming gig?  My first paying gig was writing a small, silly utility for the local gas/utility company.  I don't recall what it did, I just know I got paid $200 for doing it. :-)  The cool thing is that this was probably only a few months into my programming career. ;-)  After that small contract, I scored my first actual programming job after reading a posting in some CompuServe forum (probably VB related).  Someone was looking for a developer to create some Crystal Reports for a commercial app they were developing.  I remember being soooooo nervous driving up to the interview (Northville, MI), but being so happy when I landed the job!  Of course, I ended up having a hellish time because we were working on Chicago, running beta VB4 along with beta Crystal Reports.  Yuck.

If you knew then what you know now, would you have started programming?  I'm not sure.  I've had some good times and made a lot of great friends, but damn, sometimes the pace of change makes me want to pursue my dream of playing in a rock band. :-D

If there is one thing you learned along the way that you would tell new developers, what would it be?  Don't get stuck in a cube farm. :-)  Actually, to be serious, I'd tell them to focus on communications and interacting with other people.  Programming is easy.  Working with others is a bitch. ;-)

Ok, and finally, I'll steal the question Sarah asked recently:

What's the most fun you've ever had ... programming?  I'll simply copy the comment I left on Sarah's blog - "I don't know that there's one particular moment. I find those times when I'm in the zone to be the most fun. You know...when the code flows from your fingers and you lose track of time...yea, those are the times when I have the most fun. :-)"

 


 

Tweeps that have answered so far: Sarah, John, Jeff, Josh, Rick, Nathan, Marty, Joel, Nate, Matt, Mike, Bruce, Chris, JeffH, Rob, Jennifer, Objo, Corey, Scott, Jason, Maggie, Tim.

 

 


author: Michael Eaton | posted @ Wednesday, June 04, 2008 7:58 AM | Feedback (13)

Follow-up: Continuous integration


Here are some great posts on setting up continuous integration, specifically with CruiseControl.net:

CruiseControl.Net Tutorial  - Part 1
Setting up Continuous Integration

I know several people that have been looking at Team City as a good alternative to CC.  There's also a decent article on doing CI with Team Foundation Server.

Let me know if there are any links / resources I should add to this list and I'll update this post. :-)


author: Michael Eaton | posted @ Monday, June 02, 2008 2:05 PM | Feedback (1)

When the going gets tough or, how to improve your life as a developer


A couple weeks ago when I gave my "Lessons Learned" talk at the Cleveland Day of .NET, I took some really good questions and wanted to share one here.  During my talk, someone in the audience described a pretty horrible situation at her job; a project that was behind schedule, overbudget, management won't allow proper development practices to take place and everything had to be done NOW.  Unfortunately, projects like that seem to be pretty abundant.  Anyway, her question came down to this: what could she, as an individual developer with very little power in the organization, do to improve things.

Honestly, my first response was to tell her to quit because we all have to realize that there's a point at which we can do nothing except deal with a horrible situation or find a better place to work.  For the woman that asked the question, she had no choice but to stay since she was working on some kind of visa (H1b?).  At the time, I simply told her to change what she could change.  Even the smallest things can have an impact on the larger organization.

The subject came up again at the May 22, 2008 Microsoft Developers of Southwest Michigan meeting.  Josh was talking about "worst practices" in an organization when someone in the audience asked pretty much the same question I had gotten in Cleveland.  After hearing Josh's response and having time to think about it, here's what I'd say if asked that same question again:

Things you can do

First, there's not much you can do when it comes to the budget, but you can do something about being behind schedule and using proper development practices.  You need to set the example

Be an evangelist.  Find others that share the same values as you within the organization.  Sometimes having someone else to share the burden can help.  After all, if you find others that know the importance of "doing the right thing", you won't be the lone crazy guy in the corner mumbling about his red stapler, right? ;-)

Write unit tests for your own code.  Hell, you don't even have to check them in.  Write them first, write them last, just write them!  Doing so will give you confidence that *your* code is doing what it's supposed to be doing.  When you start cranking out solid fix (or change) after solid fix (or change), other developers (or even management) will start wondering how you're doing it. ;-)  At that point, take them aside and show them the benefits of writing unit tests.  Remember, even the smallest changes can have an impact on the larger organization.

Setup your own continuous integration server.  Some people might debate this one, but I honestly believe CI works for a single developer all the way up to large teams (in fact, we discussed this on twitter a few weeks ago).  Can't get the hardware?  Use a virtual machine.  Locked down and can't install stuff on your own system?  Make friends with someone who can. ;-) 

Use source code control.  Is your employer not using source code control?  Install a local copy of subversion or git (or even Visual SourceSafe) and use it for your own changes.  Locked down and can't install stuff on your own system?  Again, make friends with someone who can.  There is absolutely no excuse to not be using some kind of source code control system.

Set milestones for yourself and stick to them, but don't be a hero.  Keep track of your tasks, your estimates and the actual time it took you to complete the task.  Use this information when you develop future estimates.

Don't let the small things get in your way.  Sometimes it's better (and easier) to ask for forgiveness than it is to ask for permission.  If you want to improve the way things are, you have to be willing to take some risks, BUT (of course there's a but)...

Dealing with the decision makers

Technically, you don't even need to tell anyone you're doing the things I described above, but if you want to make any inroads within the larger organization and make it a better place, you need to learn how to communicate with the people that are making things difficult to begin with.

Ask.  Yep.  It never hurts to ask, right? :-)  You can start off by asking if you can do some "proof-of-concept" work within your organization.  Start simple.  Ask if you can start writing unit tests.  You might be surprised at the answer you get especially if they (management) don't have to do much.  Write your tests and then ask about standing up a CI server.  If you hit some resistance, find out what the problem is and try to work around it.

Get a copy of Carnegie's "How to Win Friends and Influence People" (and read it).  As cheesy as the title is, it's actually a pretty good book that gives a lot of good advice.  It's a really quick and easy read.  There is a course that goes along with the book, but I wouldn't recommend it (bad experience when I *tried* to sit through the course about 10 years ago).

Learn how to communicate the benefits of TDD, CI, etc. in non-geek terms.  Learn how to communicate the benefits of TDD, CI, etc. in terms the decision makers will understand.  Explain how it can help the bottom-line (because that's what they care about).  Explain how it can help you write better software faster.

Be prepared to back up what you've been doing.  At some point, someone may (will) challenge you on the things you're doing.  Someone will tell you, "but this is how we've *always* developed software."  Don't back down.  Explain the benefits of what you're doing.  Point them to blogs, articles, screencasts and books on the subjects.  Show them the gains you've made and how their software has improved.

Be prepared to leave.  If you believe in what you're doing and are told to stop even after explaining the benefits in non-geek terms , you have a tough choice to make.  You can back down, crawl back to your cube and accept that your life at that company will always suck or you can move on to a company that appreciates what writing good software is all about. 

In the end

Remember, we work to live, we don't live to work.  Do what you can do to make things better.  I believe this applies to every facet of life, not just work.  Do what you can do to make things better.  Change what you can change, but be willing to stand up for what you believe in.

Special thanks to Sarah for reviewing and providing some great feedback for this post. :-)


author: Michael Eaton | posted @ Monday, June 02, 2008 8:29 AM | Feedback (9)

I will be speaking at the Lansing Day of .NET


I will be speaking at the Lansing Day of .NET on June 21st.  I'm looking forward to giving my "An Introduction to Castle ActiveRecord, or Stop Writing CRUD!" talk (which I'll be re-working a bit), seeing all my friends from Michigan, Indiana and Ohio, meeting new people and having a great time.

There is still time to register, so head over to the event site, check things out and hopefully I'll see you on June 21st!

Again, I'll repeat what I've said in previous posts:

"These are not your typical vendor-sponsored conferences with lots of marketing fluff.  Code Camps and the Days of .NET are jam-packed with technical content from top to bottom.  The talks are almost always given by local developers that have no agenda other than to help make the world of software development a better place. :-)"

Technorati Tags: ,,

author: Michael Eaton | posted @ Thursday, May 29, 2008 9:57 AM | Feedback (0)

Ann Arbor Give Camp - more info


This is a follow-up to this post.

The official website is up: http://www.annarborgivecamp.org/default.aspx

I'm registered and definitely plan on being there. :-)

Technorati Tags: ,,

author: Michael Eaton | posted @ Wednesday, May 21, 2008 11:48 AM | Feedback (0)

Virtualization for Developers


I had the opportunity to sit down with a good friend a few weeks ago (yea, I'm slow on blogging this) and catch up on work and life.  He's a busy guy so at most I might talk to him once every couple weeks on his drive home from work or we'll chat briefly via IM (or using the in-game WoW chat), but that's about it.  We must have sat and talked for almost 4 hours, covering a wide range of topics including outsourcing/offshoring, training, the community, product development along with a few other things.  One item we discussed is the idea of using virtual machines for every day work.  He and I are both surprised when we talk to developers who have either never heard of using virtual machines for development, or those who have heard of it but for whatever reason, choose not to take advantage of it.

Reasons why

Anyone that's ever built up their own development machine knows that it takes forever (or at least feels like it).  Between installing and configuring the OS, Office, developer tools and all the little utilities that make our lives easier, it can easily take a day or more to get a new computer to a point at which we can be productive.  As a consultant, I deal with a variety of clients, each with their own environment. Some are still on .NET 1.1, some are on 2.0, some don’t care (which means whatever is newest), one even has me doing some maintenance work on an old VB6 application and I had a client last year that wanted me to work with a 3rd party CMS product that I'd never heard of.  Since I also like to keep up with some of the cool betas coming out of Microsoft, trying to keep a stable development environment would be next to impossible without the heavy use of virtual machines.

For the last couple of years, instead of cluttering up my primary development machine (my laptop) with various versions of my dev tools, I’ve been using virtual machines to do all of my software development work. When my laptop died in January, I was able to continue working from my desktop machine without having to do anything other than fire up a remote desktop session to connect to one of my many VMs and I was good-to-go.

How I do it

While I know some people love VMWare, I’ve been a big fan of Microsoft Virtual PC and Virtual Server for a few years. Virtual PC is nice for those times when I need to take a VM with me such as speaking at an event or user group, but for the most part, I have a nice beefy server that runs Virtual Server. I currently have seven virtual machines on my server with four running at any given time. My laptop is nothing more than a tool to run Office 2007, my IM client, my twitter client, connect to my VMs using remote desktop and of course, play World of Warcraft. ;-) 

In the whole scheme of things, my server isn't anything special.  In fact, it's a home-built AMD Athlon 64 X2 3800+ with 4GB of RAM running Windows 2003 server.  It's currently got something like 500GB of drive space.  Not only do I run Virtual Server on that system, but I also run Sharepoint, my internal subversion repositories and it's where all our mp3s and pictures live.  To be honest though, up until recently, the mp3s all lived on an old Shuttle box I had laying around.  Even with all of that running on the server, the performance of my VMs isn't bad at all.  In fact, my biggest complaint about working this way is that sometimes the display can suck - for example, if I'm working on a Silverlight app, but that's easy enough to get around.

When I made the decision to start using VMs, I started out with a single Windows XP/sp2 installation that I created using Virtual PC. Before backing that VM up, I made sure all my common utilities were installed including BGInfo from sysinternals, a decent zip utility, FileZilla, GViM and Reflector.  Once I had that base image working, I backed it up. Using a copy of that base VM, I created my first "working" VM.  I installed Visual Studio, SQL Express and tortoisesvn.  Once I had the specific version of those tools I needed installed, I backed that VM up as well.  Keep in mind, going this route requires a lot of disk space, but hey, disk space is cheap, right?  Most virtualization software allows you to reduce the amount of disk space by using "differencing" disks.  This means you start with a base image and new VMs based on that image are only the differences between the base.  I've heard good and bad things about this approach.  The bad includes breaking all your images IF you happen to make a change to the base image *after* you've created new images based on it.

When a new client comes on-board, it's easy enough to copy one of my "base" VMs, rename it and fire it up.  I love being able to work on a client project without affecting any other work I'm doing.  I can easily copy a VM to my laptop if I need to go onsite and I can easily blow away a VM if it becomes unstable.

I know of a few other developers who have gone the virtual route and are from what I've heard, they love it.  What do you think?  Do you have experience developing in VMs?  Do you love it or hate it?  Let me know!


author: Michael Eaton | posted @ Monday, May 19, 2008 10:04 AM | Feedback (12)

Cleveland Day of .NET wrap-up


Here are some photos I took

Pre-Event

After a pretty uneventful 3.5 hour drive to Cleveland, I arrived at the hotel around 6pm.  As I was getting my stuff out of the car, I met up with John Stockton.  John and I have followed each other on twitter for a few months, so it was great to finally meet him in person (common theme at tech events these days). ;-)

Walking into the hotel we immediately ran into Dan Hounshell, Joe Wirtley, Justin Kohnen, Leon Gersing, Alan Stevens and Joe O'Brien.  After a quick check-in, we dropped stuff off in our rooms and headed to the hotel bar where we spent some time folding the PocketMod schedules for the event.  Some of us started a mini assembly line to make things a bit easier.  By the time we left the hotel bar to get some food, we must have had 20 (me, Dan, Justin, Leon, John, Mike Slade, Joe O'Brien, Joe Wirtley, Maggie Longshore, Joe Fiorini, Alan, Corey Haines, Michael Letterle, James Bender, Amanda Laucher, Dave Redding, Dan Hibbits and I'm sure a few more that I didn't catch in my pictures)  people folding the schedules.  Sarah bailed on us due to some swag-related issues - LAME!

BTW, I'm not sure what's up lately, but between Grand Rapids and Cleveland, I have had exactly ONE decently mixed Jack and Coke. :-\  The hotel bartender did a horrible job, and at $7 per drink, I wasn't about to waste money on a second.  Instead of eating at the hotel, we all decided it'd be cheaper to go somewhere else, so dinner on Friday night was at a Red Robin.  The service kinda sucked and the food was good enough, but I can honestly say the conversation rocked. :-)  At some point, Chris Woodruff called to let me know he was at the hotel, but by that time, we were all heading back.

I learned my lesson last week at the West Michigan Day of .NET (so did Dan), so instead of taking off for a night of partying and karaoke with everyone else, we hung out in the hotel room, watched the Cleveland/Boston game and talked (BTW, what the hell was up with Boston taking it to game 7?).  At one point, we did join Jennifer Griffin and Maggie Longshore at the hotel bar for a few minutes.  I can say for sure that I was back in the room and asleep by 12:30. :-)

The Event

I was up, showered and out the door by 7am to see if I could help Sarah and crew setup for the event.  I ran into John and Mike Slade and got a quick tour of where the event would be held.  It wasn't too long before Sarah and her husband arrived with all the swag, so John, Mike and I helped bring in box after box of swag.  After unloading the swag, I headed back up to my room to see how Justin, Dan and Leon were doing.  Since we were all speaking at the event, we made a beeline to the speakers room - Nate Kohari was already there, so we introduced ourselves and then settled in for the day.  I'm pretty sure that sometime during that first session Jason Follas showed up along with Brian Prince, Brian Gorbett, Rich Broida and a few other speakers.

I wanted to make it to objo's "Why Ruby?" session, but got caught up with the goings-on in the speakers room and didn't make it.  During the second session, I wandered between rooms and snapped some pictures.  The simple fact of the matter is I couldn't decide which one to go to...3 friends speaking at the same time made it tough to decide even though I've already seen 2 of the sessions at previous events (Dan's SEO talk and Alan's TDD/MVC talk).  For the third session, almost all of us packed into Nate Kohari's talk on dependency injection.  Almost all of us have been following Nate on twitter, but this was our first time seeing him speak and it was on a topic we were all interested in!  He did a fantastic job during his talk and definitely has me interested in taking a look at his DI framework (Ninject).

Unfortunately lunch wasn't provided for the attendees -- turns out the hotel catering was just too expensive for the organizers to deal with. :-\  That was a bummer and I'm sure it pissed off a few of the attendees.  The organizers were nice enough to provide lunch for the speakers though.  I couldn't help but feel a bit guilty, but at the same time, I sat at a table with Alan, Chris and Jason Follas. :-)

My Session

My "Lessons Learned" session was immediately after lunch.  I was worried about being in the "big" room, but I ended up having a packed house.  I think I counted 35.  This is the second time I've done this particular presentation and to be perfectly honest, I think I'm gonna pull it from the rotation and re-work it.  I've gotten a lot of great feedback from people about the session and I love to hear people tell me how much they enjoyed it, but I'm not happy with it yet.  I feel like I ramble on too much.  I also need to re-work the abstract a bit.  Of course, I'm probably the biggest critic of my work whether it's code, writing or speaking, so we'll see how it goes.  I did end up blasting through the slide deck in about 40 minutes, so the final 20 minutes was spent taking questions from the audience.  After my session, I went back to the speakers room to decompress a bit.

The Final Sessions

I skipped the 5th session, but a bunch of us ended up in Sarah's "IronPython" talk at the end of the day.  In fact, a few of us sat in the front row and tried to heckle her.  I snagged a few "photoshoppable" pictures during the 30 minutes she talked.  Overall, it was a good talk, but since I'm not a big Monty Python fan, I didn't get some of the jokes. :-)

Dinner

The event organizers treated all the speakers to dinner at P.F. Changs!  Mmmmmm.....good stuff.  We had some great conversations at my table - I was sitting next to Nate Kohari, Alan Stevens and Brian Prince.  Once again: good food and great conversation!

I ended up heading home around 8:30.  To be totally honest, I was really emotional when I left.  I've been hanging out with the same group of people (for the most part) every weekend for the past couple of months and it was sad to say goodbye again.  These are the people I *want* to hang out with.  Almost all of them (in fact...I'm pretty sure it is all of them) are on twitter, so we're always in contact, but still...it was hard to say goodbye. 

I'm not sure I can say it much better than Alan....

"Beyond all the productivity, entertainment and publicity benefits of twitter lies this fact: I love the people in my Twitter Tribe. If you're uncomfortable with the "L Word", then please accept that I feel emotionally connected to them, even if I've never met them. When I do meet people after following them on Twitter, I have an urge to hug them like a reunited friend."

Overall

Overall, the event was pretty cool.  As a speaker, I did feel a bit disconnected from the attendees, mainly because there was no common area to hang out in.  The rooms were all down a single, narrow hallway in the hotel and everytime a group started to talk, some hotel staffer would come rolling down the hall with a cart and break things up.  Also, it didn't help that there was some kind of freakish doll-related meeting across from one of the rooms.  I don't know that I'd have it at that hotel again, but I'm pretty sure the organizers feel the same way. 

Beyond the venue-related complaints, I'm glad I made the trip and I'll definitely go next year if they do it again! 

Thanks!

Huge thanks go out to Sarah, MikeL, MikeS, Corey, Sam, JoeF and John for putting on such a great event!  Thanks to the sponsors (Microsoft, Bennett Adelson, 4TechWork, Hyland Software, Lazorpoint, Exential, Beacon Hill Staffing Group, TEKSystems, Sogeti, Robert Half Technology, PreEmptive Solutions, RedGate, JetBrains, Wrox/Wiley, and InformIT.com/Pearson Education) for helping make this event a reality!

 

Technorati Tags: ,,

author: Michael Eaton | posted @ Sunday, May 18, 2008 11:05 PM | Feedback (4)

Jennifer Marsman: geek, developer evangelist and blogger


While attending the Central Ohio Day of .NET a few weeks ago, Josh Holmes introduced me to Jennifer Marsman, one of the community-focused Developer Evangelists for the Heartland District.  Jennifer works with Josh (RIA Architect Evangelist), Jeff Blankenburg (Developer Evangelist) and Brian Prince (Architect Evangelist).  If you're not familiar with what a Microsoft evangelist is, check out this great post from Sarah.

As Jennifer points out in her "who am I" post, she has a broad range of experience and in the last year has jumped into many of the new tools and technologies coming out of Redmond including  "the Windows Presentation Foundation (WPF), the Windows Communication Foundation (WCF), Windows Workflow, Visual Studio Tools for Office (VSTO), ClickOnce, development on Windows Vista, Silverlight, the .NET Framework 3.5, and Visual Studio 2008.

Before jumping into an evangelism role, she worked on the Microsoft campus in Redmond:  "My team’s goal was to map a computer user’s intent to an action that the computer can perform, beginning with the search and help domain.  To do this, we utilized machine learning techniques (Naïve Bayes and Decision Tree classifiers).  I personally designed the algorithms that determine the user's intent from the data we collected, which earned me two patents. "

How cool is that?  Of course, if after reading that you're not convinced she's a geek, in 2007 she did a few episodes of CodeToLive on the XNA gaming framework (Part 1, Part 2, Part 3, Part 4)!  I was recently reminded that she was the one who shaved Josh's head at the first CodeMash conference in 2007 (another video here). :-)

Jennifer is organizing the upcoming GiveCamp that I blogged about a couple days ago.  If you want to get involved in this very cool event, let her know!  As I said in my post, I plan on being there and hope to see plenty of my friends there as well.  What a great opportunity to hang out with smart people, write code and help others in the process.

While she hasn't been blogging for very long, the one thing that really stands out about her blog is the "Featured Women in Technology" series she started in April.  Since Jennifer started the series last month, she has already highlighted four women including Carey Payette, the president of the Central Ohio .NET Developers Group.  Carey was instrumental in putting together the recent Central Ohio Day of .NET and also gave a talk on "Getting Started With IronRuby, the DLR and Silverlight" at the event.

Anyway, this post started because I really enjoy Jennifer's blog and especially the "Featured Women" posts and wanted to let people know.  If you're not already subscribed, you should do it now. :-)

Technorati Tags: ,,

author: Michael Eaton | posted @ Wednesday, May 14, 2008 9:51 AM | Feedback (3)

Wrestling with WCF


A few days ago, I was working on LightReader, trying to nail down some features before the West Michigan Day of .NET.  I ended up spending a few hours chasing down a WCF issue and wanted to write about it in hopes it will help others. :-)

The error I was seeing was:

"An exception of type 'System.ServiceModel.ProtocolException' occurred in System.ServiceModel.dll but was not handled in user code

Additional information: The remote server returned an unexpected response: (404) Not Found."

Not very helpful is it?

The particular functionality I was working on involved importing an OPML file.  This turned out to be one of those classic examples of having passing unit tests, but a big failure when running the application (or integration tests).  The method I was working on has this signature:

List<Feed> ImportOPML(string opmlContents);

 

BTW, the application is being developed using TDD, so let's review that process: write a test that fails, add just enough code to get that test to pass, refactor.  Red, Green, Refactor!

After selecting the OPML file to import, I pull the contents into a string variable and then call LightReaderService.ImportOPML to save the feeds to the database.  The ImportOPML method uses a 3rd party library - the Argotic Syndication Framework - to parse the OPML so once the data is loaded, I simply iterate through the "outlines", persist and then return the imported feeds in List<Feed>.

 

   1:  private void importOPMLButton_Click(object sender, RoutedEventArgs e)
   2:  {
   3:      OpenFileDialog dlg = new OpenFileDialog();
   4:      dlg.Filter = "OPML Files (*.opml)|*.opml";
   5:      if (dlg.ShowDialog() == DialogResult.OK)
   6:      {
   7:          using (StreamReader reader = dlg.SelectedFile.OpenText())
   8:          {
   9:              string opmlContents = reader.ReadToEnd();
  10:              if (opmlContents.Length > 0)
  11:              {
  12:                  _lightReaderServiceProxy.ImportOPMLAsync(opmlContents);
  13:              }
  14:          }
  15:      }
  16:  }

Easy enough, right?

It worked in the context of my unit test, but as soon as I fired up LightReader and selected a "real" OPML file, things went straight to hell and I started receiving the error I described at the top of this post.  Being a relative noob to WCF, I ended up googling for more information on that error.  I quickly found out that I would need to turn on logging for WCF since it is turned off by default for WCF.  Bummer.  Luckily I found a blog post that helped me configure things so I could get more detail about what was happening.  Of course that post talked about using the "Service Trace Viewer" (SvcTraceViewer.exe), but didn't say where to get it.  After some searching, I found that it's in the Windows SDK along with the service configuration utility.  Thank God I had the SDK installed because otherwise it's a 1+ GB download (iso). :-)

After modifying my config file to include the sections for logging, I fired up LightReader, opened my OPML file and watched the exception pop up.  Opening the log filen that was generated gave me this extended error:

"The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:opmlContents. The InnerException message was 'There was an error deserializing the object of type System.String. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 57, position 166.'.  Please see InnerException for more details."

Huh?  I had already set the readerQuotas in my config file because of another issue I had early on in the development.  I originally modified these values because I was unable to return the contents of a full feed back to my client.  In this case, the error above was being caused because I was trying to send the opmlContents string to the service, but it was larger than 8192 bytes.

Anyway, here is what the config section looked like:

<readerQuotas maxDepth="32"
    maxStringContentLength="2147483647"
    maxArrayLength="2147483647"
    maxBytesPerRead="4096"
    maxNameTableCharCount="4096" />

I also had the following code in the client portion of my app:

   1:  BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);            
   2:  binding.MaxBufferSize = Int32.MaxValue;
   3:  binding.MaxReceivedMessageSize = Int32.MaxValue;            
   4:   
   5:  EndpointAddress address = new EndpointAddress(http://<host>/LightReaderService.svc);

Note: As I continue in the development of LightReader, I'll probably tweak those "max" values to something more reasonable than Int32.MaxValue.  The same goes for the values in my config file. :-)

Because I knew I had already changed those values in my config file (AND in code), I became fixated on the "XMLDictionaryReaderQuotas" and spent at least an hour surfing, trying to figure out how in the hell to set the value.  None of the solutions I found seemed to apply to my situation so I kept looking.  I even posted on twitter at one point.  As luck would have it, the "XMLDictionaryReaderQuotas" had nothing to do with it because the error was related to the configuration.

 

Here is my complete (before I fixed it) system.ServiceModel section from my config file.  Can ya spot the problem? 

   1:    <system.serviceModel>
   2:      <diagnostics>
   3:        <messageLogging logEntireMessage="true" logMalformedMessages="true"
   4:          logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true"
   5:          maxMessagesToLog="3000" maxSizeOfMessageToLog="2000" />
   6:      </diagnostics>    
   7:      <services>
   8:        <service behaviorConfiguration="LightReaderServiceBehavior" name="LightReader.Business.Services.LightReaderService">
   9:          <endpoint address="" binding="basicHttpBinding" contract="LightReader.Business.Services.Contracts.ILightReaderService">
  10:            <identity>
  11:              <dns value="localhost" />
  12:            </identity>
  13:          </endpoint>
  14:          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  15:        </service>
  16:        <service behaviorConfiguration="UserServiceBehavior" name="LightReader.Business.Services.UserService">
  17:          <endpoint address="" binding="basicHttpBinding" contract="LightReader.Business.Services.Contracts.IUserService">
  18:            <identity>
  19:              <dns value="localhost" />
  20:            </identity>
  21:          </endpoint>
  22:          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  23:        </service>
  24:      </services>
  25:      <behaviors>
  26:        <serviceBehaviors>
  27:          <behavior name="LightReaderServiceBehavior">
  28:            <serviceMetadata httpGetEnabled="true" />
  29:            <serviceDebug includeExceptionDetailInFaults="false" />
  30:          </behavior>
  31:          <behavior name="UserServiceBehavior">
  32:            <serviceMetadata httpGetEnabled="true" />
  33:            <serviceDebug includeExceptionDetailInFaults="false" />
  34:          </behavior>        
  35:        </serviceBehaviors>
  36:      </behaviors>
  37:   
  38:      <bindings>      
  39:        <basicHttpBinding>        
  40:          <binding name="basicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00"
  41:            receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false"
  42:            hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647"
  43:            maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
  44:            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
  45:            useDefaultWebProxy="true">
  46:            <readerQuotas maxDepth="32"
  47:           maxStringContentLength="2147483647"
  48:           maxArrayLength="2147483647"
  49:           maxBytesPerRead="4096"
  50:           maxNameTableCharCount="4096" />
  51:          </binding>
  52:        </basicHttpBinding>
  53:      </bindings>    
  54:    </system.serviceModel>  


Did you find the problem?  I made the same error that the guy who posted the last reply in this forum thread.  It took a long time before I realized what I was missing and that was only after I stared at that forum post for way too long.  In my opinion, this was angle brackets for the loss. 

Line 9 should look like this:

<endpoint bindingConfiguration="basicHttpBinding" address="" binding="basicHttpBinding" contract="LightReader.Business.Services.Contracts.ILightReaderService">

Ugh.  Several hours wasted because I didn't specify the bindingConfiguration!  Honestly, I kinda thought that by specifying the binding that it'd pick up all the configuration information that was needed.  I ASSUMEd incorrectly. ;-)  Like I said, I'm a WCF noob, but it would have been nice if the error had said, oh I don't know, something like "missing configuration information" or "bindingConfiguration not set".

I should mention that within a minute or so of me figuring out the issue, Joe Wirtley came through with a link related to my issue. :-)  BTW, I twittered my victory.

Technorati Tags: ,,

author: Michael Eaton | posted @ Monday, May 12, 2008 1:50 PM | Feedback (2)

GiveCamp - July 11, 12 and 13th in Ann Arbor


At the recent West Michigan Day of .NET, Jennifer Marsman and Josh Holmes both talked about an event coming up this July 11, 12 and 13th in Ann Arbor (and Houston too I think).

"GiveCamp is a developer program designed to allow developers, designers, DBAs and web enthusiasts to donate their time and talent to developing applications for charities."

While the website looks like it's lacking in some content, the plan is for the organizers to line up several charities, find out what they need done, scope those projects to a couple of days and then assign them to developers over the weekend!  I think this is a fantastic idea and plan on being there in July!

Technorati Tags: ,

author: Michael Eaton | posted @ Monday, May 12, 2008 10:43 AM | Feedback (0)

West Michigan Day of .NET wrap-up


I had a great time at the West Michigan Day of .NET

Friday Night

After snagging a ride with Dan, Joe and Justin on their way through Coldwater, we arrived in Grand Rapids just after 7pm Friday night.  We spent a few minutes getting settled into our hotel rooms and then made our way across the street to meet everyone else for dinner.  We ended up being among the first to arrive, so we spent a few minutes catching up with Josh Holmes, Wally McClure and Dan Hibbitts while the staff prepared the tables.  It didn't take long before people started showing up.  In the end I think there were around 20 people at dinner (me, Joe, Justin, Dan, Chris Woodruff, Josh, Dan, Wally, Amanda Laucher, Steven Harman, Tim Wingfield, James Bender, Dave Redding, Scott Zisherk, Dean Weber, Jeff McWherter, and a few other people -- sorry if I didn't include you).  It was a good time, but to be honest, the food sucked and the bartender couldn't mix a decent Jack and Coke to save his life. :-\  I did catch Steven Harman in one of his more feminine moments -- consuming some kind of pink, mildly alcoholic beverage out of a tall glass with an umbrella.  :-)

Around 10:30 or so, about 10 of us headed back to the hotel in hopes of making the hotel bar our home for a couple hours.  I swear, we walked into the *hotel* bar around 10:45 or so and they were closing!  We managed to sneak one round in before moving on.  It was awesome listening to Steven Harman school everyone on git. :-)  After the bar kicked us out, we wandered around looking for another place to hang out.  Unfortunately, there wasn't much within walking distance except a Meijer so we ended up picking up some refreshments, walking back to the hotel and hanging out in Dan and Justin's room (outside on the patio actually).  I finally went to bed around 2am, but didn't sleep very well.  I think some of the guys stayed up until after 3!

The Event

Dan, Joe, Justin and I were out the door around 7:45 since Joe was speaking (Pragmatic Software Architecture and the Role of the Architect) in the first session.  After dropping Joe off and grabbing some breakfast, the 3 of us registered and then made our way to the speakers room where we were greeted by Joel Ross.  I actually missed the first two sessions because I was busy (well, I tried at least) putting some last minute tweaks in my slides and code.  I had planned on doing that the night before, but....well, I didn't make the time. ;-)  I'm a bit bummed because I wanted to see Joel's "Continuous Integration: What, Why and How" talk.  Josh Holmes gave me a sneak peak of his slides Friday afternoon, so I really wanted to see his "How to architect Rich Internet Applications" talk as well.  Ugh.  New rule for Mike: limit the partying the night before an event. ;-)

My "LightReader: The anatomy of a Silverlight application" talk was up against Dave Redding's "The C# Variety Show" talk and Jeff McWherter's "ASP.NET Performance and Optimization" session, but I still had a full room.  In fact, every seat was filled and there were probably 4-5 sitting on the floor.  I was happy to see several of my friends in the audience.  Overall, I think my talk went pretty well considering the previous night's activities.  As I told the audience, LightReader is my tool for learning both Silverlight and WCF so much of my talk involved discussing the cons of working with a beta 1 product.  The app itself is still pretty immature, but hopefully I was able to get some people thinking about using Silverlight and WCF.

I spent lunch in the speaker room and then headed out with Josh and my friend Chris for some Chinese food. :-) 

I volunteered to videotape Steven's "A trip around the block with Rhino.Mocks" since I wanted to see his session anyway.  It was a really good discussion, but it didn't really convince me to switch from Moq to Rhino.Mocks. :-)  I did get a few minutes with Steven after his session to talk about how I was using Moq in the LightReader project.  I would love to spend a day (more more) working with Steve because he is one of those truly "scary" smart people plus he's funny as hell. 

I spent the last session hanging out in the speakers room.  The speakers room was packed with super-smart people all day (everyone I mentioned above PLUS Jennifer Marsman, Jay Wren and Dan Rigsby - Dan, BTW, drove up from Indianapolis!) and I hated to leave (as you can probably tell). :-)  At one point during the day, we even tried to get Alan Stevens on ooVoo, but the connection at the event kinda sucked so it didn't last long.

At the end-of-event giveaways I scored a geek mug AND Expression Studio!  I really wanted CodeRush w/Refactor Pro, but oh well.  Maybe next time.  I'm pretty sure the copy of Expression Studio is the old version and not the one that was just released.  I'm a bit bummed about that...but again, it was free so who am I to complain, right? :-)

By this time, I was completely exhausted so I skipped out on the after party.  I caught a ride back to Coldwater with my friend Chris.  We stopped for dinner in Lansing, but finally made it home around 8:30.  During the course of the day I picked up a few new twitter followers which I thought was very cool. :-)

As I said earlier, I had a great time and it was good to see everyone again.  During the course of the day I met Bruce Abernathy and, after some searching, I found Matt Blodgett.  Matt and I have been twittering for a few months so it was great to finally meet him. :-)  I also ran into a former co-worker (Pradeep) at the end of the day.

Next Saturday: The Cleveland Day of .NET!

Technorati Tags: ,,

author: Michael Eaton | posted @ Sunday, May 11, 2008 8:42 PM | Feedback (1)

Indy Code Camp wrap-up


I made the 2 1/2 hour drive down to Indianapolis Saturday morning for the Indy Code Camp.  I arrived about 8:30 and after registering, made my way to the speaker table where I found Dan Rigsby, Aaron Lerch, Jeff Moser, Dan Hounshell, Mike Wood and Joe Wirtley.  I eventually ran into Jeff McWherter and Jennifer Griffin (not a speaker, but a twitter peep).

The sessions

While I've seen his slide deck before, I finally got the chance to see Dan give his "SEO for ASP.NET Developers" talk and really enjoyed it.  SEO is really not something most developers think about and Dan is doing a good job of telling developers why it's important as well as discussing the things we can do to make our sites rise to the top of the search engines.  Because they were scheduled at the same time, I had to miss Joe's "WPF for Developers" talk, but hopefully I'll get to see it at an upcoming event.

After Dan's talk, it was time for my first session of the day.  Overall, I think my "Introduction to Castle ActiveRecord, or Stop Writing CRUD!" talk went pretty well.  The room layout was funky and I felt a bit disconnected during my code demos, but overall, I had some really good questions thrown at me and hope at least a few people walked away wanting to check out ActiveRecord.

After eating some pizza (thank God it wasn't box lunches), Dan, Joe, Mike, Jeff, Alan and I hung out and talked until Alan's first session started.  He delivered a great introduction to MVC.NET and TDD.  In fact, as his session ended and he was describing what was to come in his second session, I wished I could have bailed out of my "Lessons Learned" talk to attend. :-)

I was really surprised to see 20-25 people in my "Ouch that hurt!  Lessons learned from an agile project" session. :-)  This was my first time delivering this particular talk, but it was based on my "Lessons Learned" blog posts from last summer.  There was some difficulty with the video camera at the beginning of the session, so the first 5-10 minutes didn't make it to tape, but overall, the talk went pretty well.  I did feel like I rambled on a bit more than I should have so I'll be re-working things a bit before I give it again in Cleveland. :-)  I did get a very nice message on twitter after the session letting me know I did a good job and I also had someone tell me it was the best session he attended all day!

I skipped out on the final session to sit at the speakers table and BS with a bunch of the speakers.

Highlights

While I enjoyed the whole day, I think the highlight was finally meeting Alan Stevens in person.  We've followed each other on twitter for quite some time and even IM'd once or twice, but to sit and talk to him both during and after the event was a real treat. :-)  Alan is a great guy and excellent speaker...very dynamic, engaging and humorous.  If you get a chance to see him speak, do it.  I guarantee you won't be disappointed.

I really have to thank Dan for sucking it up and sitting through both my sessions to video tape them for me. :-)  I know you really wanted to see Alan's second session, but I really do appreciate it.  :-)  I owe you a beer when we're in Grand Rapids in a couple of weeks!

I actually won a licensed copy of VisualSVN and can't wait to check it out.  I almost never win anything at these events (unlike Joe Wirtley) and was glad to hear my name called. :-) 

While I wasn't looking forward to driving home in the dark, it's hard to pass up hanging out with really smart people over dinner and drinks, so I decided to go to the after-party for a while.  Someone actually blogged about it while we were there. ;-)  Gotta love geeks.

I'm not sure how many people showed up for the event, but the guys from Indy did a great job.  Hopefully there will be enough demand to do it again next year.  If so, I'll definitely be there!

Technorati Tags: ,

author: Michael Eaton | posted @ Sunday, April 27, 2008 8:45 PM | Feedback (4)

I will be speaking at the Cleveland Day of .NET


I will be speaking at the Cleveland Day of .NET on May 17.  I'm looking forward to giving my "Ouch that hurt! Lessons learned from an agile project" talk, seeing all my friends from Ohio, meeting new people and having a great time.

Here is the abstract for my talk:

"Ever been on a project where everything that could go wrong did? Successful projects are great, but some of the best and most valuable lessons are learned from our failures. In this talk, Michael Eaton will lay it all on the line and discuss the mistakes he made and the lessons he learned on an agile project where Murphy's Law was in full effect."

There is still time to register, so head over to the event site, check things out and hopefully I'll see you on May 17th!

Again, I'll repeat what I've said in previous posts:

"These are not your typical vendor-sponsored conferences with lots of marketing fluff.  Code Camps and the Days of .NET are jam-packed with technical content from top to bottom.  The talks are almost always given by local developers that have no agenda other than to help make the world of software development a better place. :-)"

Technorati Tags: ,

author: Michael Eaton | posted @ Friday, April 25, 2008 3:27 PM | Feedback (0)

Central Ohio Day of .NET - slide deck and demo code


Since I don't know when these files will be posted to the event site, I figured I'd upload them myself for anyone that wants to check them out.  I changed my "about me" slide mainly because it won't make sense to those that weren't at the event. :-)

Direct link: http://cid-48cfa414dd0408f7.skydrive.live.com/self.aspx/Public/Presentations/Central%20Ohio%20Day%20of%20.NET%20%7C52008%7C6

Technorati Tags: ,,

author: Michael Eaton | posted @ Wednes