ASP.Net and Active Directory: The authentication mechanism is unknown

The authentication mechanism is unknown
I recently came across this issue when working with Active Directory in ASP.Net.  Turns out I needed to fully qualify my AD access username with the domain name.  When composing a DirectoryEntry([Domain], [Username], [Password]), precede the UserName with the Domain: 

DirectoryEntry de = new DirectoryEntry("LDAP://domainName", "domainName\gerryheidenreich", "myPassword");

I'm not sure yet why this web app is behaving different from others I've written that use AD, but this fixed the problem.

8 Step Cycle of Search Engine Optimization with Blogging

We will be training our lawyers shortly on the value of blogging.  This diagram is my take on the SEO lifecycle as it pertains to blogging, and it I hope that it illustrates the concept enough for good comparison with traditional media, like articles and print.

It should also be perfectly applicable to social media in general.

Search Engine Optimization with Blogging

Search Engine Optimization is the process of using the following steps to maximize your search result ranking and areas of expertise on the major search engines.

1. Write
Your new post is given a URL to uniquely identify it on the internet.

2. Share
Start or join in on a conversation via LinkedIn, Twitter, email, or comments in another blog, by referencing your post's URL (Alt+D selects your current url, Ctrl+C copies it for later).

3. Discuss: A conversation occurs, with URL references to content in posts and articles on the web.

4. Archive: Google notices the conversations, and records ('crawls') it, following the path of URLs.  This occurs roughly 2 weeks after posting.  The actual time period varies between sites. [How often does Google crawl the web?]

5. Reward: Google identifies the topics discussed, and boosts the rankings for the participants and sites involved.  The measure of the boost is based on the size and impact of the conversation.

6. Search: 250 million searches are made on Google alone each day, across every topic (vertical) imaginable.

7. Subscribe: Over time, you will start to gain subscribers (or followers) to your content.  When you add new posts, your subscribers will be notified.  Most social networks including have some method of subscribing to their users.

8. Grow: The audience grows for future conversations by author, topic, etc.  There is a snowball effect as the cycle continues.

16 Things (I hope to pass on to my kids)...

This one is for my girls: The following is a short (and incomprehensive) list of thoughts and ideas that I hope I am passing on to them (It's hard to tell, once you're in the trenches).  They are all based on my own personal experiences, and are listed in no particular order:

Note, I consider these above and beyond the usual things like being financially responsible, and looking both ways before crossing the street, etc...

Follow what you love. It will naturally balance out the rough parts through life, and could give you a head-start in your education and career.
Steve Jobs 'Find What You Love']

Accept and embrace reality, the good and the bad. Practice thinking about experiences from a neutral perspective. Question your own assertions, consider the opposing perspective, learn about and avoid
confirmation bias, as well as the other cognitive biases in human nature. 
Critical Thinking]
List of Cognitive Biases]

Let nature humble you. Appreciate the grandeur in storms and mountains.
Powers of 10]

Learn how you learn, and exploit it as early in life as possible.
The 3 Types of Learners]

"Why?" is the 2nd most beautiful question you can ask. Understanding causality in the behavior of others, yourself, and of everything around you leads to a fundamental understanding of  the world that pays big returns throughout your life.
Richard Hamming 'You And Your Research']

"How?" is the most beautiful question you can ask.  Complex systems are all around us, like the weather, our economy, the internet, the language we speak, and the cells in our body.  These systems are much greater than the sum of the parts they're composed of.  Try to think about the fundamental parts, and appreciate the beauty in emergence and synchronicity.
Emergence 1 of 2], [Emergence 2 of 2]
[Scale Free Network Images]

Accept and embrace your imperfections and shortcomings. Work to improve or eliminate them, but never pity yourself for them.
Self Actualization]

Don't judge others. Appreciate the imperfections and shortcomings of others, as well as your own. Remember that the things that guide them: their circumstances, experiences, physiology, and beliefs are very different than yours.
ZenHabits: 'A Simple Method to Avoid Being Judgmental']

Don't be manipulated or controlled. Marketing is the science of manipulating you, from billboards, commercials, to all other forms of advertising. There are people that are very good at controlling the actions of others for their own benefit. The earlier you learn to recognize these people and circumstances, the sooner you will be truly independent.
[ 5 Ways to Develop Independent Thought]

Help people. If you see someone in distress, help them as if they were your child or loved one. 
World Vision]

Always be improving. Your result is a success or a lesson, but never a failure. Remember your lessons as stories that you can share with others. These stories hold more value, and are more humbling than those of your successes.
Lifelong Learning]

Get out of your comfort zone. Read a difficult book. Listen to different styles of music. Learn to cook a different kind of food. Speak to a group of people.  Jump at opportunities, regardless of how far fetched they seem. 
Evolving Times: '51 Ways to Expand Your Comfort Zone]

Contribute. Join or start a community. Volunteer your skills and time somewhere.

Don't be weakened by regret and guilt. These two emotions can wreak havoc on your mind. Learn from your experiences then put them behind you, learn to accept that "it is what it is." You have control over the present as long as you are paying attention to it.

Labels are full of assumptions. 'Republican', 'bi-polar', 'organic', 'nerd/prep/jock'... Labels are shortcuts. They are used as a way to organize things and identify patterns.  They increase the amount of information in language, but they also introduce assumptions that go with them. Be aware that labels are only generalizations, and that the implications that go with them may not be true.

Be conservative in what you send, but liberal in what you receive. Let people mis-speak, consider their intent before you assume the worst about their choice in words. Help them out of the hole they're digging. Conversely, there are a lot of sensitive people out there... think carefully before opening your mouth.  This principle provides recognized and celebrated benefits in technology, and it holds the same value when applied to people.
[Postel's Robustness Principle]


Connecting To Data
CRM, DMS, Active Directory, internet / intranets / extranets, project management, time & billing, etc... All these systems provide valuable data for our custom development here at Whyte Hirschboeck Dudek. We regularly tap into these systems to retrieve information, so writing connection strings for each system was a regular occurrence, and a pain in the neck when one of our enterprise systems changed servers, or account information for security reasons - various custom apps would break and we would scramble to update the connection info in all the right places, to the new information.

The Good Kind of Lazy
I was feeling particularly lazy one day, and decided to fix the problem for good. I put all of our connection string data into a single table on a sql server, wrote a ConnectionStrings static class to Retrieve("systemName") them as needed, and a 2 minute cache to keep performance under control. Our apps now only need a reference to the ConnectionStrings class.  No more worrying about specific machine/account details, or XML file updates across multiple config files on the network.

Consequences need to be considered carefully, but are pretty easy to live with or get a handle on.  Server/db failure can be handled with a failover, or good disaster recovery plan.  There are a couple additional db calls, which again should have minimal impact on performance if you cache your connection strings when you retrieve them.  Finally, developers need to figure out the names to connect by.  We handled this with a quick datagrid web app that retrieves the ConnectionStrings table contents for reference.  Any arguments about security have better counter-arguments, especially when you consider that you can now change the way you retrieve connectionstrings easily (web service, xml file, hard-coded in the dll, encryption, etc), and therefore evolve your security for everything at once.  Furthermore, security accounts on these systems can be updated without fear of breaking custom apps.  The new information can be updated easily in the ConnectionStrings table.

The benefits, off the top of my head:

- Connect semantically to our systems (by name & context), Retrieve("DocumentManagementSystem") instead of the traditional method "...server=ObiWanKenobi04..."

- Connect in the code (why not?), instead of in an XML file somewhere

- Single point for {failure & recovery, security, monitoring & auditing}

- Integration across systems feels more natural, less fragile

- DBA can manage connectionstrings and account security, and just provide meaningful names to the dev team

- Log ALL connections retrieved, by application, user, & time

Wrote an Inverted Blog Engine

50+ Practice Groups, across the entire spectrum of legal services.  It is difficult to write a solution for one group, that is useful or even applicable to the others.  Abstraction is an extremely important tool around here.

Content Managment
A few years back, when we were rebuilding our website, we abstracted the idea of web content down to a very basic level, then made it extensible.  New content types were created by a few simple instructions.  Content mainly contained a title, body, and was associated with various practice groups and lawyers.  Content types like news, press releases, and articles were a slightly different spin on the same formula.  The content manager interface rendered itself, appropriate to which content type was currently in context.  It worked nicely, and was only a little more difficult to write than a static content manager would have been.

'Original Content'
Culturally speaking (and this should go without saying), a mid-sized law firm blogging is a difficult concept to sell.  We are a pretty savvy group when it comes to tech, but some things just need to surface on their own.  We created 'Original Articles' instead: Blog posts with the format & depth of formal articles, that were reviewed and approved, and did not allow comments or syndication.  For the meantime, we were getting content in, which got the ball rolling for blogging.  As lawyers and our Marketing Department posted Original Article items, they associated the content with authors, practice groups, and keywords.

We started hearing murmers from the law geeks that wanted to blog.  Some associates had personal blogs.  Their friends and colleagues had Twitter feeds and law blogs ("blawgs") of their own.  The Tech Law team led the charge, and we purchased  At this point, we were looking at a 3rd party solution, or possibly something custom that was separate from our website.  This route would have led to a few different complications that would have hurt our chances of this being a success:
- New content management per blog (1 post that applies to Intellectual Property, and Tech Law would need to be posted separately in each blog), new app for lawyers to learn & manage
- SEO symbiosis between the blog sites and would be a missed opportunity.  Inbound links to the blogs should help our main domain.
- Tagging, categorizing content takes work

We decided to keep the solution in-house, and build off of what we already had.  We created a 'Blog' content type, wrote in support for comments and a slick approval system so the author can approve from their Blackberry, and a generic page to generate rss feeds depending on the context of our visitor. 

Our lawyers can now write blog posts just like the Original Articles they were already familiar with.  They make their regular practice group and author associations as before, and possibly add some keywords.  As soon as their post is approved, it appears on our main blog stream.  If there is an associated practice group that has never had a post before, it shows up automatically as a new blog in our nav bar.  Feeds can be created and consumed by practice group, author, or even keyword.  In the end, we have all the features of a blog, without any extra work on the lawyers' behalf.

I am amazed at how few people understand syndication and subscriptions, especially considering that the icon is literally everywhere.  It may be another couple years before people start to see the value in it.

Aggregator is a painful word for such a cool idea... I think I will try using reader more, though I think it sounds too passive.

The law industry is really buying into social tech, especially blogging, Twitter, and LinkedIn.  The community right now feels very much like the developer community did, 5 years ago.  It is refreshing.  Maybe it's just me though, as I am watching the legal sector while these technologies are finally going mainstream.

Thoughts on Social Media For Mid-sized Businesses

I was asked to provide some quick insights on the pros/cons of social networks as they apply to busineses:
 - Networking on a global scale
 - Indviduals develop & strengthen marketing skills & awareness (Professionals market themselves more often, more effectively)
 - Search engine optimization (if we link back to our website often)
 - Access to realtime news, industry-specific activity
Drawbacks, Concerns:
 - Potentially global audience includes adverse parties, so training is important
 - Personal activity reflects on the Firm
 - Frequent change, new social networks appear often, and and turn over quickly
 - Social Network services are decentralized, 3rd party, difficult or impossible to manage internally
Some law-people on Twitter (create an acct, and follow them, and if you want, me)
(and their comments for why they think Twitter is valuable to them)
Kevin O'Keefe is constantly providing fresh insights into social media as it applies to businesses, marketing, and law. 
Craig Niedenthal, Birmingham, AL, trial attorney focusing on products liability cases:
"Use twitter to make contacts of other lawyers and those in other fields i.e. tech, marketing, to help me grow as atty and person"
Tony Hartsfield, Co-founder, Society of Legal Learning Professionals; Sr Analyst, Learning Systems at Bryan Cave LLP:
"Twitter keeps me informed on trends & issues in legal IT."
Lindsy C. Doucette, lawyer, Omaha, NE:
"it's my foray into social media 2.0 - I'm seeking examples of how to use the web effectively and I'm developing relationships."

Enterprise Integration with POCOs

Our custom development here at Whyte Hirschboeck Dudek regularly requires integration with our enterprise systems, from Active Directory to Time & Billing, our custom Marketing Dashboard, Document Management System, Customer Relations Management, etc...

A few examples of data we may regularly need include:
- Contact information
- Member of a security or distribution group in Active Directory
- Current secretaries assigned to lawyers, or vice-versa
- Who is associated with what clients and projects

A small disclaimer: we are lucky to be in a Microsoft house, with Visual Studio 2008, Active Directory, Exchange, (mostly) SQL 2000 & 2005, and some APIs to play with.  Our systems are positioned to play nice with each other.

There are so many different infrastructure frameworks, paradigms, and architectures that it is overwhelming to try to keep up (just learning about them, never mind putting them into production!).  Sure, service-enabling your enterprise with SOA seems to fit the bill through total abstraction, but the up-front costs are huge, and the ROI is uncertain at best. 

As you probably know, POJO is a formalized ('Fowlerized") term for a 'plain old java object', and POCO is the CLR representation (PORO is Ruby, etc).  It is a domain entity that carries no special baggage.  It doesn't extend anything or carry any dependencies on other frameworks or methodologies, only the CLR.

When writing the application itself (a webpart or user control, clickonce app/utility, extranet, report, etc) 100% focus should be on the application's purpose and logic.  I should never have to tell the application what a Client is, just that I need one.  I shouldn't have to say that a client has matters, my client object should expose that for me!  Also, I don't want to get my objects by writing up services, proxies, ORM metadata, and various providers unless it is absolutely necessary.  I know these things are what's cool, and I need to grow up, but I like simplicity: I want my app to be as simple as possible to develop, and I want anything written outside the bounds of my app to be available as a single .dll file that describes my business entities so they can be reused later by other projects.

.Net provides some amazing capabilities for wiring an app together: Lambdas, LINQ, Extension methods, Generics, System.Converter<T1, T2>.  It is much more capable than it used to be to work with objects quickly and easily on its own.  (With this in mind, I am anxious to see what the Entity Framework does for us as far as value:complexity!)

The following explains our approach, starting with the fundamental bits in our framework, the core library...

Enterprise Core Library
The foundation of our enterprise integration efforts.  The classes contain regularly needed functionality like:
- Logging (to a single EnterpriseLog table)
- Connection strings to various systems (SQL, Ldap, Service URLs)
- Email, Notifications
- Active Directory querying
- ClickOnce helpers (add to startup, autoupdate methods, etc)
- SQL access methods for reading and executing SqlCommand objects.
- List to RSS mapping

Our custom apps need a few keys in their .config, to access Active Directory, and to access our WhdEnterprise.ConnectionStrings table.

ConnectionStrings  (here is my post on this)
Connecting to a system from our apps are trivial: ConnectionString.Retrieve("TimeBilling") grabs the appropriate string from the WhdEnterprise.ConnectionStrings table.  When (not if) the Time & Billing system moves servers, update the row in the table instead of mass-updating config files for all broken apps that use it.  A dictionary cache exists to keep performance from being an issue.

ConnectionStrings may be used for more than just databases... consider LDAP string for Active Directory, and URLs for web services.

One of our most fundamental objects is in our Core library: WhdUser.

WhdUser.Current uses Environment.UserName to identify the current user when needed, and optionally (lazily) grab email, phone extension, and computername from Active Directory.  

Once the current user is identified, a domain-specific user can be instantiated (ex: List<Client> clients = TimeBillingUser(WhdUser.Current).Clients).  Each system has its POCO user object, and controller to retrieve the relevant domain-specific info.  Our time & billing system for instance, has a TimeBillingUser, which may have properties and methods like Secretaries, Clients, Projects, HoursWorked(), HoursBilled(), HoursCollected(), etc.  This data is lazy-loaded when appropriate.

Organic, Evolutionary library growth
"We stress the importance of creating objects not to meet mythical future needs, but only under the demands of the moment. This ensures that a design contains only as much information as the designer has directly experienced, and avoids premature complexity." - Kent Beck & Ward Cunningham, A Laboratory For Teaching Object-Oriented Thinking

We extend our libraries only as needed, to meet current requirements.  The caveat is that we must keep our libraries backwards-compatible.  This can be accomplished easily by writing tests as the library is developed, and making sure those tests stay with the library project, and are run every time the project is extended.

For example, to get a list of our most active lawyers, we may write a library that contains objects for Timekeeper, and Timecard, then map these into our Time & Billing system that contains our timekeeper and financial (hours worked) data.  At a later date, we may need a list of clients a lawyer does work for, so we would create a Client object, and map it into the appropriate table(s).

At this point, we have a single DLL (Whd.Enterprise.TimeBilling.dll) that is deployed with the new app.  Other deployments of this dll used by other apps are older, but they were deployed with the requirements that app needed.  With tests in place, those older apps should not have to worry about the new TimeBilling library being incompatible.

This is a controversial idea, and my naming could be better (not to be confused with MVC controller), but it works very nicely to develop against (especially with Intellisense).  Each enterprise object has 2 classes, the POCO (plain old CLR object), and its controller class (Client, and ClientController respectively).  Controller classes are full of static methods to do the work. 

One of the key methods in the controller is Read(), which does the object-relational mapping.  The Read() method is delegated to the Core's Sql class to handle, and returns the appropriate POCO it's responsible for.  Other methods are added as needed, and if the controller class ever gets too big or busy to work with, it can then be refactored out to partial class files.

Pragmatic App Development
From the app-developer's perspective, integrating with the enterprise should be as simple as possible:
- Add projects to my solution for each library I will be using, extend it as needed to fulfill my needs (or just reference the dll!)
- Reference the enterprise projects in my app's solution.
- Simplest possible namespace structure as possible.  Ideally, "WHD.Enterprise." opens up all of the domain objects and controllers I would ever need.  
- [Object] & [Object]Controller is the only enterprise-related pattern I need to understand. 
- Centralized logging (Logging usage has proved its value already)

Hopefully this is a good start to explain my thought and dev processes.  Don't hesitate to post any questions and/or criticism, I am sure that in future posts I will delve deeper into some of the bits, maybe even post some code.

Internet Explorer 7 stops working, Firefox works fine

Ran into this issue yesterday morning, spent 2 days doing virus & malware scans.  IE7 stops working, as does all HTML references from Outlook html emails, as well as ClickOnce deployed update checks.

When entering an address into the IE7 address bar, I would get one of the 2 following messages:
"Address not valid"
"Internet Explorer cannot display the webpage"

I'm not the only one with the problem, there are a lot of cries for help on this one, and there was a definite pattern to the responses,
1. Why would you use IE?  Use Firefox!
2. "Problem SOLVED, I reformatted!"

I finally found my problem buried in my LAN settings.  In Control Panel > Internet Options > Connections tab > LAN Settings... "Automatically Detect Settings" had gotten unchecked.  I know for a fact that I wasn't futzing in around in there, and I haven't figured out what happened exactly, but re-checking that got me going again.

I don't know if I will ever figure out what happened, but maybe this post will help someone out.

WPF Running Code on Startup

WPF Post #1 from a complete WPF n00b.  Strange, I feel like a complete loser that has to start a WPF how-to blog post with a defensively-toned comment about how it seems that everyone but myself has mastered WPF by now, and I haven't even considered putting it into production here yet...  (Much of the stuff I am learning is buried inside various discussion forums, and in 2-year old blog posts by the early-adopters).  I'm not going to do that though.  Instead, I'll keep this post short & sweet for my own future reference, by jumping right into the steps and follow up with an in-context example of how it is being used in @shanselman's blockbuster WPF app, BabySmash.

Hooking up a WPF App's startup event handler in Visual Studio 2008:

New WPF Application Solution

Double-click on App.xaml in the Solution Explorer

The XML begins by declaring the Application element.  Add a new attribute inside, called 'Startup', and VS should prompt you for a "New Event Handler".  Hit enter, and the Application_Startup event handler is created in the codebehind.  Rt-click on the "Application_Startup" value, click "View Code" to jump to that method in your code.

In Context: Scott Hanselman's BabySmash (Download the Source)

In Scott Hanselman's BabySmash Application_Startup method, his BabySmash.Controller class was created and .Launch()ed.  Inside Controller.Launch():
- Initialize app Timer event handler(s)
- ClickOnce update-checking / update-complete handling
- Define the BabySmash window style & behavior, including mouse click & wheel event handlers.
- Load App Resources
- Handle command-line args
- Start app Timer

GiveCamps: Geeks Giving Back

Overview: A Give Camp is a gathering of professionals (developers, graphic designers, database ninjas) that volunteer their time and resources to design and implement solutions (websites, applications, content-management systems, etc) for various charities and non-profit groups.  Proposals can be submitted by non-profit groups and charities before the camp, and they are reviewed and selected, and teams of volunteers are organized to represent a project, create a plan and execute it, all over the period of a single weekend.

Projects / Features:
Web sites, new sections
Access Databases
Mobility Projects
New Content Management System (Graftiti, DotNetNuke, Sharepoint)
Membership Tracking App
Paypal integration
Social Media Presence & Advocacy

Volunteer Qualifications:
Most importantly: A desire to contribute
Development experience (any level of expertise)
Database Administrators
Developers! (.Net, Java, C++, PHP, Excel, Html)
Flash Developers & Designers
Social Media

Other GiveCamps:
- Indianapolis, Indiana, January 23-25, 2009
- Milwaukee, WI, TBD (Nov-Dec, 2008?), Scott's announcement
- Northwest Arkansas .Net UG, TBD, Jay's announcement

- Dallas, Texas, January 18-20, 2008
- Kansas City, April 25-27, 2008
- Ann Arbor, Michigan, July 11-13, 2008

Important URLs:
- We Are Microsoft: 18 projects for charities (brief case studies! - click links to see project details)
- Jennifer Marsman's review of the Ann Arbor Give Camp
- Twitter chatter "givecamp"
- GiveCamp Facebook Group

- Chris Koenig, Dev Evangelist @ Microsoft, Founder of first GiveCamp
- Jennifer Marsman, Dev Evangelist @ Microsoft
- Dave Bost, Dev Evangelist @ Microsoft
- Larry Clarkin, Architect Evangelist @ Microsoft
- Scott Isaacs, President of WI .Net Users Group, leading up GiveCamp MKE
- Paul Hacker, leading up Indianapolis GiveCamp
- Jay Smith, President, Northwest Arkansas .Net User's Group

Accomplishments to date:
- GiveCamp #1: "We Are Microsoft" 18 projects from the first GiveCamp in Dallas, TX
- GiveCamp #2: "Coders For Charities", Kansas City, Missouri (overview)
- - Boy Scouts Troop 813
- - Berean Bible Church
- - Task Force Omega of MO
- - Missouri Pit Bull Rescue
- - Metropolitan Org to Counter Sexual Assault
- GiveCamp #3: Ann Arbor, Michigan (15 projects, charity names only, no details found)

Getting Started:
The GiveCamp cookbook

Media Coverage, spreading the word:
- Local news (Kansas City Fox 4)
- Press Release (Kansas City)
- Radio (Kansas City, Dick Dale Morning Show)
- Twitter
- Blogs
- Camp homepages

This post will be updated as I find more info for each section, and I will have a series of posts on our Milwaukee GiveCamp as it comes together.  I am sure I have missed people and news, but this should serve as a good start to encapsulate the GiveCamp movement as it takes off.

If The John Galts Spoke Like Steve Jobs

1. I would buy into Brandstreaming (uhhh... if they let the JG-types out of their caves to do some streaming). [Pheedo coins the term] [RWW gives it some love] [Twitter chatter]

2. Mesh [clients/"platform experiences"] could see some serious adoption among regular people, many of which have more than 1 pc, iPhones, Blackberries, Windows Mobiles, and Macs in the family. [Mesh blog] [ blog]

3. Atlas Shrugged would only be 1140 pages and we would all be objectivists. [Amazon, highly recommended] [Objectivism wikipedia]

My initial thoughts about Mesh...

Update 7/28/08: LiveSide (, or Twitter @liveside) posted that Mobile Mesh is out in a limited capacity (no folder IO sync yet), from your Windows Mobile, Blackberry, iPhone, or Symbian.

Update #2 7/29/28: Mac client was out briefly today, but was quickly brought offline.   Screenshots for this & mobile are at

First and foremost:The platform sells itself: The key is getting people to install the client,  add something to their Mesh from one device, and  'consume' it from another.  Nevermind the details, they complicate things.  Erick at TechCrunch stated in April that Mesh is 'aimed at developers'.  What?  Why are they aiming? Throw it out there with some simple user stories and see what happens.  Share photos, back-up your important stuff, access your favorites from any computer, write your own news stream.  It could be compared to the functionality of many social apps:  flickr, google docs, twitter, all the recent sync/backup services (that's the trend lately I guess)...

Wish my Blackberry had a Mesh client.  I would love to sync images/videos taken with my camera, view files from my laptop, home pcs, work pc, from my blackberry...  Mobile clients are due in late '08.

Wish Mac had a Mesh client.  My boss has shifted to the Mac camp, and I don't really blame him.  Ours isn't the only enterprise with a chance to convert from MSFT to Mac/Linux in the next 3-5 years.  Non-windows clients for the Mesh platform won't keep this from happening, but it will reduce the growing 'painting myself into the corner' feeling that MSFT technologies tend to have.  Mac clients are supposedly due for release late this year.

Source control??? Sharing of files & folders, reporting, versioning, syncing, and for extra credit: realtime collaborative authoring (at the very least, via remoting)???  Still unsure about how many requirements Mesh meets here, still playing around with it.

Smaller bits from the blog team: This is probably rediculous, but Twitter is ruining my taste for verbosity.  I guess there should be some detailed anchor content that is thorough, and it's as good a place as any.  I have to wonder though: If the Mesh team posted more frequently on much smaller stories and concepts, Mesh adoption may increase, and the details would flesh themselves out via posts from the developers they're targeting (like me).

Public Mesh: It may not be practical in a Mesh topology, but it would be cool to be able to watch how other people are using Mesh, and it may create opportunities to broaden networks.

Competing with Google: MSFT needs to go live with a model that makes me feel like they're giving it away.  I am sure they will have priced tiers for their services, but the 'free' service should be generous enough that I don't feel like I get more from Google.  Let people appreciate the value of the cloud before they are even asked to pay for it in any way.

Hotkey: I love notifyicons, but I love hotkeys more.  I don't like to have to hunt for my icon to view remote documents or interact with my colleagues.  It needs to become a natural extension of my Windows experience, like OS X's F12

Social net awareness: Import my friends from {twitter, gmail, facebook, linkedin}.  Mesh should give me as many opportunities as possible to bridge my social nets together - this complements its goals of bridging apps and devices.  Friendfeed does an amazing job at this, but will probably always be just a social net.

10 Years!

And here's to 60 more... I love you Jeanne.


Large File Uploads For Clients

Quick background: we have clients that occasionally need to send us very large files (up to 1gb).  We need a secure, quick, and easy way to make this happen.  FTP was designed for this, and HTTP still feels kludgy.  I'm looking into 3rd party components, services, plugins, as well as considering a custom approach.  At the end of this post are a few links out to some other HTTP solutions, and some blog posts on the topic.  Here is my initial solution, which uses FTP, hands the control over to our users (as opposed to the help desk), and gives us responsibility for the process, but requires the end-user to download an FTP client for their transfer.  Not sure yet if this is a good trade-off...

Business Process for Large File Transfers with FTP
Request: From lawyer, from their Marketing Dashboard:
- Client and Project ID
- Email of contact at client
- Duration to keep site active
- Additional Description/Instructions

Submit: (Use scriptable FTP server like FileZilla)
- Create FTP Directory for client: \\internetServer\FTPshare\clientProjectId
- Create user in FTP Server, add read-only privs to directory
- Create Destination Directory for File on File server \\fileserver\files\FTP\clientIProjectId
- Add a monitor for the file upload to complete (internal service we have running) and notify lawyer when done
- Email client with URL to page with FTP client download link & instructions

Receive: (FileWatcher service sees new file is complete)
- Move file into Destination Directory on file server
- Remove FTP directory, instance, external user acct
- Email lawyer to notify that file is transferred, with link to file on file server

Existing solutions and posts on the topic:
Interestingly, TechCrunch made 2 announcements today related to uploading large files over http, regarding, and YouSendIt.

Outlook (as of today!)
YouSendIt Outlook Plugin, [TechCrunch announcement]

HTTP Services:

HTTP Custom controls:
AJAX Uploader
NeatUpload ASP.Net Component
Telerik's RadUpload

Blog Posts:
File Upload With ASP.Net
Why Are Web Uploads So Painful?
The Dark Side of File Uploads
Large file uploads in ASP.NET

Depot, an exercise in Community-Sourcing

No downloads or pics, just a quick rundown of a very cool app idea while it's in my head.

About a year and a half ago, I wrote a small winforms app.  It's stayed very rough around the edges and hasn't gone anywhere from the original prototype.  This prototype (I called it Depot) was written as a proof-of-concept of the simplest possible community-sourced bookmarking / tagging / searching tool that could possibly exist.  A self-organizing business-specific link / text library could provide immense value to a company.

Depot hinges on 4 basic features common with collaborative apps:

1. Producing: Adding content in the form of URLS and/or text (2 different fields that can be used individually or combined)

2. Tagging

3. Searching for any item by any combination of title words or tag

4. Sharing: All content is automatically shared, and open to edit & extend, by anyone within the network

The search is an autocomplete textbox, that works with any combination of title words and tags.  Typing 'catering' displays all catering items, but as you start to type 'catering madison', the suggestions filter appropriately.  As you would expect, changing the text over to 'thai madison' updates to items tagged or titled with thai and madison.

The url + text fields is an interesting feature - a user may want to toss in a quick note for a catering url someone else added, like "Beware the red curry!!!".

The app seemed to work beautifully, but the algorithm is not built to scale up yet.  Everything is cached heavily on the client-side.  There are no concurrency checks.  Also, to be fit for production, it will need some kind of user-auditing, history, and probably some kind of browser integration (or at least bookmark / favorites sync).

I don't know yet what will become of Depot.  I hope to find the time and motivation soon to dust it off and start polishing it up for a pilot group.  If nothing else, I got an ornery hog of a tag-search algorithm that may come in useful someday.

Cynical Spolsky - Why Mesh Might Work

Joel Spolsky has written a rather bitter post about Microsoft's Mesh architecture [Architecture Astronauts take over], and why it is bound for failure.

My 2 recent posts are on topic:

1. In Ideas Are Cheap Right Now, I center on the fact that new social network apps are a dime a dozen.  MySpace has given the regular everyday lay-user an entry point into the social networking world.  In the last few years, I have signed up for, played with, and forgotten about far more networks than I currently use.  Too many accounts, not enough time.

2. Shrinking the 'App Surface' - Microsoft Mesh considers Mesh as a solution to this NEW problem: New networks are built every day, old accounts are forgotten, information is lossy due to the surface of applications we have available to us.  Mesh provides a single space to manage our incoming feeds, as well as update our own feeds.

Why Mesh Might Work
Overwhelming number of online applications to use: Even new models show up every day.  For each new model, there are interest-specific clones built. introduces the model, is a .net-specific vertical representation.  MySpace introduces a new model, represents a cooking-specific vertical, and represents a fishing vertical.

Mesh speaks the language of the Web.  Hailstorm did not:  RSS is passed out like digital candy from every new site that pops up... Hailstorm did use XML, but you still needed to wire it up to your apps (writing service layers or transforms, etc).  With RSS (and SSE, which is based on RSS), the wiring is automatic: you just provide the feed URL. 

Mesh will be free: This, combined with the ubiquity of the RSS protocol means a much lower barrier to entry for regular people.  Hailstorm was not going to be free.

Enterprise integration:  Syndication libraries like the open-source Argotic Framework make it relatively easy to feed-enable just about anything.  (I am keeping WCF and SOA out of the conversation on purpose, as this is more about bridging users to data than data to data).

Regarding Spolsky
I have been a big follower of JoelOnSoftware for many years (I even bought his books), and as I have pointed out in recent posts, I am excited by what he and Jeff Atwood are up to with  I can't imagine those 2 minds not coming up with something new and exciting for us.  I am disappointed in his anti-Microsoft propaganda, which adds unnecessary and negative noise to his good technical and business writing. 

I think that is capable of enabling a strong industry-wide positive feedback loop in the community, regardless of platform, company, or favorite language of their user base.  I would hate to see the effectiveness of the project dampened by Joel's political shenanigans as more CodingHorror readers (primarily Microsoft developers) start paying attention.

Shrinking the 'App Surface' - Microsoft Mesh

I have lost track of how many social networks I'm involved with.  The 'app-surface' is too huge to manage.

In my work, we struggle with a problem of custom development: another system means another place for the lawyers to worry about their data. 

We are maintaining apps that were designed for a specific purpose but are being used by 25% of the organization.  

Occasionally, I will bang out a new prototype app that may or may not take off.   It helps keep the innovation conversation going, but it broadens the surface of possible apps to work in.  This is a problem.  The solution is buried somewhere within the combination of service-enabling application data, creating dashboards and pluggable architectures, notification systems, unified communication, etc... Lately we have been talking about Sharepoint as the ultimate solution because you can wire all of your enterprise libraries into web parts and slap it all onto a single webpage.  What about mobile data then?  What about non-web types of collaboration?  What about persisting a conversation between meetings, email, and phone?  The problem too big to solve with a website.  It may be too big to solve with a platform, but it sounds like Microsoft is having a go at it with Mesh.

The Mesh is composed of 'mesh objects', which are standardized feeds (SSE, which is now FeedSync) of data.  Mike Zintel from the Live Mesh Team talks about Mesh in his "Live Mesh As A Platform" post:

... a customer’s mesh, or collection of devices, applications and data that an individual owns or regularly uses...
... one instantiation of a mesh object is as a local (shared, aka Live) folder on a PC. This same mesh object might be instantiated as a slideshow on a web site, and as preview and upload UX on a mobile device with a built-in camera. A Live Folder is but one specialization of a mesh object. A mesh object could also represent a range of cells in Excel or a To Do list that can be accessed from anywhere

I want this so bad... My collaboration post here shows where my head is at when it comes to communication channels and their disconnectedness from each other.  I think speech-to-text and text-to-speech, combined with data-to-feed and feed-to-data (bidirectional feeds especially, with FeedSync!) are going to tie things together and shrink our app-surface to a managable level.  The Mesh, as far as I understand it, is the first technology that makes this seem possible.

In the meantime we will keep juggling (and forgetting about) our socnets along with our various calendars, emails, meetings, and apps...

Ideas are cheap right now...

Random thought of the day...

Startups and mashups are all over the web, and there is no end in sight to the new ideas and social networks that are popping up.  It's very cool, but it's also overwhelming at how thin we are getting stretched.  For every new API-exposed web-app, there is another whole set of possible mashups... the possibilities grow almost factorially!  For the number of unique api-featured apps a, plus existing mashups m, the potential sum of mashups is m factorial.  The potential-app-surface formula goes something like: s = a + m!  Trillions of possible web apps with a couple dozen unique API-enabled sites... 

... play pin-the-tail-on-the-mashup, build what you come up with and hope for a positive-feedback loop in your new community, then sell out for $50 Million.


... design tweaks ...

Just some updates to make it sharper... lost the #88Fish baby blue, got this sharp #008ish blue thing going on with links, it is a step in the right direction, I like it...

What may have been

Still on the subject of Atwood (3rd post in a row) & (2nd in a row)... this is it though...

In Jan 07 I jotted some stuff down, called it (don't know if the domain was available then, it isn't now).  I wonder how close the vision is to what I had in mind?  I invisioned urls as answers, but it seems like Jeff & Joel want their own knowledge base of fresh answers.  Pasted notes from my tiddlywiki:

Digg-like community where users submit ideas or questions, and other users submit URLs as answers to them. Users can endorse questions, as well as responses. Each user has 2 scores: QEndorsements, and AEndorsements. The front-page effect is used for 2 lists, both chronological: Left lists requests (ideas/questions) that have passed some threshold of endorsements, and Right shows Responses that have exceeded some threshold of answer endorsements. Users can subscribe to filtered sets of questions and/or answers. Submissions (requests or responses) can be categorized, described, discussed, and tagged. Users can subscribe to their own sets, which may be as simple as all requests that are either tagged 'movie' or categorized as 'movie'.

Use Cases
- Submit new Idea or Question (request submission type)
- Submit new response (as url, to a request)
- Create filtered set for request
- Create filtered set for response
- Grab feed url for filtered set

- View set
- View front page (requests, and responses)
- Endorse request
- Endorse response

Db Tables
- SubmissionType {Request, Response}
- FilterType {EndorsementCount, CategoryType, SubCategory, Tags, UserEndorsements, UserEndorsements, User, Filter}
- CategoryType {Technology, Science, World & Business, Sports, Entertainment, Gaming}
- User
- Submission
- UserEndorsement
- UserFilter (UserSet)
- SubmissionTag
- SubmissionSubCategory
- UserSubmissionTypeScore = joelonsoftware + codinghorror

Jeff Atwood has paired up with Joel Spolsky and today they both announced, a new community support site that doesn't exist yet... but will be run by Jeff, created by the community for the community, and narrated weekly via podcast.  Looks like a digg-like structure where diggable items are answers to questions posted by the community.  Submit questions, submit answers, vote for answers...

[Jeff's announcement]

[Joel's announcement]


[podcast #1]

This will be interesting...

.Net Open Source

I finally had time tonight to scrape through Jeff Atwoods spreadsheet o' candidates for his Open Source .Net grant.

ScrewTurn Wiki got the $5k (+ $5k more matched by Microsoft),was a great choice... it is the only wiki I have ever considered putting into production.  There were some awesome projects in the list (even nProf, but it's dead now, 404 and all), quite a few new ones I'd never heard of...

I've played with most of these before, just laying down single list of them on my site:

nHibernate - ORM framework that's been around forever



Prof-It for C#

RSS Bandit

MEDIAPORTAL - Haven't played with this one at all, but it looks promising

They're coming right for us!

Milwaukee news has been going on about cougar sightings, like this one from about a month ago... Lists of local cougar-related news are here and here.

From that article: "According to the DNR, the last known wild cougars in Wisconsin disappeared in the early 20th century."

Today (via Guy Kawasaki on Twitter), a 150lb cougar was shot and killed just south of here, in Chicago.

From the Gospel of Wikipedia:

... large male territories of ...58 to 386 sq mi...

Male ranges may include or overlap with those of females but, at least where studied, not with those of other males...

Cougar is also known as puma, mountain lion, or panther...

I wonder how likely it is that it's the same one...

My thoughts went, "Why did they kill it? Chicago cops should have tranquilizers", which triggers the segue to:
Peppers: She's a beauty, ain't she?
Frank: Yeah, what kind of gun is this?
Peppers: It's a tranquilizer gun. If any of these little f***ers decide to freak out on the kids, I get to take them down. Ain't that right?
Peppers: [yank's on the mule's reigns]
Peppers: Oh, what? That's what I thought. Shut up.
[Frank cocks the gun]
Peppers: Hey, hey. Careful with that. That's the most powerful tranq gun on the market. Got her in Mexico.
Frank: Cool.
Peppers: Yeah, it is cool. They say it can puncture the skin of a rhino from...
Frank: [Frank shoots himself in the neck with the dart]
Peppers: YES! That's awesome!
Frank: What?
Peppers: You just took one in the jugular, man.
Frank: What? I did.
[feeling his neck]
Peppers: YES!
Frank: Oh my god. Is this bad? Is this bad?
Peppers: You better pull that s**t out man. That s**t is not cool.
Frank: Wait. What? Pull what out?
Peppers: You got a f***ing dart in your neck man.
Frank: [laughing] You're... you're crazy man. I like you, but you're crazy.
[imdb old school quotes]

The Thirsty Developer, Project Euler

I can't believe that I didn't post about this!  My site was acting up when we did this, so I probably didn't have a place to post it.

Larry Clarkin & Dave Bost from Microsoft have a podcast called The Thirsty Developer.

Back in December I met up with Larry, Dave, and Damon Payne at the Ale House in downtown Milwaukee to talk about Project Euler.  I remember having a lot of fun, despite being a bit nervous (my first experience on that side of a podcast!).  It was very loud in there as well; I think Larry did a great job of editing.

[Here is the Project Euler episode]

[The Thirsty Developer]

[Subscribe to The Thirsty Developer Podcast]

[Subscribe to The Thirsty Developer Blog]


Reading, Writing, Arithmetic, and Business

The land of opportunity, land of the free. The land of 40 million children between the ages of 5 and 15. The land where 85% of those children go to public schools [1]. 34,000,000 creative, open, trusting, impressionable minds with little or no education in business or financial responsibility.

There is something that occurs in a small percentage of these children. It is unfortunate, in this country, that it is such a small percentage. It is also unfortunate that by the time it happens, they are no longer children. They get the itch. It is opportunity. It begins with an idea, and often ends in a lesson. Whether it is the wrong ideas or the wrong execution, these lessons can be expensive. The expense is some combination of money, reputation, and time. The amount of this expense is proportional to the age of the recipient. The younger the student, the lesser the expense, and the easier the recovery.

Business is not about calculus, sociology, or accounting. For that matter, it is not about reading, writing, or arithmetic. In fact, it adds context to every other aspect of education. Math now has a purpose. Reading, writing, and typing provide communication skills that can be put into real practice. It is engaging, like a child's game. There are risks and rewards, tactics and strategies, successes and lessons. There are no prerequisites to learning these things. The concepts are as effective to a grade schooler as they are to a college student. It is easy to teach that business is about the exchange of money, for goods, services, and information, in a mutually beneficial transaction. It is easy to describe demographics, product positioning, reputation, relationships, profit, expenses, and negotiation in simple terms.

Twenty years ago, our trial-by-fire was the Lemonade Stand. Over a couple summer days, we tossed some lemonade together and sold it for a quarter a cup. The new Lemonade Stand is online. Services like Ebay and Amazon, and Google's AdSense provide an inexpensive, flexible point of entry into business. With a little guidance, any child could set up an account and start selling online.

In the land of the American Dream, opportunity is everywhere. Unfortunately, most people are oblivious to it. I strongly believe that it is our obligation to our children and our country to illuminate the young minds in the ways of business and financial responsibility.

[1] U.S. Census Bureau,

©2008 Gerry Heidenreich