Sunday, November 19, 2006
Tragic News
Saturday, October 28, 2006
Heartland Developers Conference 2006
I've been in Omaha for the last couple days at the Heartland Developers Conference. It was a great opportunity to catch up with a bunch of people.
It was nice to see Jeff Brand again. With his new responsibilites at Microsoft, Jeff doesn't make it down to Des Moines to hang out.
I also ran into Dru Sellers. I first met Dru a couple weeks earlier at Tulsa Tech Fest. Dru does PodcastStudio.net with Jeff Julian. Thursday afternoon after our presentation, Nick Parker and I sat down and did our first podcast with them. It will be released sometime over the next few months. It was a good interview and Dru and Jeff did a great job at keeping the conversation flowing.
We had a good time Thursday night after the first day of sessions. Nick Parker, Matt Ring, Mike Vesey, Ken Sherman, Dave Havenridge, Phil Stanislav, and Matt Milner had dinner at Omaha Prime in the Old Market. The steaks were great, but I'm still searching for a shrimp cocktail that compares to St. Elmo's in Indianapolis, IN.
It was fun and I can't wait to do it again next year!
Sunday, October 22, 2006
Agile Workspaces: Microsoft's Patterns & Practices Team
As most of you know, I'm very interested (read:fanatic) in agile development and have been disappointed with the lack of leadership from Microsoft in the agile space. However it appears that the Patterns & Practices team is starting to effect the development culture at Redmond.
In this video, Ed Jezierski and Peter Provost give a guided tour around their newly renovated agile development workspace.
Multiple sized reconfigurable team rooms - Lots of whiteboard space, each room has an overhead projector and multiple flat screen monitors at each workstation. Most of the team's daily work occurs in the team rooms, but every team member has an office space (shared or individual based on job function and preferences).
Escape Pods - Private small meeting rooms where developers can "escape" to make phone calls or hold small private meetings.
Modular interior office walls - The walls can be moved without a building permit.
Customer Room - Customers are top priority and have their own meeting room.
And the coolest....
Whiteboard Windows - A white film sandwiched between two 8 ft. tall glass panels used to seperate rooms and can be used as whiteboards on both sides. Very cool and practical.
Has your team modified it's workspace to make the team more effective? Let me know, I love this stuff!
Sunday, September 3, 2006
Dear SourceSafe, I've found another
Dear SourceSafe,
We've been together so long and during that time we've been comfortable together, but not safe. During our time together, I've learned about your quirks. I admit then we first got together, I made some mistakes. I can't blame you for everything. But as we spent more time together, I discovered things about you that were harder to overlook. You don't have atomic check-in, you exclusively locked files, and it takes you forever to check-in, check-out, and create history reports. Through all this, I stuck with you.
Our relationship has gotten so bad that when you're not around, my friends and I make jokes about you. We use hurtful names for you like "Source Unsafe" or "Sour Safe". This isn't fair to you and I feel awful about it, because I know how insecure you are.
I have to be honest with you, I've been thinking about someone else, Subversion (SVN). Subversion is different from you and that's a little scary, a little exciting, but from the little amount of time that we've spent together...it just feels right. You know what I mean? I'm sorry, but never got that feeling with you.
I know we'll continue to run into each other for years to come and I'd like to remain friends, but I think it's best if we spent some time apart for awhile.
Sincerely,
Tim
P.S. If your interested in learning more about Subversion and how to install it on a Windows system. Please refer to these links.
If you're planning on using Apache Web Server, the SVN module doesn't work with the latest version (2.2.x). Use version 2.0.54 (at the time of this writting).
http://geekswithblogs.net/emanish/archive/2006/06/14/81905.aspx
http://blog.briankohrs.com/2005/09/20/guide-to-installing-the-subverison-http-module-on-windows/
http://www.subversionary.org/howto/setting-up-a-server-on-windows
Sunday, August 27, 2006
Object-Oriented Overview and Shared vs Instance Methods
'Constructor
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub'Fields
Public FirstName As String
Public LastName As String'Instance Method
Public Function DisplayName() As String
Return String.Format("{0}, {1}", Me.LastName, Me.FirstName)
End Function'Shared Functions
Public Shared Function Steve() As Person
Return New Person("Steve", "Person")
End FunctionPublic Shared Function Tim() As Person
Return New Person("Tim", "Person")
End FunctionEnd Class
Private myPerson As Person = New Person
Monday, June 19, 2006
IIS looses changes after restart
Mike Phelps sent this tip around to our team a couple weeks ago. I've experienced this problem and never put all the pieces before. Not it makes perfect sense. Now if I coule get him to start his own blog ;)
IIS runs strictly from memory (i.e, the IIS metabase is loaded to RAM). If you make changes to IIS, they are only made in memory. The changes don't actually stick until IIS writes to disk. This can occur with safely shutting down windows, or restarting IIS without a timeout/clicking End Now.
Want to see for yourself?
1) Go to properties of the DataPortal web site, and change the anonymous credentials to be your user.
2) Close the IIS control panel.
3) Start/Run iisreset /timeout:0
A)This forces IIS to shut down, without saving to disk. The wait time is used to persist to disk.
4) Check the user you changed in #1. It will be back to the original user.
The point: Be wary of using the timeout option when you've made metabase changes.
Saturday, May 20, 2006
Agile Pep Talk
I had the opportunity to spend lunch with Matt Ring last week. He contacted me via my blog (Someone reads it!). He needed an "agile pep talk". He's on the right track and hopefully I gave him a couple practical tips he could use as soon as he got back to the office.
If you need an "agile pep talk" or have some general questions on how to implement agile practices on your projects, feel free to contact me and we can grab some lunch and chat. Or for those of you don't eat, you can find me at every Agile Iowa and Iowa .NET User Group meeting.
Thursday, May 18, 2006
Tracking Manual Tests with FitNesse
Our team has been working with FitNesse for a couple months and I believe we are getting over the learning "hump". A question came up today and I think we came up with a good solution and I wanted to share it with others who may be in transition period with FitNesse.
We aren't able to create FitNesse tests for all the functionality within the system so we do have some manual tests we need to verify are working. We need to track the manual tests within FitNesse so naturally we created a fixture!
Our "manual test" fixture contains 2 columns: Description and Passed. Description contains the manual test case and Passed contains the DATE the test passed. Entering the date allows us to track the last time the test passed. The fixture also takes a parameter for the number of days between manual tests.
!|Run Manual Tests Every|90|Days|
|Description|Passed|
|Do some manual test|5/18/2006|
When the fixture runs, it checks if the manual tests have passed within the configured time period. If not it will throw an error and provide visibly to aging manual test results.
Manual tests are not the ideal solution, however, by tracking the manual tests and their age we can provide a stop gap solution while teams are working to automate their user acceptance tests. It also gets the non-technical team members familiar with FitNesse syntax and hopefully prepare them to speak in the language of "FitNesse".
Have you or your team created a custom fixture to solve a problem? Please leave a comment and let me know.
NOTE: My blog is junk! If the human interface proof image doesn't show up, remove "#feedback" from the URL.
Sunday, April 2, 2006
Rocky's comments on Test Driven Development
There is fued of sorts between the TDD crowd and Rocky Lhotka. I guess someone forgot to warn Rocky about the TDD crowd. This is the same community that got Microsoft to remove an article about TDD and VS 2005 that was on MDSN...briefly.
Rocky made some comments during a recent episode of DotNetRocks and Jeffery Palermo had some comments to which Rocky responded.
This is very interesting to me because we are using Rocky's .NET Business framework and trying to apply TDD practices with limited success. I would post about them, but I'm afraid I'll get flamed by the TDD crew (kidding, will kinda).
Saturday, March 25, 2006
Great .NET Rocks Episodes
I just spent most of today working on my Microsoft SBA Add-in and listening/watching the latest couple episodes of .NET Rocks TV.
In these episodes Jean-Paul Boodhoo explains the Model-view-presenter (MVP) patterns, demonstrates NMock v2 framework, and builds a simple application using Test Driven Development/Design process. He does a great job explaining these concepts while developing a simple web form application. This is well worth your time if you have a couple hours to spare.
Thursday, February 23, 2006
COM+/Enterprise Services Configuration
COM+ application components can be configured two ways. They can be configured to run as library applications (in-process) or as a Server application (out of process). Having a library component isn’t a problem since it is running with the application domain as the calling application. However, getting configuration settings into a Server application can be a challenge. So much so, that I typically recommend running a COM+ applications as a library application.
So why is configuration so difficult for server application? Well I’m glad you asked. It’s because the server application is running in a process called dllhost.exe. This process lives in the {Windows}\System32\ directory. The .NET framework “automagically” loads the configuration file named dllhost.exe.config to get the configuration settings as long as it is in the System32 directory. This works great until you have 2 Server components that need different configuration settings. Do you see the problem? 2 Processes – 1 Configuration file. Plus most IT departments freak out (with good reason) when you need to deploy a file to the System32 directory.
If you’ve read this far you’ll find the purpose for this post. I had a colleague send me a link that documents how to use the new options in COM+ 1.5 to use the application directory. This is the only time I’ve heard about using the application.manifest and the application.config files.
http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=0615b3cc-0fbf-4cf5-9d49-ae95b50f7e8d
Tuesday, February 7, 2006
Database Triggers Rant
The reasons I don't like database triggers:
1.) They are very difficult to debug
2.) They are a type of "magic" within a system. "Magic" is when something happens when I run code that I don't see in the code.
3.) They are not intuitive.
I find that database triggers get used in an organization when one or more of these things happen:
1.) A DBA has been tasked with writing application code
2.) The code is more difficult to change than it is to debug a database trigger
3.) The deployment process for code is significantly longer than the deployment process for SQL changes
Wednesday, January 25, 2006
FitNesse: Using COM+ Enterprise Services to Manage Transactions
I’ve been working on integrating FitNesse and FIT into my current project. As with all automated testing, managing test data is a challenge.
To manage the data we have 3 options:
- Abstract the data from the system
- Restore the data to a known state before the tests run
- Create a reciprocating transaction. i.e. Each insert has a corresponding delete
- Rollback the test when it’s completed.
Option 1 is great, but it is difficult to abstract a system from the database especially if you are working with a pre-existing (legacy) system.
Option 2 is viable, but I hate having to do a database restore before I run a test suite.
I’m too lazy for option 3 and wouldn’t pick this option if there are a slew of user acceptance tests(UAT).
So I want to use option 4. Roy Osherove wrote a great article describing how to manage your unit tests using COM+ enterprise services and I have been using this method ever since, however, my tests use “Services Without Components” (SWC) included in COM+ 1.5.
I figured I could you the same concept with FitNesse! My solution is very simple. I created a ColumnFixture that can begin a transaction, commit a transaction, but most importantly rollback a transaction. The Fixture has 2 columns, Action and Result?. The Action column take one of three values: “begin”, “rollback”, and “commit”. The Result? column can be left blank. It will get populated with the System.EnterpriseServices.TransactionStatus after the Result() method is executed.
Now that I have this ColumnFixture, I created two pages: BeginTransaction and RollbackTransaction. These pages will be included before and after, any test fixtures that I want to run within a transaction. I prefer to use FitNesse’s !include widget, but you could also use the SetUp and TearDown pages.
Here's the code.
/// <summary> /// This class provides a simple interface to support COM+ transactions. /// </summary> public class TransactionFixture : ColumnFixture { public string Action = "begin"; public string Result() { TransactionStatus retVal = TransactionStatus.NoTransaction; switch(Action.ToLower()) { case "begin": ServiceConfig config = new ServiceConfig(); config.Transaction = TransactionOption.RequiresNew; ServiceDomain.Enter( config ); break; case "rollback": if( ContextUtil.IsInTransaction ) { ContextUtil.SetAbort(); } retVal = ServiceDomain.Leave(); break; case "commit": if( ContextUtil.IsInTransaction ) { ContextUtil.SetComplete(); } retVal = ServiceDomain.Leave(); break; default: throw new ArgumentException("Invalid value", "Action"); } return retVal.ToString(); } }
Screenshot - Before
Screenshot - After
BeginTransaction Page
|!-GiffordConsulting.FitNesseAid.TransactionFixture-!|
|Action|Result?|
|begin||
RollbackTransaction Page
|!-GiffordConsulting.FitNesseAid.TransactionFixture-!|
|Action|Result?|
|rollback||
Putting it all together using import widget
!include BeginTransaction
|!-GiffordConsulting.FitNesseAid.SignonFixture-!|
|Username|Password|Save?|
|Tim|apassword|true|
!include RollbackTransaction