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
Monday, August 28, 2006

I had recently moved from a usb modem to an ethernet modem and was empowered to use my LynkSys as my Dynamic DNS updater.  After a couple of months, however, I received an email stating that I was being blocked due to update abuse.  I asked for more info regarding the situation and the DynDns support rep was happy to reply and inform me that my router was updating on a timer, which is not allowed.  Unfortunately, three days later, I received another email stating that my DynDns account had been removed due to continued abuse.  The service they provide for free is absolutely fantastic and I certainly cannot complain that they have no patience for slackers who fail to fix their problems immediately.  So I finally spent about an hour getting things straight tonight.  I've disabled my LinkSys and returned to using the DynDns updater.  I was pleasantly surprised to find it now runs as a windows service!

If you're not famliar with Dynamic DNS and what DynDns provices, it allows you to point a url at your home computer that will allow you to access it from anywhere in the world as long as your computer tells the dns host what your ip address is every time it changes.  Simple but very powerful.  By installing a beacon service on your computer, you keep the DynDns server informed as to the address of your computer.  All requests are proxied through their server to allow access to your computer.  When your ISP changes your ip address, the beacon tells the DynDns server about the change.  You should never have to worry about it.  However, reboots can get tricky.  When I had a usb modem and the computer rebooted, my url would no longer connect to my computer until I physically logged in and established a connection.  I was very happy when I could use my router to update the server.  Too bad its an abusive piece of ...equipment.

To get a dyn dns account, go here: https://www.dyndns.com

create an account, then add a host to dynamic dns.  It will detect your ip address right there.  I won't go into detail about setting up wireless routers and port forwarding.  You can tackle that elsewhere.

Now download and install the preferred client: DynDns Updating Client

Set up an account that points to the domain you set up on DynDns.com. 

Once it is updating and the icon turns green, go to options on the dynDns client properties window, deselect "start with windows"  and click "install service"

Then exit the client by right clicking and selecting "exit"

Go to control panel > administrative tools > Services

Find "DynDNS Updater Service" right click and chools "start"

Leave a comment if you could use more information or some screen shots.  I'll add them.  I just wanted to illustrate how easy it is to set up remote access to your home or office computer if you don't have static ip addresses to work with.

 

8/28/2006 12:14:08 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Monday, August 21, 2006
I've been practicing for a year to play one silly little song!  Sorry for the $8 cover, I guess the crowd has grown enough to command pro ticket prices. 

I'll be playing at 9:30 ish.  That means I might play at 9:15.  Anyone coming at 9:30 and finding themselves surprised that they completely missed me should be referred to this blog.  Don't come after 9:15 if you are coming to hear me.  However, all the other bands will be worth listening to as well and you can then hang out with me...  All for 8measly bucks!  wow

so check out open mic madness in Atlanta and cheer me on.  Then boo the judges when I don't advance and throw empty water bottles at Josh Rifkin.

peas

8/21/2006 11:16:10 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
Saturday, August 19, 2006

I'm taking the week off next week.  Today I was writing a spider to crawl a website and inspect the pages.  I wanted to finish this week with some analysis on my new website and then let the data gel for the rest of the week.  Unfortunately, a "Service Unavailable" event interfered with my plans.  I guess I'll blog my psuedo-failure and move on to vacation.

The spider process starts at a given url and generates a request, retrieving the response from the site.  It then uses a regex to find all the href's, creates valid urls from each of those links, and queues each of the links for crawling.  Then it de-queues each of the links and crawls it if it hasn't already retrieved that page.  The whole thing repeats for each page sleeping for 1 full second in between requests, and stops when either the queue reaches zero links or the number of pages requested exceeds the maximum threshold.  At this time it is a single-threaded, simple app that closes its connections explicitly and makes requests very conservatively.  At least I thought so.  Does that description sound like it should crash a production website? 

I ran it against a local test site several times.  Then I hit http://www.openmicmadness.com.  I then ran it against the beta rentals site.  Everything went fine, I discovered several things about the site that I wasn't aware of, and I wanted to see more.  So I bumped the max threshold to 2000 pages and let it run for a few minutes against beta Rentals.  I didn't think much of it as it can only request 1 page per second.  Unfortuntately, the beta site is now showing "Service Unavailable".  I've performed several load tests in the dev environment on the rentals site.  While I was able to load it to the point of incredibly slow response, I never witnessed a complete meltdown.  I suspect that its only hosted on one server in production and something went kah-blewy.  Since I am not given any access to tools in production, I can't diagnose the problem and since its not a production site but rather a beta, I can't justify escalating the failure.  

OK, I just ran the thing against several local website applications and my blog.  None of them even hiccupped.  I think something definitely crashed on that server but I don't think it was anything special that I did.  I just happened to be the user(s) that got the error. 

I think I'll follow Google's example and extend the spider to crawl just one level per session.  Rather then crawl the queued links, I'll serialize them to a data store and then load that back up to kick off a future session.  I'll also extend the error response to store the context of server errors, 404's and bad links. 

Another realization I had during a crawl was how easy and useful it would be to set certain criteria to search for and then retrieve that content locally for later inspection.  For example, find all mp3's on a band site and store them in a folder.  Or you might want to scrape email addresses off of a website.  My initial purpose was to inspect pages for richness of content and compliance to html standards as well as accessibility compliance.  I've wanted to write a spider for various reasons for a very long time.  I even modified the spider example found here, once upon a time, but lost that project when nAnt deleted my C: drive.  I'm pleased to be back in the crawling game, the possibilities are endless!

C# | Web
8/19/2006 7:48:59 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback

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
Tuesday, August 15, 2006

A bookmark is describes a static place in the world.  Its a place you wish to label for revisit.  Its somewhere you wish to come back because its properties still serve you some value.  I created a bookmark today that I should have been creating all along.  I bookmarked a Google search that had more results then I had time or energy to read. 

Then it occurred to me that my url was actually a search instruction to the google machine and this bookmark was, in fact, a macro.  Gives me an interesting idea for automated testing...

Web
8/15/2006 12:01:00 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
    It feels good. 

8/5/2006 6:52:10 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
I've read and been told that a transition to Agile is not an easy undertaking.  I under-estimated the resistance I'd receive to documented techniques and practices when the organizational leaders announced that it was their intention and desire to: "abandon our heavy waterfall process and go Agile."  I'd convinced myself that this was something that would be easy to sell once it came from the top.  I've come to realize, appropriately, that change takes time, even good change.  If its worth doing, its worth doing right and if it were simple, it'd be done already.

We recently had a meeting to discuss what documents wereto be authored, by who, who owned them and who the approvers or reviewers were.  A business counterpart of mine continues to ask about when "hand-offs" should occur.  Many insist that story cards are not adequate to convey requirements.  Business owners prefer a proxy from whom they channel all their communication with the team doing the work. 

I work with a left handed individual. When I sit at his computer, I cross my right arm over my left and operate the mouse with my arms tangled over one another.  Two other techniques that work much better are either to move the mouse over to the right side of the computer (revert to previous process) or to use my left hand on the mouse (adopt a new, unfamiliar technique).  I've found I am perfectly capable with my left hand operating the mouse.  However, Its slightly uncomfortable.  So I find myself crossed and bound up thinking that something must be wrong with this left-handed programmer.  I know, however, that my natural habit is the real cause for challenge and with practice it would feel more natural.  I'll have to remember to be patient and considerate of these long-established habits.

The ironic thing is that it was actually easier when everyone else stated that they were in favor of waterfall and I quietly and confidentially began researching how to manage a project with less ceremony and demonstrated the results of it in small, project by project, increments.  The first three projects lacked significant aspects of an Agile project but began to show the merits of the movement.  The most recent, http://preview.rentals.com,  lacked only frequent delivery to production.  We'd go as far as qa, then stop.  However, we were by no means fully implementing an Agile process.  We had facets of it: continuous integration, small iterations, automated unit testing, frequent communication, reflective review, collaboration, story card based development, just in time elaboration, pair programming, and others.  We still tested at the end of each iteration (not ideal) and some project contributors were outside the development process with little accountability.  We'd do sub-optimal things like extend dates to finish testing or fit a few extra features in.  Our review meetings would be postponed a week after the iteration was complete so that feedback from that review may affect work already completed.  I'm definitely learning as I go, we all are.  I am truly a fanatic about the change in approach.  However, there's a backslide happening lately...

In a book by Robert Pirsig - Lila, the author describes evolutionary change as having a ratcheting effect.  Things change, begin to fall back a bit, then they stabalize.  Then they change a little more, fall back a bit again, then stabalize again.  Stable patterns persist until mutation, or dynamic patterns, cause some change in the overall model.  If the new pattern has staying power, if it is superior, it will stick, and eventually become a static pattern.  If, however, it is unstable, it will fall back to the previous static pattern from which it evolved.  The static patterns are represented by the majority and the dynamic patterns are represented by the innovators and the rebels. Obviously, not all things persist.  Some good changes will be overtaken by a powerful competitive majority.  Sometimes several ratchets are needed to complete a massive redirection of behavior and sometimes people will have to fail before they will succeed.  Edison said that every failure is just one step closer to eventual success, or something like that.

My last note is that eternal question of: if there is no one in a forest who cares if trees stand or fall, should you bother to cut them down?  ...and if you do, should you do it your way or someone elses way?  ...and what the hell was I thinking getting into luberjacking in the first place?   I thought I was a guitar player

8/4/2006 1:58:12 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback
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, August 01, 2006

I found something interesting on my web stats today.  I had two hits on my mp3 @ http://www.vitaminzrecords.com/mp3/rusty/rusty%20-%20nothing.mp3

They were followed by 5 hits @ http://www.vitaminzrecords.com/mainweb/calendar.asp?z=1&PID=10&z_xml=rusty.xml.  You'll notice there are no events scheduled.  For now there are no shows...

The fantastic thing is that someone was checking out something I have practically forgotten about.  Even better, I've started pursuing musical interests again.  I am embarking on an acoustic duo with a new friend.  I played last weekend to a group of people I've been enjoying socializing with much more lately and I think it was mutually enjoyable.  I know I had a freakin' ball. 

So I hope to play a few shows soon. 

 

For one, yes Open Mic Madness!  I've been practicing more and this year I have no desire or hope to win it, I only plan to enjoy the hell out of it. 

 

Anyone want to go to see the best live music in Atlanta?!

8/1/2006 1:33:03 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  |  Trackback

Theme design by Jelle Druyts

Pick a theme: