Wednesday, June 18, 2008
Posted on Wednesday, June 18, 2008 7:18:43 AM (Mountain Daylight Time, UTC-06:00)  Comments [1] | 
Categories: Productivity | Software

We recently moved from using Exchange to Google Apps. The transition has gone really smoothly, but there have been a few hurdles - mainly surrounding synchronization of Mail and Calendar across multiple devices.

While the Google Apps are all web-based, accessing them in a browser is not always an option - particularly when on airplanes. Additionally - if you rely heavily on your calendar for reminders like I do, remembering to keep a browser open on your calendar page is just one step too many. ;-)

So - here's my device situation:

devices 

Under Exchange, my notebook and workstation would connect to Exchange for email and calendar, and synchronization was automatic. My phone would pick up email via IMAP to Exchange, but the calendar was synched when I connected the phone to either PC via a USB cable. Overall pretty good, but the calendar synch to the phone was a little more involved than I'd like - why not synch over the air?

Anyhow, with the move to Google, I can of course access mail and calendar from all three via a web browser. This is fine for email on the PC's, but a little less than optimal for the calendar. Needing to have a calendar open to get reminders is not good for me. Call me old school, but I like Outlook - as far as email and calendar go - it works for me. 

Connecting Outlook with Google Apps

Actually getting a single instance of  Outlook talking to GMail via POP or IMAP is pretty easy, and well documented. If you use IMAP, then you can have multiple clients systems connected and everything is synchronized for you.

The calendar is another matter. For PC's you need to run the Google Calendar Synch, which will copy items between your local Outlook calendar and a Google Calendar. It does the sync on a scheduled basis, so there may be some lag, but since you are planning things in the future, a 10-30 minute lag should not be a big deal.

On my phone, I'm using Mobile Outlook connecting to IMAP for mail, along with GooSync keeps my mobile Calendar in line with my Google Calendar. What's sweet it that this works bi-directionally - over the air - something which was not an option with our Exchange setup.

goog

If you are thinking about jumping to Google Apps, I'd say go for it. The transition has been smooth and everything we need is working with a lot less headaches for our IT staff.

Thursday, May 29, 2008
Posted on Thursday, May 29, 2008 4:42:30 PM (Mountain Daylight Time, UTC-06:00)  Comments [1] | 
Categories: Fundamentals | General | Software

In this go round, we'll look at the questions related to Design Patterns...

Design Patterns

The question was "When you hear the term 'Design Patterns' what comes to mind?".

 GOF-Patterns

A majority of people did get that GOF = Gang of Four = Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides the authors of the book "Design Patterns: Elements of Reusable Object-Oriented Software", which describes recurring solutions to common problems in software design. Thick and meaty, it's highly regarded and worth reading if you have the time and inclination. Martin Fowler's site also has heaps of good info, and you're not chopping down trees to read it. However you slice it, using patters will make you a better developer, so dig in.

Pattern Adoption

I guess this one has a call to action for someone to setup a community site to document and evolve some geospatial patterns.

pattern-adoption

If people are interested, I can stand up a wiki at ArcDeveloper.net, but someone else will need to push this forward as I've got a full plate.

Model View Pattern Use

"Rate your use of Model View * Patterns" was the question.

 MVC-Usage

For those not familiar with MV* - this refers to a whole family of patterns, related to the Model-View-Controller pattern (Model View Presenter, Supervising Controller, Passive View), and the main intent of these is to separate business logic, user interface and data communications. Use of these patterns are helpful/ critical in enabling robust unit testing. I'll be writing more about patterns and unit testing in the coming months, but Martin Fowler has a (burly) overview of these patterns. You can also check out the ASP.NET MVC stuff to get the Microsoft take on this, or check out MonoRail, which is part of the Castle Project. And for a change of pace, you could check out Ruby on Rails which is rooted in this pattern.

Inversion of Control & Dependency Injection

Ok, this is really maxing out the pattern / architecture geek factor, but it's worth asking simply because this is another one of those patterns which enable unit testing.

IOC

So, with nearly 75% not knowing what this is... succinctly put, Inversion of Control and Dependency Injection patterns allow you to decouple classes from each other. This allows you to test things independently, which is critical if you want to have good test coverage. I had a series of posts partially written about this while at Sanborn, but I did not get them all polished off before leaving, and since I don't have access to the source code anymore, I'll need to look for opportunities to show some of this. For what it's worth, the ArcDeveloper.net projects both use the Castle Windsor IOC container.

Ok, I'll leave it here for now. Next time I'll finish it up with a look at Build Processes, Unit Testing, Refactoring, API Documentation and some choice comments.

Monday, May 05, 2008
Posted on Monday, May 05, 2008 10:11:49 AM (Mountain Daylight Time, UTC-06:00)  Comments [2] | 
Categories: Software

Just a quick reminder that the Geospatial Developer Survey will be closing this Friday, May 9th.

We're at 262 respondents who are describing themselves like this:

 

who-are-you

 

 

Hey this is all .NET Stuff!

I've gotten a few comments back along these lines, so I thought I'd try to clarify this a little. Yes, on questions where you get to select a particular implementation, most of the options will be .NET, with one exception - "Other". I did not do this to slight other platforms, or indicate that .NET is somehow superior.  I live in .NET land, and I simply do not know a lot about non-.NET technologies. If you are doing automated builds with ant and maven, just pick Other and write it in (15 of you already have). I'll add these into the mix when crunching the numbers.

 

When will we see the results?

Survey Monkey does a great job of crunching out some simple results, and I expect to post a few interesting things during the week of the 19th.

Thursday, June 07, 2007
Posted on Thursday, June 07, 2007 10:19:49 PM (Mountain Daylight Time, UTC-06:00)  Comments [6] | 
Categories: Blogging | General | Software

I sat down this evening to write up a post on implemeting the Provider Pattern as another plug-in strategy for your .NET applications, but before I dug into that, I did some blog reading and caught up on the GeoCommons discussion that's been running on James Fee and Steve Citron-Pousty's blogs. I'll delay the technical post and instead throw my two cents into the mix.

My Take...

As someone much more involved in the backend technologies of the GIS space, I think that James (and to some extend Steve) is missing the point. This is not about metadata, quality of data, cartography, geography, democratization, "elitists" or "high-priests". In large part it's not specifically about the tool itself. I believe we are discussing Geocommons for the simple fact that it's another element in the suite of disruptive technologies which are making waves through the geospatial industry.

Disruptive Technology

First it was Google with blindingly fast "slippy" maps based on tile caches. Slam. I would say that pretty much no one in the "established" GIS field saw that coming, or if they did they did a good job of keeping it a secret. In addition to redefining what web mapping was (particularly with respect to performance) they also changed how web mapping applications worked. Enter the javascript API and mashups. While few mashups were particularly useful, it resulted in tens of thousands of people developing and working with geospatial data. As the push-pin map frenzy has been cooling off, we are seeing more complex integrations utilizing open source backend tools to create very powerful platforms. We see greater particpation in open source projects (OpenLayers comes to mind). We see KML beginning to displace both long standing formats and nascent standards. This is a sea change for an industry where the defacto tool prior to 2000 looked like this...


These new "geospatial" developers are not thinking in the "old" ways. They are pushing technology because they don't know things are supposed to be difficult or impossible. And for those of you who may not have seen this yet - check out this video from the TED conference where Blaise Aguera y Arcas (Microsoft Research) discusses and demos SeaDragon & Photosynth. Want to bet this shakes things up in the GIS arena? If you've solved the problems these guys have, throwing projection-on-the-fly into the mix is not going to be that big a deal.

Disruptive Marketing

The industry is changing, and it's not just the technology - it's also the marketing of technology.
Would any of these discussions have occured if FortiusOne simply did a press release about GeoIQ? Or a simple demo page on their site? Heck no. We're talking about this because they created a community site to do what previously required some arkane skills, expensive software and a treasure trove of data. The site is cool, as lots of "sizzle" and yes you can do some "neat" stuff which may or may not have legitmacy/credibility. But that's beside the point. The point here is that FortiusOne has pushed things forward. Heat maps on the fly. A community site to promote the product & service. Very different. Very Web 2.0. And clearly getting lots of attention.

Change from Outside

As far as I can see, GIS - particularly the public consumption side of things - is being re-defined by people from outside the GIS industry. Why is this? Have we all be so insular that no new ideas are being hatched? Are the industry leaders so content with their position that innovation takes a back seat to stability and safe decisions? Have the elitists and priests ignored the Where 2.0 crowd, possibly at their own peril? What do you think?


Monday, June 04, 2007
Posted on Monday, June 04, 2007 10:12:28 PM (Mountain Daylight Time, UTC-06:00)  Comments [2] | 
Categories: .NET | Fundamentals | Software

During the ramp up for my current enterprise GIS development project I created a few simple VB.NET sample projects which illustrate some architectural practices I want the team to use.

The first one I'm going to share covers the creation of a plugin framework, and the use of the Supervising Controller pattern to expose user interface logic to unit tests. In order to keep the focus on the pattern, and not on the complexities of what the code is doing, this sample does not use any ArcObjects. It's just a very simple example of how you could create "property page" type functionality that can be extended via plugins.

What is a Plugin-Framework and why would I want one?

Using a plugin framework is a way to design an application so that other functionality can be added at a later time without needing to modify the original source code. Putting this in ArcGIS terms, this is similar to adding commands into ArcMap via it's plugin framework.

If you are building large complex applications, supporting a plugin model essentially enables the system to be extended in a very managed way. Thinking back to ArcGIS - by simply implementing ICommand, you can add alot of functionality into their application, and ESRI does not have to give you the source code, nor do you need to manage a very complex C++ build process.

Supervising Controller Pattern

Just a quick warning - we're diving into formal object oriented design patterns here. Previously known as Model View Presenter, this is a common object oriented design pattern.  Martin Fowler (who invented/named it) has officially retired the "Model View Presenter" pattern, and created two new ones - Supervising Controller and Passive View. You can read up on the details of these patterns by following those links, but the quick and dirty explanation is that they focus on extracting logic from an User Interface (windows or web form) into "controller" classes. (A little pattern nugget to impress your friends with: Autonomous View is the official name for  the "put all the code in the form" pattern) These controllers handle most of the User Interface logic - and since they are regular old classes - they are much easier to write unit tests for.

One of the prime reasons to use Supervising Controller is for testability. Assuming the view is hard to test, by moving any complex logic into the controller, we put the logic in a place that's easier to test. - Martin Fowler

At first blush this seems like more work - and it actually is more coding. BUT - if you write tests for the controllers (not covered in the sample), it will make your code more robust and manageable over the long term.

The Plugin Framework

The plugin part is pretty straight forward. We define an interface for the plugin, and implement it in the classes which we are going to plug-into the application.

This is exactly the same as implemeting ICommand. The difference is that instead of registering a COM class with the windows registry, we add the plugin by editing the host application's config file...

<propertypageplugins>

    <propertypageplugin name="Editor"  type="Research.EditorPluginView, Research.ExamplePlugin"  />

    <propertypageplugin name="Some Different Plugin"  type="Research.EditorPluginView, Research.ExamplePlugin"  />

  </propertypageplugins>

In order to load the plugins into the application we create a configuration section handler - which I've posted about in the past. For more details, I'd suggest checking out this MSDN article by Roy Osherove. I'd also suggest looking at the code, since there are some other interesting bits in there that I'm skipping over to keep this somewhat short.

 
The Host Application

The plugins must plug-into something - thus the host application. This is simply a windows form that will list the registered plugins, and then show the selected plugin interface on the right side of the form. The image below shows it running.


The Plugins & Supervising Controller

The plugins are located in the "ExamplePlugin" assembly. In fact there is only one plugin - "EditorPlugin " - I just register it twice. The pluing itself is a super simple text editor. As I metioned earlier, the plugins themselves implement the Supervising Controller pattern. Typically this is used with "forms", but in order to be pluggable, we are working with user controls. And to be fun, I'm using using inherited user controls.

Inheriting the user control forces a common look and feel - granted in this case, it's very simple (just the group box), but in our real app, it's got a lot more going on.

To keep things clear, I have setup a standard naming convention - the UI (user control in this case) is <somename>View, and the Controller is <somename>Controller. The interface that forms the contract between the two is I<somename>View. Looking at the class model above, we can also see that the View implements IPropertyPluginView - which means that it's the thing that actually plugs into the application.

So in this case we have:

  • EditorPluginView
  • EditorPluginController
  • IEditorPluginView

Since the Controller must manage the UI, one way to setup a contract between the two is using an Interface. The interface is implemented by the View, and consumed by the Controller. The interface simply specifies the methods that the Controller can call on the View (UpdateText and GetText in this case) and the events that the View raises and that the Controller can handle (ContentChanged and Store).


Run Time
When the form is initialized (IPropertyPluginView.Initialize()), it creates it's controller class and passes in a reference to itself as an IEditorPlugin. The Controller then sinks the Events on the interface, reads the file from disk (if it exists) and updates the text on the form. When the user edits the text the IEditorPluginView.ContentChanged event is raised in the form, and the Controller is notified. When the user clicks the store button, the IEditorPluginView.Store event is raised and the Controller gets the content via IEditorPluginView.GetText, and it stores it away.

Even this simple example could be extended, but this is enough to show how it all works.

Conclusion

While this was a whirlwind of terms and concepts, I encourage you to download the code, and play with it. It's actually quite easy to implement once you get the hang of it, and it can help make your applications much more testable. I find it much easier to look at real code than to just read the generic explanations of patterns, so I hope this helps if you are thinking about implemeting a plugin framework or Supervising Controller in .NET

 
Download the code


Other Reading:

The Polymorphic Podcast has a series of great screen casts and audio clips that go over the details of the Model View patterns. I highly recommend these specifically, and the podcast in general.

MSDN Article: Creating a Plugin Framework. This is from 2003, and deals with ASP.NET but the concepts have not changed.

Tuesday, March 06, 2007
Posted on Tuesday, March 06, 2007 2:17:05 PM (Mountain Standard Time, UTC-07:00)  Comments [0] | 
Categories: Devt Tools | Software
A while back I posted about setting up my home source control server using Subversion. The original post basically listed the steps to getting it installed.

I was just reading Omar Shahine's blog, and he noted that there is now a 1-Click Subversion setup package for Windows users. I had not heard about this, and thought I'd point this out to others. Installing subversion was pretty simple before, and now it's virtually painless.


So - if you still have a list of reasons why you were not using source control, you can strike out "difficult to install" and "cost".

Thursday, January 11, 2007
Posted on Thursday, January 11, 2007 10:21:25 PM (Mountain Standard Time, UTC-07:00)  Comments [2] | 
Categories: Software

One challenge to software developers is to keep software simple. As developers, we are both comfortable with complexity (just look at the Visual Studio interface) and have a tendency to create applications that are complex. The thing is that the end users really just want to get their jobs done. They want software that they don't have to think about. Software that is obvious and easy to use. They want one click not 5, and short-cut keys are even better. Simple is better.

When a user is given software that helps them get their job done, they will use it. If it's also simple and easy to use, they will be happy. And a happy customer is the simplest way to get more customers.

So - beyond the happy user, why should we want to build simple software? The world is complex and does not always follow simple cut and dry rules. Shouldn't our software handle all the possible corner cases? If the complexity is a necessary part of the business process, it will need to be addressed in the software. But we want to avoid unnecessary functions that are not business critical i.e. an RSS reader a parcel management system.

In the end, the level of simplification you can achieve in your application does come down to negotiation with your client, but there are some compelling reasons to avoid complexity. First, as noted above, simple software is easier to use and more likely to be used. This is a big win right out of the gate, especially if it is a new technology deployment. If it's really easy to use, the organization may also see significant productivity gains - which is a huge win.

Additionally, designing simple software forces the team to focus their effort on only the most critical elements of the system and on executing them in the most effective and efficient manner. Keeping the software simple makes it easier to write and easier to test. Corner cases and "extra" rarely used functions tend to eat up a lot of time, add a lot of complexity, and make maintenance and testing more difficult. Since maintenance of software can be 60% of it's total lifetime cost, keeping it simple can save a lot in the long run. Finally - if it turns our that some areas of the application must address more complex aspects of the business process, simple software is easy to extend.

Additional reading on "Keeping it simple"

Conversation with Ward Cunningham  creator of "wiki" - quote: "Simplicity is the shortest path to a solution"

Agile and Extreme Programming, which is focuses on skipping "big design up front" and writing the simplest thing that can possibly work, and adding in complexity only when it is absolutely necessary.

37Signals.com - a web company focused on simple solutions. They build "elegant thoughtful products that do exactly what you want, and nothing you don't". They have written a free e-book about their development philosophy called "Getting Real"

Joel Spolsky (JoelOnSoftware.com) also has some thoughts on "Simple"

Steve McConnell - author of Code Complete in addition to a number of other great books on software development wrote this article on simplicity as a best practice back in 1996

Thursday, December 28, 2006
Posted on Thursday, December 28, 2006 9:22:39 PM (Mountain Standard Time, UTC-07:00)  Comments [1] | 
Categories: .NET | Software
[UPDATE: 12/29/06 - Stephan sent me a note re: my incorrect spelling of "choropleth". At this point, I don't have time to change the code and graphics in the post, so just ignore the "l".]

As promised in my last posting, here's an example of creating a custom configuration section handler using VB.NET in an ASP.NET application (sample code is for VS2003).

In this example I needed to pull data from the config file to setup a chloropleth choropleth mapping tool. The information is pretty straight forward - what layers can be used, for each layer, what fields can be used, and what are the minimum and maximum values for those fields. The Xml is shown below...

<chloropleth>

    <layer name="Named Lakes">

      <field name="ACRES" min="0" max="1000"/>

      <field name="FOO" min="0.0012" max="0.2"/>

    </layer>

 

    <layer name="Parcels">

      <field name="Price" min="10000" max="100000000" />

      <field name="SQFT" min="1233" max="3848922"/>

    </layer>

  </chloropleth>


The corresponding class model is shown below.


The ChloroplethConfig class holds an ArrayList (if this were done in 2.0 it would be a generic List<of>) of ChloroplethLayers, which in turn holds an ArrayList of ChloroplethFields. The handler reads the Xml and converts it into these classes. Different from the C# example, these classes have overloaded constructors which allow me to pass in the Xml node from the config file, and they parse themselves. This is a nice pattern in that it makes the IConfigurationSectionHandler.Create method short and sweet...

 Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal node As XmlNode) As Object

       Dim config As ChloroplethConfig = New ChloroplethConfig

       config.LoadValues(node)

       Return config

 End Function


When you run the app, it simply loops over the collections and reports what it has loaded from the config file. Very simple, but a nice way to validate that you're custom config handler is working.


Anyhow - I'm working on another post which will build on using Custom Configuration Sections to build plugin frameworks - but I'll save that for another day.

Friday, November 03, 2006
Posted on Friday, November 03, 2006 11:59:36 AM (Mountain Daylight Time, UTC-06:00)  Comments [4] | 
Categories: ArcGIS Server | ESRI | Software
UPDATE: This post got caught up in the tidal wave of blogger spam on PlanetGeospatial, so I am re-posting it with todays date. I'm really interested in hearing what other people think about this. However, in re-posting, dasBlog seems to have misplaced the post - and along with it a comment - doh! For those who subscribe directly to by RSS feed, sorry about the repetition. -- Dave

With the upcoming launch of 9.2, I was thinking about what I'd really like to see. While the international marketing extravaganza, with canned demos of simplistic use cases will be interesting, it's not overly illuminating as to what users with "real" needs can do.

Rather I'd like to see some real live examples that people can play with. You would not buy a car without test driving it, so I'm not sure why we would expect any less from our software vendor.

Here are some ideas...

ArcGIS Server: Web ADF

Let's see a real application with large, complex data model - maybe based on the Local Government data model. Show us an editing environment customized for non-GIS pros who don't know or care about versioning. Throw in some imagery from Image Server and make sure access is managed via ASP.NET security. Sounds like a tall order, but consider that Local Governments are a prime target market, and it's not that unreasonable.

From a developer perspective, I'd love to read about how it was built, the best practices which lead to clean, maintainable, testable code. And a glimpse behind the scenes at the hardware that's powering it. This does not need to be totally public - make people login with their ESRI Global Account, or limit it further to EDN subscribers. Whatever - but let's see the beast in action so we know what we can expect.

ArcGIS Server: Geoprocessing

Although the "GP Solves all Problems" rehetoric of last years DevSummit has somewhat died down, it would be cool to see a real GP model - doing more that a trivial buffer operation or a hill shade on a limited area, running in ArcGIS Server, accessible for EDN developers. Get really daring and have it do some raster processing. 

Make the model itself downloadable so we can see how you've built it, talk about how you have optimized it, what hardware it's running on, and what it's really doing.

ArcGIS Server: OGC Services

Fire up some WMS/WFS services that have real data volumes behind them (say the state of California).  Then let the community hit it with whatever client they want to use and report requests per second, data volumes and CPU utilization. If that level of access is a little broad, show us how to limit access via a and restrict it to EDN subscribers.

ArcGIS Server: KML

If you've got the OGC Services up, add on the KML service. Let people see what can be expected with this service. Of course it's not going to be as fast as Google, but be transparent about the hardware, and load, and I think that the user base will follow along.

ArcGIS Explorer "Tasks"

With the launch of ArcGIS Explorer, it would be nice to see some real "tasks" that do something a little heavier than reverse geocoding or returning the Zip+4 for a point. How about a site analysis within an AOI? Or a network trace? Something that's actually using the analytical power of ArcGIS. Something burly because that's what people are going to expect/want when they drop cash for the backend ArcGIS Server software that will support it.

 
Overall, I'd really like to see demos that set realistic expectations. To date, the ArcGIS Server 9.2 hype has been reaching snake-oil levels:

  • Publish maps by merely thinking about it!
  • Shed pounds by sleeping!
  • Code? Nah - use geoprocessing for everything!
  • Cures hemhroids & rhumatism!
  • Run ArcGIS Server, ArcSDE and your web site all on one box!

Some reality will help everyone manage expectations.

Thursday, November 02, 2006
Posted on Thursday, November 02, 2006 1:22:53 PM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: ArcGIS Server | ESRI | Software

With the upcoming launch of 9.2, I was thinking about what I'd really like to see. While the international marketing extravaganza, with canned demos of simplistic use cases will be interesting, it's not overly illuminating as to what users with "real" needs can do.

Rather I'd like to see some real live examples that people can play with. You would not buy a car without test driving it, so I'm not sure why we would expect any less from our software vendor.

Here are some ideas...

ArcGIS Server: Web ADF

Let's see a real application with large, complex data model - maybe based on the Local Government data model. Show us an editing environment customized for non-GIS pros who don't know or care about versioning. Throw in some imagery from Image Server and make sure access is managed via ASP.NET security. Sounds like a tall order, but consider that Local Governments are a prime target market, and it's not that unreasonable.

From a developer perspective, I'd love to read about how it was built, the best practices which lead to clean, maintainable, testable code. And a glimpse behind the scenes at the hardware that's powering it. This does not need to be totally public - make people login with their ESRI Global Account, or limit it further to EDN subscribers. Whatever - but let's see the beast in action so we know what we can expect.

ArcGIS Server: Geoprocessing

Although the "GP Solves all Problems" rehetoric of last years DevSummit has somewhat died down, it would be cool to see a real GP model - doing more that a trivial buffer operation or a hill shade on a limited area, running in ArcGIS Server, accessible for EDN developers. Get really daring and have it do some raster processing. 

Make the model itself downloadable so we can see how you've built it, talk about how you have optimized it, what hardware it's running on, and what it's really doing.

ArcGIS Server: OGC Services

Fire up some WMS/WFS services that have real data volumes behind them (say the state of California).  Then let the community hit it with whatever client they want to use and report requests per second, data volumes and CPU utilization. If that level of access is a little broad, show us how to limit access via a and restrict it to EDN subscribers.

ArcGIS Server: KML

If you've got the OGC Services up, add on the KML service. Let people see what can be expected with this service. Of course it's not going to be as fast as Google, but be transparent about the hardware, and load, and I think that the user base will follow along.

ArcGIS Explorer "Tasks"

With the launch of ArcGIS Explorer, it would be nice to see some real "tasks" that do something a little heavier than reverse geocoding or returning the Zip+4 for a point. How about a site analysis within an AOI? Or a network trace? Something that's actually using the analytical power of ArcGIS. Something burly because that's what people are going to expect/want when they drop cash for the backend ArcGIS Server software that will support it.

 
Overall, I'd really like to see demos that set realistic expectations. To date, the ArcGIS Server 9.2 hype has been reaching snake-oil levels:

  • Publish maps by merely thinking about it!
  • Shed pounds by sleeping!
  • Code? Nah - use geoprocessing for everything!
  • Cures hemhroids & rhumatism!
  • Run ArcGIS Server, ArcSDE and your web site all on one box!

Some reality will help everyone manage expectations.

Friday, September 01, 2006
Posted on Friday, September 01, 2006 11:52:20 AM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | Devt Tools | Fundamentals | Software
I just saw Rob Howard's posting - Build it quickly, use it as soon as possible and make it simple - about the evolution of Telligent's development philosophy. For those who are not famlilliar with Telligent - they make Community Server, which is used on a lot of sites, including ArcDeveloper.net

I like is take on the agile mantra of "Release Early and Release Often"  - rather than release, if possible start using the software prior to release. This will help you identify usability and stability issues early. Then get it out the door as fast as possible.

Rob makes a couple really good points:
One of the biggest lessons we've learned is one we didn't really anticipate: a shift from caring less about the underlying technology to how our software solves the user's problem...

... our philosophy is: (1) build it as quickly as we can (2) start using it as soon as possible (3) make it simple.

For consultants or small software companies, this is right on the mark and critical to success - focus on making the users life easier, and create the simplest solution that can work. If it's successful, evolve it from there. If not, then you don't have too much investment.


It's also worth noting that (from what I can tell anyhow) this is more or less the approach of Google these days.

Posted on Friday, September 01, 2006 10:52:55 AM (Mountain Daylight Time, UTC-06:00)  Comments [2] | 
Categories: .NET | ArcGIS Devt | Software
Back in July I posted about an idea we had to generate a set of Geo-Objects from a Geodatabase. The idea was to effectively "hide" the ArcObjects details and allow us to work with the classes in our Geodatabase as though they were... well... classes. Real classes. We wanted to use code generation so we could skip a lot of tedious coding, and be more tolerant of changes in the model.

Anyhow, I've now got this working. It's pretty slick so I thought I'd write up a quick post about it. I'll be giving a talk about this at the September ArcDeveloper meeting in Fort Collins, and I'll post the power point here and at ArcDeveloper.net

This is basically a set of screen caps that run through the process.

Step 1: Export geodatabase schema to Xml, using Xslt to simplify it. This is done via an ArcCatalog tool...



Step 2: Create a Class Libaray project in Visual Studio, and use CodeSmith to read the Xml file and generate the code into the project folder.


Generated files in Explorer...



Step 3: Include the files in the visual studio project, and build it. For grins, you can now create a class model diagram, which we can compare to the fields in our geodatabase.



So, that's the code side of things. From here we can very easily work with the geodatabase classes without a whole mess of ArcObjects code muddying up our business tier.
Thursday, August 03, 2006
Posted on Thursday, August 03, 2006 9:54:01 AM (Mountain Daylight Time, UTC-06:00)  Comments [1] | 
Categories: ESRI | Software
Earlier this week I had the pleasure of working with Dave Peters - ESRI's System Architecture and Design guru. Many of you have likely read (or skimmed) the
System Design Strategies document which Dave authors, and been excited and/ or overwhelmed with the volume of information. We had Dave join me on site at  the Pennsylvania Bureau of Forestry to help plan for the implementation of an enterprise system we are building for the state.

System Design Planning
As part of these meetings, Dave showed us a preview of his new Capacity Planning tool. This tool takes all the logic and models from his testing and puts it into a very usable spreadsheet (which may become a .NET app). This tool allows you to quickly plug in the number of various types of users (local desktop, terminal server, ArcIMS, ArcGIS Server etc), and then calculates the expected load based on benchmark testing. It calculates both the server CPU load and the network load (megabits per second, per user). The network load is an aspect that I had not considered, but it makes sense: adding a faster ArcSDE server will not make a difference if you're network has no extra capacity!

Once the load is determined, it uses data imported from Spec.org (hardware performance testing group) which allows you to specify particular hardware configurations on which to run the system, and then it show the expected maximum load on that hardware. If you underspec the hardware - as in the max load is > 100% of the capacity - it lets you know. The simplification of this information, and the integration of the Spec data makes informed capacity planning a possibility for many more organizations (those without a full time hardware performance guru).

Upgrade Planning
What's really cool is that once the system is in place, and you are collecting actual metrics (as opposed to the model driven default values) you can adjust the parameters in the spreadsheet, making it more accurate. Then, as your user load or needs change, you can go back to this tool, load in new Spec.org infor, and make informed decisions re: the actual improvements you'll see by upgrading hardware or network capacity.

It was really great to have a one-on-one walk-through of all of this, followed up with his presentation to the whole group. Of course not everyone is going to get this opportunity. The good news is that Dave is going to present this tool and his latest performance benchmarking next week at the User Conference.

So - if you are in any way responsible for your GIS hardware or network, I highly recommend attending his talks.

ArcGIS System Administration: Choosing the Right Architecture
Wed Aug 9, 1:30 - 2:45pm - Cardiff Room, Marriott
Thu Aug 10, 3:15 - 4:30pm - Cardiff Room, Marriott

Enterprise GIS: Design & System Configuration Strategies

Wed Aug 9, 3:15 - 4:30pm - Room 15A

Wednesday, June 21, 2006
Posted on Wednesday, June 21, 2006 8:57:44 AM (Mountain Daylight Time, UTC-06:00)  Comments [1] | 
Categories: ESRI | Software
Just catching up on my blog reading, and read some posts about Web 2.0 and "Labs" by Adena at AllPoints and James Fee. One thing I think they both miss is what makes a "Labs" effort successful: customer feedback.

It's all about the money...
The bottom line is that companies are trying to sell something - in some cases it's software (ESRI, Microsoft), in others it's the advertising that wraps around the software (Google, Yahoo). In order to have people want the software it must be usable. The best way to detemine the REAL usability of something is to have people use it, and provide feedback. (While this should be obvious, it took the industry a long time to learn this).

Release Early and Often (to the Lab)

This feeds directly into a major concept in both Agile development and Web 2.0: "release early and, release often." What's implied in that statement is that between releases, there is a learning period where the company changes the software to address usability issues, and incrementally move the software forward. This is what makes a "Labs" effort successful. The result is a collaboration between the company and the clients - which is a whole lot more "2.0" than a monolithic release followed by a few years of vaccum, possibly punctuated by a service pack or two.

What about Beta Programs?
Labs should be different from a beta program. A beta program is basically a way to expand your testing team. The beta participants do not get to help set the direction of the software, rather they try the software in existing workflows to locate bugs which may not have been found in the standard regression testing. Software released into the lab, while possibly incomplete, should not be "beta" quality. The idea is to have the working part "work" and to get input on improvments and additional functions. The goal is to have your customers help refine your vision of what they want. This is really helpful unless you have a team of psychics who already "know" what the users want. (note: regardless of what they say, the marketing team is not psychic.)

ESRI Labs (beyond ArcWebServices)
Granted they have the ArcWebServices Labs, but it's pretty small potatoes in the whole Arc spectrum. What would really turn things on their head would be a Labs area relating to the core software. This would be very interesting, and would involve a major shift in the level of transparency. Right now, it's pretty reasonable to describe the company as an "Ivory Tower". Once (or twice) a year there is the week-long love fest, where it's all about the customer and everything is on the table. And then it's back to Redlands and all we see if the "Wall of Marketing" for the rest of the year. Sure they have publications, and trade shows, and betas, but all this is either driven by marketing, or weighed down by a giant NDA. There are some brave souls who do blog, but those few voices in the wilderness are a far cry from transparency. The recent effort towards having a blog seems stilted - it's unclear if this is a group blog, a marketing effort, or (shudder) user-generated-content. what. And thus far, it's pretty fluffy for  the 800lb gorilla of the spatial industry. Back to the Labs thing...

Until ESRI can have a consistent on-going real conversation with their customers, I skeptical they can embrace a real "Lab", where rapid customer feedback cycles drive the direction of the software.

Friday, May 05, 2006
Posted on Friday, May 05, 2006 10:06:34 AM (Mountain Daylight Time, UTC-06:00)  Comments [1] | 
Categories: ESRI | Software
Just a heads up to anyone else thinking of running IE7 Beta 2 - it will break ArcToolbox. I had not connected the dots on this, but ESRI Tech support mentioned this as a possible cause of my problem, and they were right.

The symptom is that when you try to open an GP Task by double clicking on in - either in a model, or in ToolBox, ArcMap will crash. No useful message, just a "Please report this to Microsoft" pop-up box. As soon as you un-install IE7, it works just fine.

This is a pain because having tabs in IE made working with our Team System portals much nicer than having a bunch IE sessions open. I have not tried running IE7 without installing it, as J noted on his blog next week. It would be cool if this fixes the problem.


Friday, April 07, 2006
Posted on Friday, April 07, 2006 7:18:24 AM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: ArcGIS Server | ESRI | Software
This edition of the Denver Developer User Group was much better, and not just because I gave a breif chat about ArcDeveloper.net & ArcUnit!

Things started off with a quick round of introductions - name, affiliation, what you are doing with ArcGIS, and I was quite suprised at how many groups were seriously looking at switching a lot of GIS functionality over to ArcGIS Server. Very cool!

The ESRI Denver guys, (Chris, Tom, and Jeremiah) did a session on setting up and installing ArcGIS server. Now this seems like a somewhat dull topic until you actually try to install it. Then you realize that, yes, you do need to think about what's going on more than any other ESRI product. They even had a common "gotcha" occur.

Tom (running the demo) had added his domain account to the local "ArcGIS Server Admin" group, and then tried to connect to ArcGIS Server via Catalog, and it threw an error stating he did not have permission to access the resource. After checking that the service was running, someone in the audience reminded him that he needed to log out and log in before his account would "know" about the group change. This is exactly the sort of thing that can make installing and configuring AGS a confusing process. Unless you are installing on a development box, I'd highly suggest having a little Active Directory / Windows managment under your belt, or involve a system admin.

After than, Bryan Dickerson of Woolpert gave a review of a number of ArcGIS Server projects that they have done. Bryan is a system & software architect, so it was a good - non-marketing - talk about how all the parts work together. He concentrated a fair bit on how to use the right software in the right place - when to use ArcGIS Server vs ArcIMS, and how to blend them.

I believe his presentation, along with my few slides, and Tom/Jeremiah's Installing ArcGIS Server slide decks will be on the ESRI Denver site in the next day or so.

Also of note - if you're in the Denver area, and want to present at one of these, Chris Longo in the Denver office is the man to talk to.

Monday, April 03, 2006
Posted on Monday, April 03, 2006 10:59:36 AM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | Software
In the past we have used the native .NET installer projects to distribute our projects, but these have some limitations, and require an arkane understanding of MSI files, and ORCAS if you want to do more complex things. So it was time to look at some 3rd party tools to simplify our lives.

First up: Wise for Windows Installer 6
I downloaded the eval copy of the Professional version, and was somewhat suprised at the interface when I fired it up. Yes it has lots of bells and whistles, but it's not at all intuitive. Not starting out well.

The project I was working with is the first iteration of a simple .NET 2.0 client-server app. No ArcObjects. No COM. About as simple as it's ever going to get.

Ideally, I wanted to create two installs - one for the client application, and a second that would install SQLExpress and build out the database with tables and stored procs. I started with the client application.

Since it's just .NET 2.0 - no third party controls etc, I had expected this to be a 2 minute task. The only wrinkle was that it needed to update the connection string in the app.config file during the install. After some digging I found that Wise has a SQL connection dialog, and puzzled out how to get that into the config file. Great!

Next, we just need to add a launch condition that states that the .NET Framework 2.0 is installed. Simple. Not quite. Somehow Wise simply left this out. You can create a condition for 1.0 or 1.1 but not 2.0. I was stunned. Do they live in a cave?

.NET 2.0 has been out for 5 months now, and has been in public beta for how long? Did they just assume nobody would switch over?

So - off to their support site to figure this out. From an evaluatin standpoint, this sort of issue is pretty good as you get an idea of what their community is like.

From the launch page of the Wise interface, I followed a link to their "newsgroups". Turns out, they no longer have newsgroups, but forums. Even better. But the page they send me to simply says the forums have moved.


Following the link to the new forums, you land at the Altiris home page, and then have to find your way to the forums. Usability is clearly not a priority here.

Once you find the forums, you then need to weed through the 20 or so forums to find the one on Wise For Windows. Since I can create a link directly to the correct forum, why couldn't they?

Turns out I'm not the first person to notice this particular problem. And yes there is a hack to get it to work (set 1.1 as the launch condition, then go into the "tables" - recall that an MSI is a database - and change the value to the 2.0 value), however it never worked for me. Nor did a slew of other hacks. Either the package always thought .NET 2.0 was installed, or it never thought it was. Not very useful.

After about 4 hours of messing with this, I bailed on the launch condition, and simply sent out the installer to the client and told them they need .NET 2.0 installed first. The really ironic part is that with .NET 2.0, you can create a click-one deployment in about 3 seconds, and it handles the launch condition flawlessly, and automatically installs the framework.

 I did not even try to create the second deployment to install SQL Express - I just wrote up the steps in a document, and moved on.

Summary:
While I'm sure you can do some really cool complex installs with Wise for Windows Installer, it appears that you can't do simple things easily. And since the whole reason I'm considering a 3rd party installer is to make my life easier, Wise is not for me.

Next up: InstallShield. If that can't simplify things, then maybe we'll just get burly and use Windows Xml Installer, which is complex, but you can do just about anything, and its open source.

Had any great installer experiences? I'd love to hear comments...
Wednesday, March 29, 2006
Posted on Wednesday, March 29, 2006 7:46:57 PM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | Software | Team System
This is just a quick link dump for anyone looking to use Team System's source control with Visual Studio 2003.

I know that for our office, we'll be supporting a number of VS2003/.NET 1.1 apps for quite a while, but we'd like to migrate all our source control to Team Foundation Server.

Vertigo Software has a good blog post about collecting all the parts and pieces and getting it working. The basic steps are:

1) Download the MSSCCI provider for Team System
2) Run a registry hack to get it to work

If you need to access multiple source control systems, then you should check out Soenke Schau's Sourcecode Control Switcher app

All the details are over at Vertigo's site.
Monday, March 27, 2006
Posted on Monday, March 27, 2006 5:12:13 PM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | Software
Since hearing about Team System, we've been really interested to see how it can work for us. While I don't think we're the exact target market (we only have 5 developers right now), we are keenly interested in the project managment aspects of Team System - and Team Foundation Server is the core of all that.

Being small means a number of things - one of which is that money does not grow on trees. So, for our investigation, I'm setting up Team Foundation Server using an only machine - 1Ghz with with 1GB of RAM. Since it's just me playing around, I think it should be fine.

I had tried to install this a Beta 3, but it failed miserably. The final version was released on the 20th, so I thought I'd take another swing at it. This time, the install went smoothly, and it's up and running.

I will say that with power comes complexity. Once I wrap my head around all the roles and permissions, I think this will really rock.

At this point I've created a project, added some existing code into the source control, and just begun messing with Work Items. Still working out how to add users to the correct roles so that I can assign them work items, but I'll get that sorted out soon enough.

The only beef I have at this point is that the project portals are not quite FireFox friendly.

Look for more Team System posts in the coming weeks as we start up a project that will run through it end-to-end.

Tuesday, March 14, 2006
Posted on Tuesday, March 14, 2006 7:11:38 PM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | Software
Is it just me, or is it usual for Visual Studio 2005 to grab 700+ Mb after a couple of hours? This just seems pretty extreme. A leak perhaps?

I'm working on a winforms project that has about 10 user controls in it, but other than that it's a very light weight application. Interestingly I did not see this same level of memory use when I was running the "Professional" edition - only once I switched up to "Team" for Developers. This is a drag because at this point the only "Team" thing I'm using is the testing. Curiously I thought this was in all versions but when I opened the solution on Professional, it could not open the test project.

At this point, I need to restart VS every 2 hours or so otherwise things just grind to a halt. What seems to be worse is that the amount paged get's crazy - like 1.8 Gb!

These are screen caps after running for about 40 minutes... 486Mb for devenv.exe



and a page file at 1.08 Gb!



This is a new AMD Athlon 64 with 1Gb or RAM, and it flies most of the time, but once I get VS 2005 open, things start to bog down hard. Anyone else having this problem? Know of any tweaks?
Sunday, March 12, 2006
Posted on Sunday, March 12, 2006 5:32:08 PM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | General | Software
Just a quick note to anyone looking to get Subversion (open-source version control system) up and running quickly.
 


The simplest, get-it-running-now guide is actually in the TortiseSVN help. There is lots of info in the actual Subversion manual, but it's more oriented to a subversion administrator and describes installing subversion as...
The easiest way to get Subversion is to download a binary package built for your operating system. Subversion's website (http://subversion.tigris.org) often has these packages available for download, posted by volunteers.
That's it. While factually correct, it's not particularly helpful if you have never set it up before. Once I found the description in the TortiseSVN help, it's really quite simple:

Step 1: Install Apache Webserver (msi windows installer)

Step 2: Install Subversion (windows installer)

Step 3: Open beer.

Step 4: Minor config file meddling (help doc shows you what to do line by line)

Step 5: Connect to the repository with your client of choice (TortiseSVN is a good start)

Step 6: Toast yourself for a job well done.

Really, quite easy - and thus there is no excuse for not using a source control system!
Posted on Sunday, March 12, 2006 1:13:08 PM (Mountain Daylight Time, UTC-06:00)  Comments [0] | 
Categories: .NET | General | Software
When I started writing software, like many other GIS developers, I was working in a vacuum. I was the only VB developer in our shop, and I knew few other developers. If I had a problem, I had to hope I could find a solution in a book, or just solve it myself. Narry a mentor to be found.

Times have changed, and the internet now provides a wealth of "How-To" type information for developers. What's still difficult to find are discussions which review the "pros & cons" of a set of options - kind of "best practices" tempered by reality. These are the sort of discussion that you would have with a mentor, and from which you take away more than simply a solution - you gain knowledge. Happily, I find that there are some blogs that can fill this role.

Just this afternoon, I ran across a bunch of posts which exemplified this. I found some serious discussions about some topics I'd been working with this last week - Object Relational Mapping in .NET, and the choice between using dynamic SQL, or Stored Procedures in a data access layer.

Ward Beeker's blog on Code Generation has a post linking to a post by Clemens Vasters (of dasBlog, and now Microsoft). Having spent the week working in relative isolation looking at O/RM options, and finding most of them either overly complex or unable to map 1-to-M tables into contained collections in a parent class, it was nice to see that other much more distinguished developers are also somewhat skeptical of the promise or O/RM. Anyhow, both the post and the comments were very enlightening.

Once I had decided on how to actually generate my classes from the data model (I chose to use RapTier because it uses a very light weight model, which does not rely on other code - unlike NHibernate or the MS Ent Data Access block), I still had to decide if I should use stored procedures or dynamic SQL to communicate with the database. Again - I found a bunch of postings on both sides of the issue.
What's really cool is that in reading the posts, I got insights that only come from people who have tried a lot of options, and have summarized their results. From reading these, I think I'm going to go with the Dynamic SQL. I'm doing this for the simple reason that if there is a need to change the model, there is only one code change to make.

It is my hope that I can provide similar help and insights on GIS development to the people who read my postings on ArcDeveloper.net or this blog.

Wednesday, March 01, 2006
Posted on Wednesday, March 01, 2006 6:55:47 PM (Mountain Standard Time, UTC-07:00)  Comments [0] | 
Categories: General | Software | Web Mapping
Just saw this over on Omar Shahine's blog, and had not noticed it on the GIS feeds. This thing is very cool. Data coverage is limited to downtown San Francisco and Seattle, and the usability is a little "eh" at this point,  but I like it better than A9's option, but I just noticed that you can bookmark a location at A9, but not on this version of the Local. In any event, Microsoft is really getting their browser-based-map-thing game on.

Monday, February 13, 2006
Posted on Monday, February 13, 2006 12:56:06 PM (Mountain Standard Time, UTC-07:00)  Comments [0] | 
Categories: .NET | ASP.NET | dasBlog | Software
Whoa! I just tried to follow the link to my main page on the previous post, and I got an ASP.NET config error! doh!

This is strange because when I hit the page, it will load and run - so this is somehow related to coming from dasBlog.?!?! Anyhow, this is something dasBloggers may want to be aware of...

UPDATE: This was due to a mangled URL that had a space on the end. Check your URLs when you copy/paste into the FTB "Create Link" tool, as you can't see the "space" tacked on the end.


Sunday, February 05, 2006
Posted on Sunday, February 05, 2006 1:33:13 PM (Mountain Standard Time, UTC-07:00)  Comments [2] | 
Categories: General | Software
Just a quick note about a very cool Task list package that I've been using for a while now - ToDoList from Abstract Spoon.

This is a great little tool - first off it's freeware, so that always helps. Second - it's simple. It's not trying to be eveything to everyone, an integrate with other stuff. It's just a task list, done right. That said, it has some nice features:
  • Contains multiple task lists (i.e. different projects)
  • Task priority, due date, est to complete
  • RTF task description / comments area - which can contain graphics  - very hepful for tracking bugs
  • Task timer - see how long it actually took you - helps  improve estimation
  • Ability to share task lists (file share only from what I can see)
  • Written in .NET UPDATE Matt pointed out that it's C++. Not sure why I assumed it was .NET
Anyhow, it's been really handy to track tasks as we wait to migrate over to Team System
(more on Team System another time...)