Wednesday, April 18, 2007
I'm not sure how far back this feature goes but I just discovered it yesterday, thanks to Michal Talaga.

When you follow the practice of defining your test before you write your method, you lose out on the beauty and addicting convenience of intellisense.  Since Visual Studio.Net v1.0, I have become dependent on intellisense to keep me productive and assist me in typing out long method names.  Having to type them once, and then again, sucks...

WOW, check out what is available when you write a method that doesn't exist!



Now I seem to recall running across this before but I was not yet privy to TDD.  As it turns out, this is even faster then waht intellisense gives you because the method signature is shaped according to the variables you pass in. 

Try it out and see if you don't also feel it was the missing piece of your TDD puzzle.
4/18/2007 3:43:48 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Saturday, March 10, 2007
I had more errors installing then not.  After the first install, IIS was hosed.  The website couldn't bind and eventually gave a "catastropphic failure" when I tried to click on it in IIS Admin.  I finally reinstalled IIS (you know how intrusive that is to a development server) without success.  I finally discovered that the SharpForge bonehead had installed an SVNServe instance on port 80.  I'd really like to kick him in the teeth for that.  How stupid?!  It is called "SharpForgeSVN" if you experience the same thing and the following command line will delete it: sc.exe delete "SharpForgeSVNServe"

No, it will not come off after uninstallation.  Uninstalling SharpForge just deletes the website files but leaves all the rest of the mess behind including a running svnServe. 

I finally got the thing running, sort of.  It won't connect to SVN but instead provides a port 81 url to svn.  Each user requires a password with at least 1 non alpha-numeric character and 7 total characters.  Excuse me, but this is an issue tracking system, not a bank account.  Leave simple password requirements alone!  You can't add users from the administration GUI, you have to log off and "sign up".  Then you have to log back in as admin to add the user to a role.  I could go on and on but its time to just make my huge thumbs down recommendation and encourage you never, ever to attempt to install this pile of garbage on any computer you don't want to completely hose.

Open Source Software does not mean software that sucks!  Subversion is a great example.  Its clearly best in class and absolutely wonderful through and through.  If you want to open source something, make it simple and stable and then invite the world to contribute.  Don't try to sell it as a deployable sourceForge.  SorceForge works!  SharpForge

is a buggy, little, nasty critter

.Net | C#
3/10/2007 12:17:23 AM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Wednesday, January 24, 2007

An unhandled exception of type 'System.Data.OracleClient.OracleException' occurred in System.Data.OracleClient.dll

Additional information: ORA-12154: TNS:could not resolve the connect identifier specified

I've gotten this before and its usually easy to resolve.  Check your TNSNames.ora and SQLNet.ora files in your "[Oracle Home]\network\ADMIN" directory and make sure your connection string is using the right values.  Try a TNSPing from the commandline to ensure that the database location is accessable. 

This time however, I could connect using my database development tools, SQLPlus, even my local asp.net website using the same connection string.  When I tried to connect from the project in "C:\projects\Subversion\Rentals 1.0.2.1(feb 1)\Rentals", it failed.

I then verified that the trunk version of the same project could connect.  Sure enough, successful connection.

The code and connection string were identical.  The only difference was the location.  Was it permissions inside the directory?  Wait, was it the directory name?

I copied the entire directory to a new location named:"C:\projects\Subversion\RentalsTest\Rentals", rebuilt and ran the project.

Successful Connection!

You're kidding me, right?!

I then renamed the directory "C:\projects\Subversion\Rentals 1.0.2.1(no)\Rentals", rebuilt and ran.

failure!

OK.  No more parentesis in folder names.

That sure was a waste of a day!

.Net | C#
1/24/2007 8:32:51 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Saturday, December 02, 2006

With the recent development of Rentals.com, I've learned a great deal about teams, capability and myself.  With a small team of fantastic people, a tremendous level of productivity was accomplished.  Next year, we plan to better that.  IT will be an immense challenge but I am excited for the opportunity.  Along with that opportunity came a promotion to Development Manager for Rentals.com and a new office space just across the parking lot from the old.  The move is to truly empower the small team to operate as one.  Up until now we've been trying very hard to work  within a medium company that behaves like a giant company.  I believe this is going to be a significant year for all involved, especially the competition. 

In the last few months, I have received more employment opportunities then ever before.  Six months ago, I would have accepted the offers I've recently declined.  I love nothing more then to build things and there's nothing better then feeling a sense of ownership and responsibily for an outcome you are proud of.  I helped build ApartmentGuide.com over the years, not to mention NewHomeGuide.com, AutoGuide.com and a previous incarnation of RealEstate.com.  Each of these had varying levels of success and I played various roles and contributed on different levels at different times.  I am ecstatic to be intimately connected with this next venture. 

I am looking for top notch developers in Atlanta.  We are based in Norcross.  We have a beautiful office building, updated workstations with dual lcd monitors, flexible schedules, casual dress and really, really sharp people.  We are going to be running a pure agile (scrum if you know it) development process to build an infant of a product to a $200,000,000 company in the next two years.  The parent company is stable and profitable, compensation top tier and work loads reasonable.  Sustainable pace, right?  Its all dot net 2.0 and we're finally going to start using SQL Server.  You'll have some opportunity to build your Oracle skills, however, if that floats your boat.

So, please shoot an email to rzarse -at- consumersource -dot- com if you are 1) a fantastic dot net developer 2) highly motivated and a great team player 3) Bored at your current gig and looking for a fun, exciting challenge

12/2/2006 3:14:25 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Wednesday, August 30, 2006

I've linked to Keith Rome's Blog after I foundmy old url on his blog.  Hey Keith, can you chnage http://vitaminzrecords.com/blog to http://www.vitaminzproductions.com/blog?  I'm really too lazy to add the wildcard domain entry to letthat url resolve.  We both know how well I manage domains, don't we?

Keith made me jealous with his media center and ashamed with his certifications.  My company has driven me to read books on sociology, management and conflict resolution.  Last year I was devouring technical books, now I am reading all the process and methodology books I can get my hands on just so I can confirm my understanding of how software development should work.

I'm going to volunteer to present on CruiseControl.net and continuous integration at an upcoming c#group meeting.  I've been away too long and miss my geek peeps. 

I'm looking forward to coding more in the near future.  Now I just have to figure out ...how.

.Net | C#
8/30/2006 3:59:41 AM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Saturday, August 19, 2006

Atlanta apartments

Atlanta Houses for Rent

Its been a work in progress for about 4 months.  Yep, that's all.  Granted, there's some piggy backing on top of ApartmentGuide logic and there is no back-end content administration system (its entirely driven by a windows service that retrieves xml data feeds to create searchable Apartment listing data) but 4 months ain't bad.  In a few weeks you'll see some bad ass mapping functionality.  This site, however, is completely different from what we've done before.  Its designed for the user who sends leads, not the client who pays for them. 

So have a look at my new Houses and Apartments for Rent site.  (google, looky here, please.  we're hoping you like us).

The quick and dirty is that it was designed to be very intuitive and highly searchable.  We have embraced the Google gods as more the a search indexer and truly a driver of technological advancement.  Consistent navigation and content (no matter who you are) is important to bots so it is a core principle in the site design.  We' ve peppered in some slick ajax and then, despite me resistance, dumped some flash on the home page.  I'm very proud.

COMMENTS WELCOME!

.Net | Web
8/19/2006 1:14:37 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Saturday, August 05, 2006
These are tools that one should not be doing .net development without (in my opinion) 
most are free.  I'd like to take this opportunity to truly thank the contributors to each of these tools.  They are INCREDIBLE and I can't imagine going back to working without them.


Invaluable Tools for DotNet development
TitleDescriptionPurposeUrlcost
ReflectorLutz Roeder's tool for inspecting .net assemblies and reading the representative codereverse engineering for the purpose of learning how something works or helping to diagnose the cause of some behaviorReflectorfree
NUnitAutomated unint testing frameworkensuring quality software and enforce continued adherance to business requirementshttp://www.nunit.org/free
CruiseControl.netcontinous build server and dashboard for .netIdentifying integration issues minutes after they are generated and compile/unit test confidence for all configured projectsCruiseControl.NETfree
Fiddlerhttp request manipulation toolCreate explicit request contexts to test the behavior of your site at a low levelhttp://www.fiddlertool.com/fiddler/free
TestDriven.netVisual Studio plugin for Unit TestingIntegrates with NUnit to allow test exectution from within visual studio. Allows method invocation with no need for dummy form codinghttp://www.testdriven.net/free personal edition
RegEx WorkbenchRegular Expression editor / evaluatorInteractive execution and testing of regular expressionsRegEx WorkBenchfree
Enterprise LibrariesFramework based on Microsoft best practicesWell tested and thoughtfully designed frameworks for common business needsEnterprise Library .NET 2.0free
I'll try to keep this list updated and add items as I think of / discover / am told about them. Each of these represents a different aspect of enterprise development and, as a whole, reduce cost & complexity while increasing consistency and quality. Pretty sweet for FOC!

Now, if you have all of these, follow to Scott Hanselman's Ultimate developer and power tool list and have a ball.  It was his post that inspired me to officially post these.  That and the desire to consolodate my url list of downloadable tools.
8/5/2006 7:30:44 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Our problem was two fold.

1) Sander Gerz describes a Google related Context.Rewrite() bug in ASP.Net 2.0 that occurs when the browser header User-Agent setting is Mozilla/ 5.0.  This happens to be the browser Google identifies itself as.  The error will result in your form failing when trying to write the action tag.  An Exception is thrown. Read the post to learn more about the specifics.

2) We had a custom error page that used Server.Transfer to display a friendly message when an error was caught by the Page_Error event on a failing page.  Unfortunately, the developers did not explicitly set the response code to 500 so Google thought that we were a website all about "Errors have occurred...".  They got a 200 OK status, after all.  Lesson: set the response code to 500 when showing a pretty error page.  This will likely result in some browsers not displaying the content but it will trigger the appropriate escalation chain attached to error events.  Sending a regular page is the same as swallowing errors in an empty catch...  not good.

So, read the post about rewritten paths and google in ASP.Net 2.0 and think carefully about how you handle errors.  It is a good idea to practice diagnosing a problem having a similar configuration to your target production environment so you can identify what you'll need when break down occurs.  That would include whatever restrictions your administrators place on you such as no machine or filesystem access or debugging.  Sometimes you really cannot recreate something in another context or environment until you'll identified the cause of a problem.

Hint: use the Exception Handling Application block from the 2.0 Enterprise Libraries

8/5/2006 6:46:54 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Friday, August 04, 2006
Sorry folks, the brakes were slammed on at the last minute regarding rentals.com.  There is some strategy thought process going on that required a massive redirection of intent.  If you care to see it, have alook at http://preview.rentals.com.  However, it won't be released into the wild for some time (intentionally not linked).  I will, however, be positioning the site at beta.rentals.com  shortly.  When we do that, I'll link to it.  Hopefully that will be enough of a feeder to spark a google investigation.  When that happens, we'll see just how valuable content is and how valuable inbound links are!  That's one of the tenets of SEO, inbound links.  One needs links to a site to give it credibility.  Without them, content is just a bunch of text in cyber-space.  However, with links that say something is about something: like this, you get the inferred vote from that external link that says, "this site is an authority"  Enough of those and you don't even need the specific word on your page! 

I've intentionally gone off topic. I'm excited about the new site. I wish we could have launched it.  I'llkeep the world posted as to my progress but for now we are continuing as planned with rentals.com except for the actual releasing of it and focusing more attention on our new, refreshed ApartmentGuide.com site.  We got a couple little things to tweak on that old salty dog.

cheers!

8/4/2006 1:17:28 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, June 20, 2006

I know this probably seems quite intuitive, and now that i've discovered the solution it is, but I still thought it worthy of blogging.

When configuring CruisControl.net <webURL> node in ccnet.config, html encode the string value.  After all, its in an xml config document.  I was trying to url encode it, which didn't work, or include it raw, which violates xml rules.

The correct config setting looks something like this:

<webURL>ttp://buildbox.corp.mycompany.com/ccnet/default.aspx?_action_ViewProjectReport=true&amp;server=BuildBox&amp;project=MyCompany.Project1</webURL>

The exceptiont that is raised in the cctray is bizarre.  At the moment, I can't even get it to blow up for me and I'm over messing with ccnet.config today.

happy building

6/20/2006 2:42:01 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Wednesday, April 19, 2006

A friend asked how to do this.  Since I was curious myself and figured others probably are as well, I've posted it here.

  • right click on your web project
  • choose "property pages"
  • choose "start options"
  • change the Server setting from "use default Web server" to "use custom server"
  • configure your "Base URL" to the root of your website.
    note: I received an error: "Unable to start debugging on the web server. Logon failure: unknown user name or bad password." when attempting to open a local url using host headers (http://www.me.rentals.com).   Using localhost with a virtual directory worked fine (http://localhost/csi.rentals.web).

 

Now, when you <F5>, you'll launch your website like we used to in VS 2003. 

 

If you want to use a host header, I'd look into Internet Options/security settings in Internet explorer (check "automatically log on with current username and password) as well as the user configured for your asp.net application.  Documentation suggests that the debugging user must be an administrator.  I'd use SysInternals RegMon and FileMon to see what access might be failing but this is outside of the scope of what I was trying to accomplish.   Good luck!

4/19/2006 5:26:02 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, March 14, 2006
This is a job description written in a language recruiters cannot understand. Please see the website for a good chuckle at my inginuity. No, it didn't help get more qualified people...
using AgileDevelopmentMethodologies;
using ASP.Net2.0;
using VisualStudio2005;
using NUnit;

/// 
/// This individual will crank out high-quality, high-performance application logic 
/// to further enhance the absolute industry-dominance for their employer.
/// The product is the leading provider in its market vertical and seeks to broaden
/// their target market.  It's an exciting and challenging opportunity.  
/// The website itself is a public facing, high volume, user-centric, high profile brand
/// and a valuable product to consumers
/// 
/// Highly competive rate for competent individuals.  Position immediately available.  
/// 
public class SeniorDeveloper : ExperiencedWebApplicationDeveloper
{
    string _employmentType = "Contract/Contract to Perm";
    int _immediateDotNetTeamSize = 3;
    int _organizationTeamSize = 20;  //appx
    int _growthOpportunity = int.MaxValue; //TODO: consider refactoring to use larger datatype
    
    // developer must be able to work on a team yet complete tasks independently
    // skills needed are all facets of web development as related to high-traffic, 
    // public websites.  Think http://www.apartmentguide.com
    public SeniorDeveloper()
    {
        bool requirementsMayBeChanging = true;
        // requirements changes are expected and embraced.  
        // If they should change, impact to project development must be minimal.  
        // Short iterations enable flexible project focus
        while( requirementsMayBeChanging )
        {
            
            // turn business ideas into functional feature sets
            AnalyzeRequirements();
            // elaborate on the above
            CommunicateWithBusinessSponsors();
            // estimate the work required to implement
            EstimateFeatureDevelopmentCost();
            // independently productive and organized.  Aware of issues early and able to communicate risk
            ManagePeronalResponsibilitiesAndHelpManageProjectStatus();
            // commitment to quality and zero defects (*required)
            WriteUnitTests();
            // keep the logic out of the interface, keep the html out of the class library.  
            // if any feature or function cannot be unit tested, it is a poor design.  refactor!
            ImplementStrongObjectOrientedPractices();
            // IE 5+, FireFox 1.0+, mac and windows
            SupportCrossBrowserUserInterface();
            // check in code that compiles
            // Write unit tests that verify code-complete
            // strive for zero defects
            WorkOnATeamUsingContinuousIntegrationAndAutomatedUnitTesting();
            // work closely with qa to provide a rich test plan 
            // that extends upon the quality offering of developer authored unit tests
            // be production ready with every short iteration
            DeployShortIterativeReleasesToQualityAssuranceTeam();
            // occassionally, defects pop up.  Troubleshoot, isolate, write test(s) and resolve
            TroubleshootAndResolveDefects();
            // the product's market performance drives the enhancement and extension of the website
            // if the product ceases to deliver business value, the product is not worth continued investment
            if( ProductIsMeetingSuccessFactors() )
            {
                // feedback from user response will help to make the product even better. 
                // New features will be requested!
                requirementsMayBeChanging = BusinessSponsorHasAquiredNewData();
            }
            else
            {
                // isolated failure is only an opportunity to improve even more but continued failure is a problem
                throw new NotMeetingObjectivesException( "Time to reconsider the current product direction" );
            }
        }
    }
}
3/14/2006 12:09:06 AM (GMT Standard Time, UTC+00:00)  #    Comments [3]  |  Trackback
Friday, March 10, 2006

It occurred to me that everyone has their own way to get to the same destination.  In programming, a professional may read books, they may go to conferences, they might merely use the platform documentation or they might dissect the platform piece by piece to decompose its function and learn how  it worksfrom the inside out.  They might even rewrite it just to figure it out.

I have one friend who told me he doesn't learn from books.  He finds they don't suit his pace of things.  He is one of the most capable, brightest individuals I know and he'll figure things out through experimentation and analysis.  Another peer I've worked with spends his time taking things apart just to learn how they work.  Then he rewrites them and calls them his frameworks.  While he is intelligent, I think he's terribly misguided because his goal is to prove how much he knows about things and the outcome is merely that he knows alot about things but produces nothing truly useful.  Then there are the readers.  I am a reader.  I read so many things that I hardly ever finish a book in entirety and I'm usually reading half a dozen at once.  Sometimes I have a dozen books on to-be-read-queue.  Then there are those people that find the process of staying on the leading edge costly and  prefer to wait for the inevitable trickle of  important information to find its way to them. 

What if all these people could benefit from all these activities?  What if each person's tower of knowledge was a week or two from being accessible every other person?  What if the person who waits for information could be the vehicle to deliver the important things that the dissector learned to the person who reads too much?  What if all anyone did all day was talk about the new things they've learned?  How might that affect the pace of growth in a group?  All these questions are on my mind related to Pair Programming.  I was not a believer until we had Richard Sheirdan of the Menlo Institute give us a one day fire hose on Agile methodology.  He is no dabbler in a few Agile ideas, he is a hard extremist on the agile front.  He's also speaking from real world experience, a lot of it.  He is a huge proponent of Pair Programming.  I'm not talking about height (though he is incredibly tall).  He made a point to say, "I will say a few enthusiastic words in favor of pair programming and then I will drop the subject."  But then he went on to mention it a dozen more times.  We started counting when our CTO took note that he'd brought it up the required 6 times to internalize the idea.  The point, in short, is that after enough a raving about the subject, I stopped mentally blocking the possibility that it has merit in my world.  I believe I am not the only one.  ...and now these questions.

If every two weeks, a person worked with a different partner to accomplish their goals, would the knowledge of each osmotically transfer to the other?  Would that information continue to travel through the whole group?  Would the team as a whole grow more quickly?  Would their progress slow or increase?  Would the cost of sharing a keyboard repay in both quality and efficiency?

When I have a question about technology, the capabilities and cost of implementing, I do a controlled experiment.  I'll research a little, try a small scale implementation and evaluate my results.  I'll report the results of our small scale pair programming experiments.

3/10/2006 1:42:15 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, March 07, 2006

Windows Server 2003 compatible Management Tools for SQL Express!

Note to MicroSoft, "Thank you gentlemen!"

I have struggled with this situation for a couple of years now.  My development team uses Windows Server 2003 Web Edition on which to develop our applications.  The primary reason is that we deploy to that environment and it helps to enhance confidence that there won't be platform incompatibilities when we move from our desktop to the deployment environment.  Our workstations are configured, essentially, just like production servers.  We almost never have issues related to operating system, installed features, etc, when going from one environment to the other.

However, I could not locally install development editions of SQL Server.  In fact, one cannot even install the Enterprise Management Tools for SQL Server on Web Edition.  That sucked!  Until now, this has been an obstacle that results in using Oracle for projects where SQL server would be easier and, arguably, better.  I even tried Oracle XE (personal edition) for prototyping.  The footprint for that app is rather large and it reaches its limits very quickly.  The need was met, however, and I never even bothered to evaluate SQL Server for that solution.  I didn't have time to create a Virtual Machine and try to develop there.  Besides that, a VM wouldn't satisfy my needs.  Oracle XE, however, is rather buggy.  The web based interface messes up every now and then.  Data goes to the wrong place.  Weirrd stuff...   I think I would have returned to mySQL if it weren't for:

http://www.microsoft.com/downloads/details.aspx?familyid=82afbd59-57a4-455e-a2d6-1d4c98d40f6e&displaylang=en

thanks again.  It works GREAT  pretty OK!

When I use the gui to add rows to existing table and click "execute", it refreshes with no effect, no error and, most importantly, no insert.  When I open the sql pane and write my insert statement, it inserts successfully. 

3/7/2006 6:33:52 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Tuesday, February 07, 2006

Enterprise Library for .NET Framework 2.0

released!  I downloaded, installed and got to evaluating it today.

I'm focusing on the Exception Handling Application Block as it is the most immediate fit for my organization.   I was using the EMAB on one previous project but never made it a core architectural component.  This time its  a keeper!

Setting up

The best way to get a handle on things is using the quick starts.  Install the Application Blocks, choose Start Menu\Programs\Microsoft patterns & practices\Enterprise Library - January 2006\QuickStart Applications\Exception Handling Application Block\C# Exception Handling With Logging QuickStart.

Set a break point in the button click, F5, go>>>

You should get a basic feel for the implementation pattern.

I followed the simple instructions, configured my web.config using the configuration tool (Start Menu\Programs\Microsoft patterns & practices\Enterprise Library - January 2006\Enterprise Library Configuration) but when I launched, I got an error. 

By the way, when configuring web.config, don't select "New Application", use "Open Application" and browse to your web.config.  I made that mistake three times before I figured it out.

The error was basically telling me it couldn't create the logger. I've seen that often enough in my own provider patterns to recognize it in a minute.  I still managed to sprint down the worng apth, thinking it was because I hadn't signed my assemblies, and started mucking with the configuration.

When the handler executed the policy evaluation using: ExceptionPolicyManager.HandleException( dataEx, Policies.Data_Access_Policy ), the exception handling application block threw the Configuration Error: The type Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null from configuration could not be created.

In the quick start, it was mentioned that the Logging assemblies were needed if one used the logging handler but it didn't specify which assemblies.  I had only added Microsoft.Practices.EnterpriseLibrary.Logging.dll

Upon closer inspection, it became obvious that I needed Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll

The five assemblies I needed to make a reference to in order to use the block are: Microsoft.Practices.EnterpriseLibrary.Common.dll,
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll,
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll, 
Microsoft.Practices.EnterpriseLibrary.Logging.dll
and Microsoft.Practices.ObjectBuilder.dll

Once I had the appropriate references, things worked pretty swell. 

Policies

The hardest part was to understand what was intended with policies.  A policy is basically anything you can define as a standard way in which you'd like to handle errors.  The examples and documentation don't really extrapolate on this matter.  I guess the author assumes you are pretty clear on this yourself.  If you think about it, you probably are.  There are probably only a few specific things you want to do when an error occurs, depending on the severity and context.  You may want to log and continue.  You may want to let the user know something happened.  You may want to change the message to something friendlier or less sensitive.  These are your policies.  

Under each policy is a handler mapped to each configured exception type.  The block will evaluate exception mappings from most specialized to most generic.  If you specify a mapping and a handler for Oracle.DataAccess.Client.OracleException, this will be the handler that evaluates against your exception.  OracleException inherits from System.SystemException (don't ask me why that is!), it will evaluate that next.  If you have neither mapped in your configuration but have a policy for System.Exception, this will catch all.

Under each exception type is a handler.  The handler may log, it may wrap the exception in a different exception (effectively masking the underlying details from the user), or it may replace the exception entirely (effectively restricting the underlying information from access to the user's screen, regardless of user interface implementation.  Why would yo uwnat to do that?  you may ask...  I probably wouldn't have until I was given the power.  If your business layer has a database issue, you may want to be very verbose on the details of the problem in the message of the exception.  "Connection string 'suchandsuch' failed to establish a valid connection.  Please check the connections section in configuration," for example.  I have been hesitant to include too much information in an error message for fear the wrong person may get enough information to hack the system (too easily, anyway).  However, the ability to replace the exception before it leaves the business layer is awesome!  I can establish a policy that logs the original error, then replaces a verbose dataException with a generic appException containing a reference to the handling Identifier, that then maps back to the verbose log in the back end system.  The user interface will not only display something user-friendly, it will link to the actual physical entry which was logged that the administrator has access to.  If the problem isn't easy to resolve, a temporary policy change can allow the message to propogate to the screen for troubleshooting.  This is all way too freakin' cool!

What's next?

more research, more experimentation, and a enterprise-wide push to use this stuff.  I tried the previous Exception Management Application Block and was very excited.  I couldn't really get much buy in from my peers, they each had their own approach, and I couldn't demonstrate compelling value for the migration to the block.  This is different!  This is truly brilliant, robust and complete.

I will try to post more about how I am using it.  I chose to define policies in a centralized enumeration and excute the evaluations in a centralized method.  This allowed me to make the Enterprise Library reference in one place and use the existing company core references to my adavantage.  This also prevent typos in the policy name string and simplifies integration a little. 

Lastly, I want to mention the unit tests that ship with the libraries. Take a look!  There is a very cool Reflection Attribute aliasing bit that is quite enlightening.  I hadn't seen it before.  It aliases the Miscrosoft Unit Testing attribute syntax against the NUnit attirbute set.  That indicates two things. The tests will run using either test framework and the Microsot Unit Test framework is completely compatible with NUnit.  Good news because I'm getting pretty heavily invested in NUnit recently.

Good stuff Patterns people, keep up the great work!

 

 

 

.Net | C# | Microsoft
2/7/2006 2:41:19 AM (GMT Standard Time, UTC+00:00)  #    Comments [2]  |  Trackback
Thursday, January 05, 2006
Hey Everyone,
 
Some of you know me from the Atlanta C Sharp user group.  I haven't been there in a while because I have been very busy learning asp.net 2.0 and the new framework, and gathering requirements for two brand-new web applications.  One is our flagship website that gets more then 10 million hits per month and generates more then enough revenue to help make our company profitable.  The other project is a cross-site content management and distribution application designed to provide campaign-based content administration with an extensible user context targeting system.  The data is xml heavy and xsl rich.  Both of these applications are very exciting and very challenging, only senior level developers will be accepted. 
 
The company enjoys a 25 year old brick-and-morter publication offering that makes it a very stable position.  I've been here for nearly 6 years. 
 
We've usually use staffing services to fullfill open positions but they have been sending us nothing but, forgive me for my vulgarity, crap.  The resumes are embellished and sometimes blatent lies.  I am a terrible interviewer and these every interview I've had has been terribly disappointing.  I am extending my personal request to the many talented individuals I've met in Atlanta to step up and help us out. 
 
I know, what does it pay?  Let's just say we're ready to up the rate.  In fact, we'll pay as much as the highest rate on computerjobs.com right now!  Top pay for top people, what a concept?
 
Our goal is to find great people and convert them to full-time employment.  Up until now we have offered a competitive rate because we want the salary conversion to not hurt as bad.  Due to this, we've gotten, as I said above, less then qualified individuals.  We're ready to bite the bullet and fork over the dough to attract ...hopefully, YOU.
 
I have, for along time, desired some change in the general process and atmosphere in the enterprise.  Its been a slow, steady climb.  That's about to change!  We recently moved to a beautiful new location and are going to change corporate identity.  That sort of change sparks progress.  In addition, we are adoption a less rigorous, more iterative process, officially.  That means less documentation and more design.  More sparked communication and less beurocracy.  Smaller development lifecycles and less delivery pain.  I'm very excited.  I wouldn't be tagging my name to this if I weren't.
 
Here are the core skill sets required (that's experience and expertise, not dabbling or exposure)
  • ASP.Net
  • C#
  • XML
  • XSLT
  • CSS
  • XHTML
  • Web Services (designing, creating, deploying and consuming)
  • Unit testing (NUnit or other automated test tool s and methodologies)
  • Iterative development process (Agile, Scrum, Xtreme, Crystal, whatever - any successful experience is extremely valuable, if you're a waterfall man, please don't apply)
  • Javascript
  • GoF Patterns for Enterprise Developement

Here are the skills that will help greatly that, if you don't have, you will

  • ASP.Net 2.0 including master pages, membership
  • the 2.0 microsoft.net framework (generics, the provider model)
  • WS-E
  • Oracle and Oracle.DataAccess
  • LDAP
  • Visual Studio 2005
  • Team Systems (hopefully)
  • cross-browser and standards compliant html/css/javascript support
  • AJAX
  • Enterprise Library

That's all I can think of for now.  There's more, of course, but that is probably enough to capture the right person(s). 

If you think you're good, you probably aren't, sorry, please move on.  If you know you're good because you've read the stadards, you've read the articles, you've prototyped or implemented the new technologies and concepts, I'd love to hear from you.  If I know you and I know you are good, that helps a lot.  If not, I'll need legitimate technical references. 

Feel free to email or call if you are sure you're the right person.  Recruiters, I am not the hiring manager and I can't help you.  Direct applicants only. 

Thanks much and please let me know if you know anyone or let them know we're looking.  Gracias

 

 
1/5/2006 6:55:15 PM (GMT Standard Time, UTC+00:00)  #    Comments [1]  |  Trackback
Tuesday, January 03, 2006

I am watching Rob Caron's interview on TheServerSide.net.  He is talking about Team Systems installation.  The interviewer asked about problems with the install of CPP's that people have experienced.  I was an early adopter who failed to get a successful install after two attempts.  Mr. Caron is quite a pompous, self-important and offensive, self-proclaimed king of Team Systems!  He actually had the audacity to say that the consistent problems that many of us had were not a result of a poor installation process and incomplete documentation, he said it was us (the consumer, his client)!  He is certain that it was the individual's fault, every time, for installing out of sequence. 

I can attest that I followed the installation guide to the letter, line by line, twice, with two failures trying to install reporting services for MS SQL Server 2005.  I read recently that there was a CLR incompatibility between the SQL Server and Team Systems installation as they were compiled against different builds and must be installed on seperate servers.  Well, Robbie, baby, that wasn't in the guide!  I followed the "singel server installation, BTW, J.A. 

I wasted more time then I have ever dedicated to a product trying to get it online.  I was immensely disappointed that it was such a horrible distributable.  My advice is to take a long look in the mirror, Caron, decide if you want to try to convince people that you know what you're doing (by insulting your clients) or prove it (by providing a seamless install for Release Candidate). 

Something tells me that I will one day regret telling Robbie to take credit where credit is due, apologize for wasting our time and money, and get his act together on the next install...   but it sure feels good to retort.  And for the record, Bill, if you want my advice, fire him.

1/3/2006 8:44:37 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Thursday, December 22, 2005

"Download CCTray" link fails?  The default installation of CruiseControl.Net dashboard worked almost perfectly out of the box.  However, the link to download the CCTray fails.  Following some investigation of the configuration file and iis settings, I found the simple solution.

<cctrayDownloadPlugin />

When I installed the CruiseControl.Net application under a virtual directory in IIS, the default setting for directory permissions was "scripts and executables". 

This caused a 404 to result from clicking the link provided for CCTray installation (provided by the cctrayDownloadPlugin).    The more appropriate, and correct, setting is "scripts only". 

Right click the virtual directory in IIS Admin mmc, On the virtual directory tab, under application settings, set execute permissions to "Scripts only".

By the way, this is an iis default setting, not a cruise control installation.  Furthermore, CruiseControl.net is probably the third most incredible open source product I've ever had the pleasure to use. Third after nAnt and nUnit (although nAnt deleted my c: drive last week...  lost a little love that day).  I am presently addicted to the green tray icon and the dashboard itself. I love seeing "another successful build" pop in the corner of my screen.  Thanks CCNet dudes, you rock!

Posting this because my newsgroup post got no response :>(

I have the folder cctray below the webdashboardlink  root and it contains the

setup file for cctray

Yet, when I click on the link provided by the plugin:

./ccnet/default.aspx?_action_CCTrayDownload=true

i get a 404

any suggestions? ( solution described above )

12/22/2005 6:43:59 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Monday, October 24, 2005

First I'll get to the point, then I'll elaborate.  When designing something for broad consumption, start with an example of a simple implementation and work backwards.  Imploy a test-driven-development approach to your interface and you might avoid several mistaken paths...

 

And to give credit to the source of the advice:

 

CHRIS ANDERSON Each developer has his or her own methodology,

and although there isn’t anything fundamentally wrong with using other

modeling approaches, the problem generally is the output. Starting by writing

the code you want a developer to write is almost always the best

approach—think of it as a form of test-driven development. You write the

perfect code, then work backwards to figure out the object model that you

would want.

 

 ...and now more fluff!  Mostly, this is stream of consciousness but perhaps someone will have something to say or may just find inspiration!

 

For those who aren't privy, I am now a fulltime employee of HPCi.  The reason for hanging up the independent hat and accepting the shackles of fulltime employment is that we mutually want to allow me to have more responsiblity and involvement in higher level deceisions and direction.  Basically, I am incresing my architecture role within the company. 

 

That being said, my involvement in code should migrate upwards such that many of my deliverables are used across the organization.  Sometimes my deliverables are nothing more than design and sometimes, merely suggestions. 

One complexity I am trying to resolve is a continous dependency built into our products on the underlying search technology used.  This goes beyond a traditional Oracle vs. SQL Server agility and the abstraction of data interaction from the business logic and presentation tier.  We use a web-based search product that handles all the details of denormalization in a consistent manner.  It is great at some things, really great.  At other things, like relational data, not so good.  The websites that use this product call directly to the tool's library API to execute searches.  The result of which is woven all the way up to the presentation code so that changing the search mechanism would require extensive modification across all tiers.  What tiers?  exactly!  More importantly, to accomplish otherwise simple things, we often have to write complex logic against the data to shoe-horn in functionality that isn't natively supported.  To further muddy the waters, controls that live on a page are loaded dynmically in an IBuySpy portal sort of way so they are not aware of each other and the page is completely divorced from any specific functionality such as searching.  There are many other reasons why I want to create a proxy class that can handle all this complexity and provide a simple, consistent interface for searches.  My goal is that the synchronization of multiple searches, plus the complexity of search manipulation, could be encapsulated in addition to allow the searching engine and its datastore to be swapped out where the class that consumes the search would not need to change (unless it relied on the internals of the search product, which I also want to expose).

 

My first iteration preceded reading the blog-post-subject-suggestion (write client pice first).  I started a two way eventing model that would broadcast a search intention, via an existing page event model, passing a delegate to a synchonization method, which would then wire the control to a search execution control.  The search execution control would send its search exectution intention through the same eventing system and the controls interested in .  The result is that all controls would then be wired to either execute a search or receive a search.  It worked but it was a mess.  It was immensely complicated and not easy to communicate or document.  scratch that one...

 

I went through several modifications before I finally realized that developers create objects and execute methods and asking them to do much else is instructing them, "please don't use this, its too complicated."  All this eventing and delegate nonesense needs to taken off the developers' plate.  I implemented a singleton search executor and a search manager class that orchestrates the execution and synchronization of the search.  When I was finished, it was much simpler but I was still passing back the very propriatary search results class to the client.  It was still impossible to get the search from another datastore and pass it back through this framework.  

 

That's when I read this short tip and the light bulb lit like the warm glow of a 12AX7 on an old Fendar Twin. 

 

I deleted all the code in the display control that passes the selected criteria to the search manager with the ideal world.  It immediately identified that I not only needed a search result object that was not directly tied to a search tool or data store but I needed a criteria object that could be sub classed for each implementation. 

 

Since the selection of criteria values and the search itself cannot easily be seperated, it is unrealistic to think I could create a completely generic search object hierarchy without completely rewriting the entire website.  However, it is realistic to think I might create a WebsiteCriteria class that internally creates a search specific criteria class and passes the details to the search tool.  Then the search result can be wrapped in a generic search result container.  At this time, the front end requires some of the details of the proprietary search as the listings that are returned are all dependent on the search tool that generate the results.  Therefore, I expose the underlying deatils for those that need them.  Eventually, I'd like to move more and more into the abstraction layer so tat a listing is a listing no matter where it came from.  I think I'm on the right track.  Regardless, the code to use this new structure is incredibly simple.  Create a search manager object.  If you care about synchronizing with other searches, pass a synchronization delegate to the constructor.  Call the execute method, passing a criteria object as your selections.  You will get a search result back.  Any onther class interested in synchronizing will be notified by the single search executor.  Its getting there.  Its much better then every control executing the same search and depending on page events and session for search details.  Baby steps.

 

 

 

 

10/24/2005 6:32:47 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Thursday, July 21, 2005
blogging my way to pdc
  • PDC still offering early bird registration

Click on the logo to the left to find out how to beg and plead like I am or click below to see how to register.
http://www.developerpowered.com/ 

can i go to the microsoft pdc, huh, can i?

I recently started discussions with my employer, HPCi, about changing from a contract employee to a real, actual, honest-to-god employee of the company.  Several years ago, I was an employee and left to pursue higher purpose.  Shortly thereafter, I met my wife, had a kid, blah-blah-blah (found higher purpose) and came back on a project/contract basis.  Several years later, well, you get the picture....

Several years back, the year 2000, HPCi sent me to the PDC.  This year, they are sending a few developers.  There are several people who want to go as well.  Even if there was budget for more developers, it would be unfair to send me a second time before others got to go once.  However, depite the unfairness, I would really be the best person to go...  why?

  • I want it the most
  • I fit in best in LA,  I have the most piercings.
  • I am responsible for the companies enterprise builds - ie: I need Team Systems knowledge
  • I have repor with the CLR guys, they visited Atlanta, we had dinner, hung out, made fun of the other developers
  • I'm the younger then the other developers (going to PDC).  Their memories are becomming unreliable. 

Now, from outside the company, it makes much more sense.  If Microsoft decides to sponsor my way to the PDC, I'll do one or more of the following:

  • Present general and specific PDC materials to the Atlanta C Sharp User group
  • Volunteer at a Microsoft or Ineta function
  • Dye my hair Microsoft blue
  • Teach my two year old to write XAML

OK, I've wasted enough time blogging this evening.  Have agood one.  If you are going to the PDC... curse you.

 

.Net | C# | Microsoft
7/21/2005 8:14:35 PM (GMT Standard Time, UTC+00:00)  #    Comments [3]  |  Trackback

The last post about namespaces was just the warm up.  After I identified the situation and removed our references to the "SupportClass", I continued having issues with the build.  The error was "such_and_such referenced class in 'this_and_that.dll' inherits from baseclass 'so_and_so' that is defined in another assembly that is not referenced.  You must add a reference to ''this_and_that, version 1.0.0, culture: nuetral'

The baseclass is indeed defined in the same class as the derived class.  (Confirmed thanks to Lutz Roeder's reflector)

Why couldn't it find a ref to itself? 

As it turns out, nAnt will alphabetize your assembly references.  Execute NAnt using the -verbose flag to see such details during execution.  When looking for baseclasses, references, etc, csc.exe will inspect in the order of reference declarations.  Therefore, my namespaceless collision of {global} "SupportClass" bit me again.  What to do?

If NAnt is going to alphabetize, why not rename the offending class.  Fortunately, only one class library, Novell.Directory.Ldap.dll makes is dependent and self-referencing on its "SupportClass".  Therefore, I could rename the other dll to appear later in the alphabet.

<copy file=".${bin.dir}\Awrecka.Navigation.dll" tofile="${build.dir}${bin.dir}\ZAwrecka.Navigation.dll" />

-- compile My.Enterprise.dll -->
<csc target="library" output="${bu ... />

-- copy the Awreckadll back to its proper name and get rid of zendeca -->

<copy file="${build.dir}${bin.dir}\ZAwrecka.Navigation.dll" tofile="${build.dir}${bin.dir}\Awrecka.Navigation.dll" />

<delete file="${build.dir}${bin.dir}\ZAwrecka.Navigation.dll" />

Anyone ever heard of a  H A C K ?

 

.Net | C# | Microsoft | NAnt
7/21/2005 7:40:26 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Namespaces are neat but they are also important. Every class, struct, etc you write should have one. Don't be stingy, give 'em a namespace
.Net | C# | Microsoft
7/21/2005 6:25:38 PM (GMT Standard Time, UTC+00:00)  #    Comments [2]  |  Trackback
Wednesday, July 13, 2005
A simple utility that you are free to use and share to encode and decode text using HTMLENcoding and UrlEncoding. Written as a windows forms executable using .net
.Net | C# | Web | Xml
7/13/2005 7:20:08 PM (GMT Standard Time, UTC+00:00)  #    Comments [2]  |  Trackback Utility.HTMLEncoder.zip (17.16 KB)
Tuesday, June 21, 2005

Debugging asp.net 1.1 edit and continue?

The following link describes a technique for edit and continue in 1.1

attach to process visual studio.net While I haven't used the "src" attribute personally, I have been using the "attach to process" approach for some time. Rather than "F5", I load the website normally by accessing its url, then I use: debug > processes. Check the "Show System Processes" check box, attach to aspnet_wp or w3wp (the latter is server 2003) process, choose "Common Language Runtime" on the next dialog, and your ready to go!

attach to process visual studio.net The funny thing, and I mean