<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>Dave Bouwman</title>
  <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/" />
  <link rel="self" href="http://blog.davebouwman.net/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2008-07-02T21:43:39.8027500-07:00</updated>
  <author>
    <name>Dave Bouwman</name>
  </author>
  <subtitle>Software Development :: .NET - GIS - ESRI</subtitle>
  <id>http://blog.davebouwman.net/</id>
  <generator uri="http://www.dasblog.net" version="1.9.7174.0">DasBlog</generator>
  <entry>
    <title>Installing PHP on IIS7 (Vista)</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/07/03/InstallingPHPOnIIS7Vista.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,b92c4619-7c32-4f84-b120-2fbd839fc5a1.aspx</id>
    <published>2008-07-02T21:43:39.8027500-07:00</published>
    <updated>2008-07-02T21:43:39.8027500-07:00</updated>
    <category term="PHP" label="PHP" scheme="http://blog.davebouwman.net/CategoryView,category,PHP.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm doing a technical review for some chapters on the <a href="http://www.dojotoolkit.org">Dojo
Toolkit</a> for an upcoming Wrox Press book on Javascript Frameworks. I suppose not
surprisingly, the sample code for the server side code is php.
</p>
        <p>
So, in order to be a good reviewer, I'm jumping into the PHP pool. I have to say that
in reading the sample code, it's a lot "closer to the metal" then ASP.NET,
so this should be interesting to say the least.
</p>
        <p>
So - should you want to embark on a similar journey, here's the best info I could
find on <a href="http://blogs.iis.net/bills/archive/2006/09/19/How-to-install-PHP-on-IIS7-_2800_RC1_2900_.aspx">installing
php as an ISAPI extension</a>. 
</p>
        <p>
If you are running Vista SP1 or Server 2008, you can install FastCGI support and run
PHP that way. The basic steps are <a href="http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis7/">outlined
here</a>.
</p>
        <p>
Looks like things are up and running - php here I come! 
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=b92c4619-7c32-4f84-b120-2fbd839fc5a1" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Is this bad?</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/07/02/IsThisBad.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,6edd0657-17e1-4e5f-9f22-28436c8c4809.aspx</id>
    <published>2008-07-02T15:04:55.8773037-07:00</published>
    <updated>2008-07-02T15:04:55.8773037-07:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's looking really dark outside and the trees are whippin around, so I brought up
the weather channel's radar map to see this... 
</p>
        <p>
          <a href="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/Isthisbad_E1EE/weather_2.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="412" alt="weather" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/Isthisbad_E1EE/weather_thumb.png" width="596" border="0" />
          </a>
        </p>
        <p>
Time to hunker down!
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=6edd0657-17e1-4e5f-9f22-28436c8c4809" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Software Simplicity Revisited</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/07/02/SoftwareSimplicityRevisited.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,7bd84cca-07a3-4e12-9430-ae8fa0d12b06.aspx</id>
    <published>2008-07-02T11:00:37.9550000-07:00</published>
    <updated>2008-07-02T11:02:27.1148832-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://blog.davebouwman.net/CategoryView,category,.NET.aspx" />
    <category term="Fundamentals" label="Fundamentals" scheme="http://blog.davebouwman.net/CategoryView,category,Fundamentals.aspx" />
    <category term="SQL Server" label="SQL Server" scheme="http://blog.davebouwman.net/CategoryView,category,SQL%2BServer.aspx" />
    <category term="Virtual Earth" label="Virtual Earth" scheme="http://blog.davebouwman.net/CategoryView,category,Virtual%2BEarth.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
A reader recently asked me to expand upon the "Keep it Simple" advice in the <a href="http://www.davebouwman.net/fundamentals/philosophy.aspx">fundamentals</a> section
of my web site. Just like my advice, I had kept this section pretty lean...
</p>
        <blockquote>
          <h2>Keep it simple
</h2>
          <p>
Anybody can build complex software. Creating simple software that can accomplish the
same task is much more difficult. In the end though, the simpler it is, the easier
it is to test, which makes it easier to maintain, and easier to extend.
</p>
        </blockquote>
        <p>
To illustrate the idea, I'll talk about a project that I'm working on right now. Basically
I'm helping / mentoring a team through a short term project to build a data viewer
application based on <a href="http://maps.live.com">Virtual Earth</a>, <a href="http://www.dojotoolkit.org">Dojo</a>,
ArcGIS Server (9.2) and ASP.NET.
</p>
        <p>
One of the user stories in this project is:
</p>
        <blockquote>
          <p>
As an administrator I want the Data Viewer to be database agnostic so that I can easily
configure it to pull point data from SQL Server, Oracle or file based data sources.
</p>
        </blockquote>
        <p>
Now, this is a great idea, and certainly possible. In fact it ends up being very interesting
to design (plug-ins, configuration sections and Inversion of Control oh my!). 
</p>
        <h2>Simple works...
</h2>
        <p>
In looking at the project (it's very short term) and the team (new to web development)
and the current problem they are trying to solve (display data from SQL Server), my
recommendation to the team is that we "keep it simple" for now, and just address the
SQL Server data source. 
</p>
        <p>
While we could define a set of interfaces, build out a whole configuration model,
and create the actual data access objects for these various data sources, in the context
of this project it's extraneous. To be "successful", we need to display the current
data in Virtual Earth. With tight time frames and limited resources, I believe the
tradeoff between building for an unknown complex future need, and applying time and
effort to the core objective, is a good one. The team will be able to get the database
access tier of the system completed in a short time, and it will be very simple to
understand - parameters are passed to a class, which calls a stored procedure, which
returns the point data. Simple, clean, and working.
</p>
        <p>
But what about the "can accomplish the same task" bit? Good question - I'd suggest
that in this situation, with the current data is in SQL Server, you are doing the
same task - just using a simpler design to achieve the goal. 
</p>
        <h2>Add Complexity when it is Needed
</h2>
        <p>
If / when a need arises to add data from Oracle, it will be a very simple task to
create another class which mimics the SQL Server class, with the only difference being
that it uses the Oracle data connection classes. Should this Data Viewer become a
huge hit, and is used so extensively that it must become configurable by non-developers,
it could then be refactored to add in the additional complexity required to support
configuration sections and a plug-in data provider model. But for now, the much simpler
solution works just fine.
</p>
        <p>
So - to summarize: Make choices which trend towards keeping the code as simple as
possible. Don't add extra features or design elements to handle unknown or fuzzy future
requirements. <strong>Add complexity only when it's really needed</strong>. While
it's fun to monkey with internal design optimizations etc, keep your eyes on the prize:
software that works for the user. And keep in mind <a href="http://www.codinghorror.com/blog/archives/001137.html">who
will be maintaining the software</a> over the long haul - while you may be a whiz
at generics (for example) keep in mind that for many people they tend to make understanding
the code more difficult. 
</p>
        <p>
That's pretty much my take on this, but I'd love to hear your thoughts on keeping
software "simple". How do you decide when to add complexity? How do you define complexity?
</p>
        <h2>Other thoughts on Simplicity:
</h2>
        <p>
          <a href="http://www.joelonsoftware.com/items/2006/12/09.html">Joel On Software: Simplicity</a>
        </p>
        <p>
          <a href="http://www.codesimplicity.com/archives/23">The Fourth Law of Software Design:
Complexity vs. Ease of Maintenance</a>
        </p>
        <p>
          <a href="http://www.jbox.dk/quotations.htm">Various Quotes on Simplicity in Software
Design</a>
        </p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=7bd84cca-07a3-4e12-9430-ae8fa0d12b06" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Upgrading to Vista 64</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/23/UpgradingToVista64.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,fa482ae9-352d-43ae-932c-6fdede874b70.aspx</id>
    <published>2008-06-23T16:02:30.7771255-07:00</published>
    <updated>2008-06-23T16:02:30.7771255-07:00</updated>
    <category term="Devt Tools" label="Devt Tools" scheme="http://blog.davebouwman.net/CategoryView,category,Devt%2BTools.aspx" />
    <category term="General" label="General" scheme="http://blog.davebouwman.net/CategoryView,category,General.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="margin: 0px 10px 0px 0px" height="219" alt="vista" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/UpgradingtoVista64_D4E5/vista_60027ea1-f326-48e0-b85c-74a64c8d9fd6.png" width="219" align="left" border="0" /> I
was running into a LOT of weirdness with my Windows Xp installation, so I figured
I'd upgrade to Vista 64 instead of futzing with another re-do of Xp.
</p>
        <p>
I've been running Vista on my notebook an home workstation for about 6 months with
no issues, and with my MSDN subscription, so it's a no-cost thing - just grab the
disk and an authorization code, and let 'er rip.
</p>
        <p>
Hardware Compatibility is one of the first things you should be concerned about when
jumping to the 64-bit platform, but we had pre-planned this to some extent. When we
built out our development boxes, we followed the "<a href="http://www.hanselman.com/blog/TheCodingHorrorUltimateDeveloperRigThrowdownPart2.aspx">CodingHorror
Ultimate Developer Rig</a>" parts list. So other than the quad core CPU, I've
got exactly the same box. Since <a href="http://www.hanselman.com/blog">Scott Hanselman</a> has
been running Vista 64 for a long time, with few issues (here's a link to his podcast
on the <a href="http://www.hanselman.com/blog/HanselminutesPodcast81VistaX64RedoForDevelopers.aspx">Vista
64 Developer Experience</a>) this should go pretty smoothly.
</p>
        <p>
One nice thing about re-paving a machine is you get to clean out all the crud that
accumulates over time. So, as I re-built things, I created a list of all the stuff
I could not live without. 
</p>
        <h2>Vista Components:
</h2>
        <ul>
          <li>
IIS w/ IIS 6 compatibility 
</li>
          <li>
Disable User Access Control - secure, but a hassle 
</li>
        </ul>
        <h2>Development Tools:
</h2>
        <ul>
          <li>
Visual Studio 2008 
</li>
          <li>
            <a href="http://www.aptana.com">Aptana Studio</a> - Javascript / Ajax IDE 
</li>
          <li>
            <a href="http://www.mygenerationsoftware.com/">MyGeneration</a> - free code generation
tool 
</li>
          <li>
            <a href="http://www.mbunit.com/">MbUnit</a> - unit testing on crack 
</li>
          <li>
            <a href="http://www.testdriven.net/">TestDriven.net</a> - Unit Testing harness for
Visual Studio 
</li>
          <li>
            <a href="http://www.roland-weigelt.de/ghostdoc/">GhostDoc</a> - why write your own
Xml comments? 
</li>
        </ul>
        <h2>Productivity:
</h2>
        <ul>
          <li>
Office Enterprise 2007 
</li>
          <li>
Visio 2007 
</li>
          <li>
            <a href="http://www.bayden.com/SlickRun/">Slickrun</a>  - launcher goodness 
</li>
          <li>
            <a href="http://www.foldershare.com">FolderShare</a> - sync folders across multiple
systems 
</li>
          <li>
            <a href="http://notepad-plus.sourceforge.net/">Notepad++</a> - notepad with tabs and
syntax hilighting</li>
          <li>
            <a href="http://www.getfirefox.com">FireFox</a>
            <ul>
              <li>
                <a href="http://www.getfirebug.com">FireBug</a> - must have for Ajax development</li>
              <li>
                <a href="http://www.foxmarks.com/">FoxMarks</a> - sync bookmarks across multiple systems 
</li>
              <li>
                <a href="https://addons.mozilla.org/en-US/firefox/addon/1419">IETab</a> - runs IE
inside FireFox - good for SharePoint 
</li>
            </ul>
          </li>
        </ul>
        <h2>GIS:
</h2>
        <ul>
          <li>
ArcGIS Desktop (Editor) 9.3 Beta 
</li>
          <li>
uDig 
</li>
        </ul>
        <p>
 
</p>
        <p>
So, .NET developers - what other tools do you install on a fresh box?
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=fa482ae9-352d-43ae-932c-6fdede874b70" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>More on MVC / MVP Patterns</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/18/MoreOnMVCMVPPatterns.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,e384527a-0c05-40a3-87a5-0406e0260715.aspx</id>
    <published>2008-06-18T07:53:39.1020000-07:00</published>
    <updated>2008-06-18T07:58:21.2829500-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://blog.davebouwman.net/CategoryView,category,.NET.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img alt="haak" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/MoreonMVCMVPPatterns_7D0D/haak_d8c95710-d807-43d2-946c-966c70daebad.png" width="209" align="left" border="0" height="177" />
          <a href="http://haacked.com/articles/AboutHaacked.aspx">Phil
Haack</a> posted a <a href="http://haacked.com/archive/2008/06/16/everything-you-wanted-to-know-about-mvc-and-mvp-but.aspx">comparison
of MVC and MVP patterns</a> with some zen on how these patterns work in the web.<br /><br /><br /><br /><br /><br /><br /><br /><br /></p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=e384527a-0c05-40a3-87a5-0406e0260715" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Synchronizing Google Email and Calendar across Devices</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/18/SynchronizingGoogleEmailAndCalendarAcrossDevices.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,145926c4-dadd-4c1e-8e94-6b31b8233d98.aspx</id>
    <published>2008-06-18T06:18:43.3572875-07:00</published>
    <updated>2008-06-18T06:18:43.3572875-07:00</updated>
    <category term="Productivity" label="Productivity" scheme="http://blog.davebouwman.net/CategoryView,category,Productivity.aspx" />
    <category term="Software" label="Software" scheme="http://blog.davebouwman.net/CategoryView,category,Software.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
We recently moved from using Exchange to <a href="http://www.google.com/a/help/intl/en/admins/editions.html">Google
Apps</a>. The transition has gone really smoothly, but there have been a few hurdles
- mainly surrounding synchronization of Mail and Calendar across multiple devices.
</p>
        <p>
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. ;-)
</p>
        <p>
So - here's my device situation:
</p>
        <p>
          <img height="231" alt="devices" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SynchronizingGoogleEmailandCalendaracros_665B/devices_df0f291c-2aca-4f77-82f2-6f0b4793f065.png" width="494" border="0" />  
</p>
        <p>
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?
</p>
        <p>
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.  
</p>
        <h2>Connecting Outlook with Google Apps
</h2>
        <p>
Actually getting a single instance of  Outlook talking to GMail via <a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;ctx=mail&amp;answer=12103">POP</a> or <a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;ctx=mail&amp;answer=75726">IMAP</a> is
pretty easy, and well documented. If you use IMAP, then you can have multiple clients
systems connected and everything is synchronized for you.
</p>
        <p>
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.
</p>
        <p>
On my phone, I'm using Mobile Outlook connecting to IMAP for mail, along with <a href="http://www.goosync.com">GooSync</a> 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.
</p>
        <p>
          <img height="517" alt="goog" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SynchronizingGoogleEmailandCalendaracros_665B/goog_a96cd347-a105-4173-9dc9-d81c1a93b1b8.png" width="533" border="0" />
        </p>
        <p>
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.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=145926c4-dadd-4c1e-8e94-6b31b8233d98" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Model View Controller Patterns: An Intro</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/17/ModelViewControllerPatternsAnIntro.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,b234c347-0d4e-4f7e-ae18-4961f4921488.aspx</id>
    <published>2008-06-17T09:18:00.5132500-07:00</published>
    <updated>2008-06-17T09:18:00.5132500-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://blog.davebouwman.net/CategoryView,category,.NET.aspx" />
    <category term="Unit Testing" label="Unit Testing" scheme="http://blog.davebouwman.net/CategoryView,category,Unit%2BTesting.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Based on the outcome of the <a href="http://blog.davebouwman.net/2008/05/29/DeveloperSurveyDesignPatterns.aspx">Developer
Survey</a>, I thought I' put together some posts on the common patterns referenced
in some of the questions, starting with the Model View Controller (MVC) family.
</p>
        <p>
There has been plenty written about MVC on the formal side of things - here are two
good sources of information - <a href="http://en.wikipedia.org/wiki/Model-view-controller">Wikipedia
MVC entry</a>,  and some <a href="http://martinfowler.com/eaaDev/uiArchs.html#ModelViewController">thoughts</a> from
Martin Fowler.
</p>
        <h2>The Basics
</h2>
        <p>
The MVC family of patterns are about separating the presentation of data from the
business logic surrounding the management of the data. There are many other patterns
based on the key MVC ideas - <a href="http://martinfowler.com/eaaDev/PassiveScreen.html">Passive
View</a>, <a href="http://martinfowler.com/eaaDev/SupervisingPresenter.html">Supervising
Controller</a>, <a href="http://martinfowler.com/eaaDev/SeparatedPresentation.html">Presentation
Model</a> and <a href="http://martinfowler.com/eaaDev/SeparatedPresentation.html">Separated
Presentation</a> are 4 such patterns. The differences are subtle, and all share they
key idea of separating the presentation logic from the business logic, from the data
itself. It's worth noting that the opposite of MVC family is called "Autonomous View"
in which all the logic is in the form itself - so if this is how you are developing,
now you can use a fancy name for it!
</p>
        <p>
Since MVC was one of the first patterns that dealt with this separation, we'll start
with it, and look at the three components... 
</p>
        <h3>Model: 
</h3>
        <p>
The model is the data and it's usually a class. So in GIS-land, it could be a "Parcel"
class, which may have a Geometry property. The important part is that this class has
no dependencies on the presentation layer, or the controller. It's just a dumb data
container. Typically this class will implement one or more interfaces, which the View
and Controller will utilize. Interfaces are used a lot in these patterns, so here's
a link to an <a href="http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx">article
that compares Abstract Classes and Interfaces</a> that can serve as a refresher if
needed.
</p>
        <h3>View:
</h3>
        <p>
As the name suggests the View is responsible for organizing and presenting the Model.
Usually this means showing it visually on a form. In order to remove dependencies
between the View and the Model, the View will interact with an interface, instead
of a specific view class - i.e. IParcelFeature instead of "Parcel". The view typically
raises events when the user makes changes in the interface, and exposes properties
allowing the Controller to "see" the model or other state of the view. The View does
not make any changes to the Model itself (in some  MV* patterns does not actually
have visibility of the model - the controller sets all the control values directly,
and responds to all control events). Again, the events and properties of the View
are defined via an interface.
</p>
        <h3>Controller:
</h3>
        <p>
The name conveys things pretty well - this is the business logic component that controls
what actually happens to the model when an event occurs in the view. There may be
multiple controllers that can work with a given class, or multiple model classes that
can work with a given controller. This is where the Interfaces on the Models come
in. If the Controller's "contract" is based on an Interface (IParcelFeature), then
we can use the Controller with any class that implements the interface. Similarly,
the Controller also implements an Interface, which is it's contract with the View.
</p>
        <h2>Pulling it to all together:
</h2>
        <p>
In MVC, the Controller gets a model and a View. It then passed the required data to
the View which renders the UI. When the user interacts with the UI (i.e. clicks a
button), the View raises events, which the Controller responds to by making required
changes to the Model, which is then used to update the View. 
</p>
        <h2>Why Bother?
</h2>
        <p>
So - this is nice, but why separate things out like this? There are a number of reasons.
First is known as <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Single
Responsibility</a>. This concept basically says that a class should have one purpose,
and anything not connected with that purpose should be in a separate class. In regards
to the subject at hand, it would tell you to avoid mixing presentation code, with
business logic because they are not actually related.
</p>
        <p>
Another reason for MVC is re-use. If you model your application like this, you can
plug and play the components - particularly the View. So, suppose you need to create
a business application that has a windows forms client for some functionality, a web
client for some other functions, and a web service API. You can build out a model,
a controller, and three views - one for the windows forms application, one for a web
form, and a third (more limited one) for the web service.
</p>
        <p>
A final (and biggest) reason is testability. If you keep the Model (data) separate
from the View (User Interface) which is separate from the Controller (business logic),
writing unit tests becomes much easier. If you've implemented interfaces as the contract
between the components, you can test the components individually. 
</p>
        <h2>The Pain of Testing
</h2>
        <p>
Without getting too deep into unit testing, the basic idea is to have a test harness
which spins up various classes in your code, and executes methods. This gets complicated
because our classes have dependencies on data - stored in databases, shape files,
whatever. If we want to re-run our tests frequently, we want to be sure our test data
is static - otherwise the tests break, and that defeats the purpose. So - the next
best option is to create "fake" static data in our tests. The brute force method would
be to create specific test classes which implement the required interfaces (ISomeView,
ISomeModel etc), but just contain enough logic to complete the test. Depending on
the test you would have an invalid geometry, invalid PIN number or a myriad of other
conditions. This would allow you to create test "Parcels" in your unit test harness,
that you could then pass to the Controller to test it's methods, without actually
connecting to a shape file. You could also create a class that implemented the View
interface, and use that to raise events and ensure that the Controller reacted correctly.
Essentially you can write unit tests for everything but the "click" event handler
in the UI layer. Since that code was likely written for you by the IDE, and it's super
basic, it's not a really high priority for testing.
</p>
        <h2>Easing the Pain of Testing: Dynamic Mocking
</h2>
        <p>
Of course that's a lot of work, and developers hate extra work, so tools were created
to help out. While this is beyond the scope of this post, I'm talking about "mocking"
frameworks, such as <a href="http://www.nmock.org/">NMock</a>, <a href="http://www.ayende.com/projects/rhino-mocks.aspx">RhinoMocks</a> or <a href="http://www.typemock.com/">TypeMock</a>.
These frameworks can create a "test dummy" class that implements a specific 
interface right in the test definition. You basically "record" some values into the
Mock, then pass it into a method, and it can validate behavior. 
</p>
        <p>
Of course you still need to fill up the dynamically mocked Interface with valid data
- and the geometries are likely the scariest thing to start with. So that's where
I started a few years ago.
</p>
        <h2>I can haz code?
</h2>
        <p>
I don't have anything lying around that's easily sharable, but I did post a sample
about Supervising Controller code about a year ago. The code is in VB.NET, with a
Visual Studio 2005 solution, and is oriented towards showing how to create a plug-in
framework, while leveraging Supervising Controller, so that's the gist of the article.
It also does not have any tests, but I'll be posting more leveraging MVC patterns
and unit testing in the future.
</p>
        <p>
          <a href="http://blog.davebouwman.net/2007/06/05/PluginFrameworkSupervisingControllerExample.aspx">Plug-in
Framework &amp; Supervising Controller Example</a> (Article - read this before digging
into the code)
</p>
        <p>
          <a href="http://www.davebouwman.net/sourcecode/pluginUI.zip">Download Sample Code</a>
        </p>
        <h2>Summary
</h2>
        <p>
The idea here was to introduce the main idea of the MVC pattern - separation of behavior
logic from presentation logic, usually to facilitate testing. The actual implementation
of this idea can take many flavors, and can vary in complexity, but the underlying
concept is the same. 
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=b234c347-0d4e-4f7e-ae18-4961f4921488" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Texas Wildfire Risk Visualization Demo Site</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/13/TexasWildfireRiskVisualizationDemoSite.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,78658ccf-8635-418e-a5fa-55c4fa427f77.aspx</id>
    <published>2008-06-12T20:53:19.2320000-07:00</published>
    <updated>2008-06-12T20:53:19.2320000-07:00</updated>
    <category term="Dojo" label="Dojo" scheme="http://blog.davebouwman.net/CategoryView,category,Dojo.aspx" />
    <category term="Virtual Earth" label="Virtual Earth" scheme="http://blog.davebouwman.net/CategoryView,category,Virtual%2BEarth.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
We just put up another <a href="http://65.101.234.201/txfire/">"demo" site</a> -
this time working with <a href="http://www.sanborn.com">Sanborn</a> to provide visualization
for their wildfire risk model outputs they have created for the <a href="http://txforestservice.tamu.edu/main/default.aspx?dept=frp">Texas
Forest Service</a>. For information on the data, there is contact information on the
"About" tab.
</p>
        <p>
          <a href="http://65.101.234.201/txfire/">
            <img height="334" alt="txfire" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/TexasWildfireRiskVisualization_121E6/txfire_11ebbc5b-96c4-47bb-a5cd-8a7f83659e89.png" width="500" border="0" />
          </a>
        </p>
        <p>
From a technical stand-point, we added a few new features to this viewer... 
</p>
        <h2>Dealing with Multiple Tile Layers
</h2>
        <p>
The viewer is pulling in multiple tile services, representing multiple layers in a
map, as opposed to a single "fused" tile layer. This is the first time I've
implemented multiple layers using the ArcGIS Server Tile Cache code, and it turns
out it's currently a bit of a pain. For this site, we've got 7 tile layers, and to
do that with the current tile server code, I needed to create 7 map services (mxd's),
and then configure 7 tile services in the TileServer. Clearly this should be streamlined.
For example, the url <a title="http://65.101.234.201/tileservice/txfirewfsi/023131001.ashx" href="http://65.101.234.201/tileservice/txfirewfsi/023131001.ashx">http://65.101.234.201/tileservice/txfirewfsi/023131001.ashx</a> pulls
a specific tile from the txfirewfsi tile service. (shown below)
</p>
        <img alt="Tile" src="http://65.101.234.201/tileservice/txfirewfsi/023131001.ashx" />
        <p>
However, I'm thinking that it would be nice to be able to add a layer name in the
url -'parcels' in this case -   <a href="http://65.101.234.201/tileservice/txbasemap/parcels/023133.ashx">http://65.101.234.201/tileservice/txbasemap/<strong>parcels</strong>/023133.ashx</a>.
This way you could specify the fused tiles, or just a specific layer.
</p>
        <h2>Adjusting Layer Transparency
</h2>
        <p>
This was easy, if not obvious. Adding in a Dojo.slider, and hooking up some events
was pretty simple. However, it turns out that changing the .Opacity property of a <a href="http://msdn.microsoft.com/en-us/library/bb429539.aspx">VETileSourceSpecification</a> has
no effect after the layer has been added to map. Instead you need to delete the layer
and re-add it with the new opacity. Since the browser is caching the tiles, this is
actually very fast.
</p>
        <p>
          <img height="234" alt="trans" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/TexasWildfireRiskVisualization_121E6/trans_7cc5991d-521c-4925-80a0-fdafdf8d6317.png" width="486" border="0" />
        </p>
        <h2>Virtual Earth 3D
</h2>
        <p>
This was also the first time I tried throwing things into 3D mode. It took a few quick
tweaks in the javascript, and some different CSS for the markers, but for the most
part - it "just worked".
</p>
        <p>
          <img height="240" alt="tx-3d" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/TexasWildfireRiskVisualization_121E6/tx-3d_62837332-521e-4e81-8b8e-9887a0070c8f.png" width="299" border="0" />
        </p>
        <p>
There are a few issues with the dojo menus that I'm going to sort out so I'll save
the Url for the 3d page until that's dialed.
</p>
        <p>
So, this took about 3 days to pull together -- if you are looking under the covers,
the code is VERY "demo" and has some issues - there are a few weird things
with the layer list checkboxes and I have not really tested in IE7, and all bets are
off with IE6. I'd love to hear thoughts &amp; ideas though.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=78658ccf-8635-418e-a5fa-55c4fa427f77" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Dojo.Coords Goodness</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/11/DojoCoordsGoodness.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,39c46c08-0b8a-43c4-ad83-7f17e92b4fc5.aspx</id>
    <published>2008-06-11T09:47:32.4170600-07:00</published>
    <updated>2008-06-11T09:47:32.4170600-07:00</updated>
    <category term="Dojo" label="Dojo" scheme="http://blog.davebouwman.net/CategoryView,category,Dojo.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just a quick note that if you've ever run into trouble keeping things positioned correctly
in your browser app, take a look at <a href="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.coords">dojo.coords</a>.
(ok, the doc is limited, but poke around with FireBug, and it's pretty easy to see
what it does)
</p>
        <p>
Basically this allows you to get the top, left, width, height, x and y for any element
on your page. I was having issues with my Dojo slider control's positioning when added
into the Virtual Earth control via map.AddControl. Basically the control loads just
fine initially...
</p>
        <p>
          <img height="283" alt="initial-pos" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/Dojo.CoordsGoodness_97BC/initial-pos_dff4c141-bdb3-4a61-8c44-922f0adb1b4a.png" width="272" border="0" />
        </p>
        <p>
But when the browser window is re-sized, the control remains absolutely positioned
on the page, rather than relative to the container (the VE control), as can be seen
below. 
</p>
        <p>
          <img height="267" alt="after-resize" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/Dojo.CoordsGoodness_97BC/after-resize_aca0b487-f6ba-49b1-9c46-de6d6694995d.png" width="277" border="0" />
        </p>
        <p>
 
</p>
        <p>
Setting the CSS postition:relative, does not work at all, so the solution was to write
a little code that would respond to the browser re-size event, and re-position the
control. Hooking to the resize event is very easy with dojo.connect...  
</p>
        <p>
dojo.connect(window, 'onresize', positionZoomSlider);
</p>
        <p>
Getting the correct position values in order to calculate the correct position was
also easy when using dojo.coords... here's the function that positions my slider.
</p>
        <p>
function positionZoomSlider() {<br />
            //This is needed
because the dojo slider seems to always be absolutely positioned.<br />
            //so we attach
this to the browser re-size so when things move around, the slider<br />
            //is repositioned
correctly.            
<br />
            var control = $get('verticalZoomContainer');<br />
            control.style.top
=  dojo.coords(dojo.byId('contentContainer')).t + 30 + "px"; 
<br />
            control.style.left
= dojo.coords(dojo.byId('contentContainer')).l + 20 + "px"; 
<br />
        } <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=39c46c08-0b8a-43c4-ad83-7f17e92b4fc5" /><br /><hr /><hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></p>
      </div>
    </content>
  </entry>
  <entry>
    <title>Accessing ASP.NET Web Services with dojo.xhrGet</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/10/AccessingASPNETWebServicesWithDojoxhrGet.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,1c2f34d7-efd8-4be2-90d0-63102d38533d.aspx</id>
    <published>2008-06-09T20:06:12.0247500-07:00</published>
    <updated>2008-06-09T20:06:12.0247500-07:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="http://blog.davebouwman.net/CategoryView,category,ASP.NET.aspx" />
    <category term="Dojo" label="Dojo" scheme="http://blog.davebouwman.net/CategoryView,category,Dojo.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
So I've been using the Dojo toolkit for a while now, but mainly for the Dijit and
DojoX UI components.  For the actual Ajax communication layer,  I've been
relying on the Microsoft Ajax framework because of it's seamless integration with
the ASP.NET Web Service model. Since I've got the whole mess of Dojo already being
loaded into the browser, I figured I should drop the crutches, and work out how to
work directly with the Dojo ajax framework. 
</p>
        <p>
The one downside of this is that you no longer get the client side proxies for your
ASP.NET Web Services. Thus today's article - how to directly access an ASP.NET JSON
Web Service using dojo.xhrGet. 
</p>
        <h2>Part 1: Create a Web Service
</h2>
        <p>
This is pretty simple - just add a web service to your web site. I tend to put the
code right in the asmx file, rather than in the code-behind in app_code, but that's
just personal preference.
</p>
        <pre class="code">
          <span style="background: #ffee62">&lt;%</span>
          <span style="color: blue">@ </span>
          <span style="color: #a31515">WebService </span>
          <span style="color: red">Language</span>
          <span style="color: blue">="C#" </span>
          <span style="color: red">Class</span>
          <span style="color: blue">="ASPWebService" </span>
          <span style="background: #ffee62">%&gt; </span>
          <span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Web; <span style="color: blue">using </span>System.Web.Services; <span style="color: blue">using </span>System.Web.Services.Protocols;
[<span style="color: #2b91af">WebService</span>(Namespace = <span style="color: #a31515">"http://tempuri.org/"</span>)]
[<span style="color: #2b91af">WebServiceBinding</span>(ConformsTo = <span style="color: #2b91af">WsiProfiles</span>.BasicProfile1_1)] <span style="color: blue">public
class </span><span style="color: #2b91af">ASPWebService </span>: System.Web.Services.<span style="color: #2b91af">WebService </span>{
[<span style="color: #2b91af">WebMethod</span>] <span style="color: blue">public string </span>SayHello()
{ <span style="color: blue">return </span><span style="color: #a31515">"Hello
to Dojo " </span>+ <span style="color: #2b91af">DateTime</span>.Now.ToLongDateString();
} }</pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
 
</p>
        <p>
By default your web service will be configured to "speak" SOAP, which is
fine if you are consuming it from another application, but for Ajax based browser
apps, it's much easier to work with JSON. 
</p>
        <h2>Part 2: JSON-ify the Web Service
</h2>
        <p>
This is actually really simple - just include System.Web.Script.Services, and the
[ScriptService] attribute to the web service as shown below.
</p>
        <pre class="code">
          <span style="background: #ffee62">&lt;%</span>
          <span style="color: blue">@ </span>
          <span style="color: #a31515">WebService </span>
          <span style="color: red">Language</span>
          <span style="color: blue">="C#" </span>
          <span style="color: red">Class</span>
          <span style="color: blue">="ASPWebService" </span>
          <span style="background: #ffee62">%&gt; </span>
          <span style="color: blue">using </span>System; <span style="color: blue">using </span>System.Web; <span style="color: blue">using </span>System.Web.Services; <span style="color: blue">using </span>System.Web.Services.Protocols; <strong><span style="color: blue">using </span>System.Web.Script.Services;</strong> [<span style="color: #2b91af">WebService</span>(Namespace
= <span style="color: #a31515">"http://tempuri.org/"</span>)] [<span style="color: #2b91af">WebServiceBinding</span>(ConformsTo
= <span style="color: #2b91af">WsiProfiles</span>.BasicProfile1_1)] [<span style="color: #2b91af">ScriptService</span>] <span style="color: blue">public
class </span><span style="color: #2b91af">ASPWebService </span>: System.Web.Services.<span style="color: #2b91af">WebService </span>{
[<span style="color: #2b91af">WebMethod</span>] [<span style="color: #2b91af">ScriptMethod</span>(ResponseFormat
= <span style="color: #2b91af">ResponseFormat</span>.Json, UseHttpGet=<span style="color: blue">true</span>)] <span style="color: blue">public
string </span>SayHello() { <span style="color: blue">return </span><span style="color: #a31515">"Hello
to Dojo " </span>+ <span style="color: #2b91af">DateTime</span>.Now.ToLongDateString();
} }</pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
We also add a [ScriptMethod] attribute to the WebMethod. We do this for two reasons
- first, we want to specify that the response  format should be JSON, and we
also want to allow access to this method via http Get's (this is disabled by default).
</p>
        <p>
At this point you can hit the web service in your web browser, and get the standard
Web Service browser. But if you also stick /js on the end of the url, you will get
the client side Javascript that integrates with the MS Ajax Framework. But we're trying
to work with Dojo, so we'll move on... 
</p>
        <h2>Part 3: Testing the Service in a Browser
</h2>
        <p>
Our simple "SayHello" web method does not take any arguments, so we should
be able to just "GET" it via a browser.
</p>
        <p>
The tricky bit that took me some time to sleuth down was that you also need to edit
web.config to tell the web service to respond to all Gets and Posts. Add this section
(just copy out the parts you are missing - do not paste this whole thing into your
web.config or you will get an error!):
</p>
        <pre class="code">
          <span style="color: blue">&lt;</span>
          <span style="color: #a31515">system.web</span>
          <span style="color: blue">&gt;
&lt;</span>
          <span style="color: #a31515">webServices</span>
          <span style="color: blue">&gt;
&lt;</span>
          <span style="color: #a31515">protocols</span>
          <span style="color: blue">&gt;
&lt;</span>
          <span style="color: #a31515">add </span>
          <span style="color: red">name</span>
          <span style="color: blue">=</span>"<span style="color: blue">HttpGet</span>"<span style="color: blue">/&gt;
&lt;</span><span style="color: #a31515">add </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">HttpPost</span>"<span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">protocols</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">webServices</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;</span></pre>
        <p>
          <span style="color: blue">
          </span>
        </p>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
        </p>
        <p>
Once you do this, you will get the response back. Despite the fact that we have used
the [ScriptMethod] attribute to specify that the SayHello web method should return
Json, this will only occur if you sent the request content-type to "application/json;
charset=utf-8". Without that, you'll still get xml.
</p>
        <h2>Part 4: Create a Simple Page
</h2>
        <p>
For this, I created about the simplest page I could - just a button and a div that
will be updated. Here's the whole page...
</p>
        <pre class="code">
          <span style="color: blue">&lt;!</span>
          <span style="color: #a31515">DOCTYPE </span>
          <span style="color: red">html
PUBLIC </span>
          <span style="color: blue">"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;</span>
          <span style="color: #a31515">html </span>
          <span style="color: red">xmlns</span>
          <span style="color: blue">="http://www.w3.org/1999/xhtml"&gt;
&lt;</span>
          <span style="color: #a31515">head</span>
          <span style="color: blue">&gt;
&lt;</span>
          <span style="color: #a31515">title</span>
          <span style="color: blue">&gt;</span>Dojo
to ASP.NET WebServices<span style="color: blue">&lt;/</span><span style="color: #a31515">title</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript" </span><span style="color: red">src</span><span style="color: blue">="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js" </span><span style="color: red">djConfig</span><span style="color: blue">="parseOnLoad:true,
isDebug:true"&gt;&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;
function </span>updateSampleOne(){ <span style="color: blue">var </span>contentNode
= dojo.byId(<span style="color: #a31515">"sampleone"</span>); dojo.xhrGet({
url: <span style="color: #a31515">"./ASPWebService.asmx/SayHello"</span>,
handleAs: <span style="color: #a31515">"json"</span>, contentType: <span style="color: #a31515">"application/json;
charset=utf-8"</span>, load: <span style="color: blue">function</span>(data,args){contentNode.innerHTML
= data.d;}, error: <span style="color: blue">function</span>(error,args){console.warn(<span style="color: #a31515">"error!"</span>,error);}
}); }; <span style="color: blue">&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">head</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">body</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">h1</span><span style="color: blue">&gt;</span>Using
Dojo to Consume ASP.NET JSON WebServices<span style="color: blue">&lt;/</span><span style="color: #a31515">h1</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">input </span><span style="color: red">id</span><span style="color: blue">="btGetString" </span><span style="color: red">type</span><span style="color: blue">="button" </span><span style="color: red">value</span><span style="color: blue">="Update" </span><span style="color: red">onclick</span><span style="color: blue">="updateSampleOne();"
/&gt; &lt;</span><span style="color: #a31515">div </span><span style="color: red">id</span><span style="color: blue">="sampleone"&gt;</span>This
will update<span style="color: blue">&lt;/</span><span style="color: #a31515">div</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">body</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">html</span><span style="color: blue">&gt;</span></pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
Breaking down the dojo code...
</p>
        <p>
          <span style="color: blue">var </span>contentNode = dojo.byId(<span style="color: #a31515">"sampleone"</span>);
</p>
        <p>
This simply get's a the div that we'll be updating.
</p>
        <pre class="code">dojo.xhrGet({
  url: <span style="color: #a31515">"./ASPWebService.asmx/SayHello"</span>,
handleAs: <span style="color: #a31515">"json"</span>, contentType: <span style="color: #a31515">"application/json;
charset=utf-8"</span>, load: <span style="color: blue">function</span>(data,args){contentNode.innerHTML
= data.d;}, error: <span style="color: blue">function</span>(error,args){console.warn(<span style="color: #a31515">"error!"</span>,error);}
});</pre>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
This is the actual ajax xhr request. Since we are using a GET, we are using dojo.xhrGet. 
</p>
        <p>
The Url of our web service is the asmx file followed by the name of the web method.
Since it's located in the same folder as this html file, we reference it as ./ASPWebService.asmx/SayHello.
</p>
        <p>
The response will be json, so we set handleAs to json
</p>
        <p>
We set the contentType to "application/json; charset=utf-8" as per the <a href="http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx">ASP.NET
security requirements</a>.
</p>
        <p>
When the response returns, we need to do something with it, this is where load comes
in. Dojo uses anonymous functions a lot, and for a simple situation like this, it's
pretty easy to follow. The returned JSON is:
</p>
        <p>
{"d":"Hello to Dojo Tuesday, June 03, 2008"}. 
</p>
        <p>
So we set the contentNode.innerHTML is set to data.d 
</p>
        <p>
Should an error occur, the error function is called.
</p>
        <h2>Summary:
</h2>
        <p>
So - while this is a little more convoluted than just using the MS Ajax client library
and the Script Manager, it does save us from loading multiple client-side frameworks.
Since I'm using Dojo for many other UI components, it seemed a waste to also drag
along MS Ajax when this is a viable alternative.
</p>
        <p>
One may ask why use the ASP.NET Web Services model? Well, from the server side it's
pretty easy to work with. Once a service is created you can access it via Json or
SOAP. They are also easy to unit test.
</p>
        <p>
I'll likely extend this with some more complex examples - like submitting a form,
or sending / receiving complex types, but I'll leave it here for now.
</p>
        <p>
          <a href="http://www.davebouwman.net/sourcecode/DojoService.zip">Download the sample
code</a>
        </p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=1c2f34d7-efd8-4be2-90d0-63102d38533d" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>VerySpatial Podcast Interview</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/05/VerySpatialPodcastInterview.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,503f8d56-ec1f-48c8-8fd6-ffc39e3ae188.aspx</id>
    <published>2008-06-04T20:01:30.0240000-07:00</published>
    <updated>2008-06-04T20:09:38.1185000-07:00</updated>
    <category term="Agile" label="Agile" scheme="http://blog.davebouwman.net/CategoryView,category,Agile.aspx" />
    <category term="Ajax" label="Ajax" scheme="http://blog.davebouwman.net/CategoryView,category,Ajax.aspx" />
    <category term="Podcast" label="Podcast" scheme="http://blog.davebouwman.net/CategoryView,category,Podcast.aspx" />
    <category term="Virtual Earth" label="Virtual Earth" scheme="http://blog.davebouwman.net/CategoryView,category,Virtual%2BEarth.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="margin: 0px 5px 0px 0px;" alt="mic_thumb" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/VerySpatialPodcastInterview_12708/mic_thumb_e6a5d025-32d4-4d06-8be0-d2173aae8f7b.gif" align="left" border="0" height="150" width="100" /> While
at Where 2.0, <a href="http://www.chrisspagnuolo.com">Chris Spagnuolo</a> and I recorded
a podcast with the Very Spatial crew. 
<br /></p>
        <p>
          <br />
In this podcast we talk (at a high-level) about internals of the <a href="http://www.gains.org/MapTools/WISDOMMapExplorer/tabid/547/language/en-US/Default.aspx">Global
Avian Influenza</a> mapping application we built for the <a href="http://www.wcs.org">Wildlife
Conservation Society</a>, and some of the complexities and how we overcame them (think
1-M-M-M database relationships, with complex query criteria and 300ms response times). 
<br /></p>
        <p>
For those that know us, you won't be suprised that we also talked about Agile - how
it fits in with the Where 2.0 crowd, and how we work Agile into our contracting. All
-in - all, a fun experience. 
<br /></p>
        <p>
The <a href="http://veryspatial.com/?p=2156">podcast</a> went live today. Thanks Jesse
&amp; Sue!
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=503f8d56-ec1f-48c8-8fd6-ffc39e3ae188" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Developer Survey: Unit Testing &amp;amp; Other Tools</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/04/DeveloperSurveyUnitTestingAmpOtherTools.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,44d75924-dc67-43f0-b940-4f9b45cb435e.aspx</id>
    <published>2008-06-04T06:28:43.0619980-07:00</published>
    <updated>2008-06-04T06:28:43.0619980-07:00</updated>
    <category term=".NET" label=".NET" scheme="http://blog.davebouwman.net/CategoryView,category,.NET.aspx" />
    <category term="Devt Tools" label="Devt Tools" scheme="http://blog.davebouwman.net/CategoryView,category,Devt%2BTools.aspx" />
    <category term="Fundamentals" label="Fundamentals" scheme="http://blog.davebouwman.net/CategoryView,category,Fundamentals.aspx" />
    <category term="Unit Testing" label="Unit Testing" scheme="http://blog.davebouwman.net/CategoryView,category,Unit%2BTesting.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
This is the third and final part of a three part series summarizing the results of
the 2008 Geospatial Developer Survey. For further information, be sure to check out
read <a href="http://blog.davebouwman.net/2008/05/27/GeospatialDeveloperSurveyResults.aspx">part
one</a> and <a href="http://blog.davebouwman.net/2008/05/29/DeveloperSurveyDesignPatterns.aspx">part
two</a>.  
</p>
        <h2> 
</h2>
        <h2>Use of Source Control Systems
</h2>
        <p>
This is where we start to see some divergence from the larger developer community. 
</p>
        <p>
 <img height="250" alt="scc" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/scc_3c1fcd3e-134d-473f-8a9f-7378e276603d.png" width="322" border="0" /></p>
        <p>
Source control is as much a part of most developers lives as the language they use.
It should be automatic and used by default. Subversion is good, and free. It's not
trivial to setup, but with free subversion hosting services like Assembla.com, there
is virtually no reason not use it. (btw - although I have an "Assembla"
badge in my sidebar, I am not paid to endorse them - their service is solid and so
I promote it).
</p>
        <h2>Automated Build Tools
</h2>
        <p>
With more than half of the respondents not doing automated builds, we are seeing more
of the separation from main-stream development. 
</p>
        <p>
          <img height="244" alt="autobuild-tools" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/autobuild-tools_36a0f8ba-8c45-4f0a-a02e-ff89c9a8378e.png" width="337" border="0" />
        </p>
        <p>
All the choices on this question were .NET, but I also compiled the "Other -
Please specify" results into a chart.
</p>
        <p>
 <img height="271" alt="autobuild-other" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/autobuild-other_6cf10080-19ba-4e3e-84a9-dab32567ca7d.png" width="466" border="0" /></p>
        <h2>Unit Testing
</h2>
        <p>
There were 3 questions on unit testing, mainly because I see this as a key element
raising the quality of GIS software projects. Unit testing is as much a philosophy
about how you develop software as it is the actual writing of tests. Committing to
doing unit testing really says you care about quality, and that you realize that manual
testing, while valuable, is never as consistent as automated tests. So, with that
we start with a look at what percent of projects are using unit testing.
</p>
        <p>
          <img height="273" alt="Using_Unit-Testing" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/Using_Unit-Testing_254e1899-80bf-4fe2-bce5-eeccda80a9af.png" width="467" border="0" />
        </p>
        <p>
I don't know how this stacks up to other industries, but I'd say there is room for
some growth here. Everyone talks about GIS getting on the "service bus",
but we need to make sure that when we get on the bus, our code does not fail!
</p>
        <p>
The next question basically asked why you were not doing more unit testing.
</p>
        <p>
          <img height="245" alt="why-not-unit-testing" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/why-not-unit-testing_ddc0f9fa-85bd-463f-af87-3bb60a975581.png" width="259" border="0" />
        </p>
        <p>
This is actually pretty good. I'd have to question the 14% who don't think it's valuable,
but I'll chock that up to them not knowing what's really involved.
</p>
        <p>
I've heard the "not-enough time" thing before, but the problem is that you
will have bugs. And someone will find them. Better the developer finding them sooner
than a client finding them later. Also, in terms of time, on big projects, I think
you actually save time.Having automated tests, helps you prevent regression. Think
about all the stuff that breaks between a big ArcGIS releases - that's regression,
and that's what good automated tests can catch.   
</p>
        <p>
Difficulty. This is true. Writing good unit tests is hard. Using good design patterns
help, and good tools can ease the pain, but even still it's not easy. Writing unit
tests for ArcObjects code is very difficult, but not impossible. In these cases, I
focus the tests on the most critical parts of a system - basically putting the effort
where it will payoff the most. For these areas, I shoot for 100% code coverage - if
they are the most complex, I want to make sure that my tests cover all possibilities.
Again, difficult, but if you are writing a complex spatial rule engine, that works
with relationships between multiple layers, business workflows, and user permissions,
there is no realistic way to manually test it on any sort of a regular basis.
</p>
        <p>
The next question was "If tests were easier to write, would you write more of
them?"
</p>
        <p>
          <img height="251" alt="unit-tesing-easier" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/unit-tesing-easier_3669eaac-3277-4613-83ee-cdc421a7cdb5.png" width="265" border="0" />
        </p>
        <p>
So, a resounding YES on that. This is great, because as a community we can actually
make this happen.  
</p>
        <p>
A couple years back I threw some code out there under the umbrella of <a href="http://blog.davebouwman.net/SearchView.aspx?q=arcunit">"ArcUnit"</a> -
the files referenced in those posts are now gone, but it was some demo code that showed
how to unit test geometry operations, by serializing geometries and storing them in
the unit test assembly. The <a href="http://svn2.assembla.com/svn/arcdeveloper/TestingUtilities/trunk/">code</a> is
now on Assembla in the ArcDeveloper project, under TestingUtilities. Seeing as there
is interest in this, I'll likely write some more articles on this. 
</p>
        <h2>Unit Testing Frameworks
</h2>
        <p>
Ok - the Java people really ripped on this question. After adding an "Other",
I did tabulate the results for all that as well.
</p>
        <p>
          <img height="261" alt="unit-testing-frameworks" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/unit-testing-frameworks_32bc1d41-01c7-4002-96c4-8a954cdeddc5.png" width="324" border="0" />
        </p>
        <p>
This gets somewhat interesting - 60% of people said they are not using any tools,
but back in the "What percent of your projects use unit testing" only 38%
said "None". I guess some "homegrown" unit testing could explain
a few percent, but... anyhow. Interesting that MBUnit and MSTest are so low. MSTest
is baked into Visual Studio 2008 (Professional and above), and MBUnit is both free
and awesome.
</p>
        <p>
As for the "other", here's how that stacked up.<img height="283" alt="other-ut-frwk" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/other-ut-frwk_2c575cc9-6872-4941-ada0-c6e6a5dd5da3.png" width="472" border="0" /></p>
        <p>
Apparently I could have saved myself a heap of greif if I'd just added jUnit to the
list!
</p>
        <p>
The final Unit Testing question went out to the edge - "What do you think of
Test Driven Development"
</p>
        <p>
          <img height="262" alt="tdd" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/tdd_0205cc4c-9784-4acd-ac6a-57f78739b351.png" width="442" border="0" />
        </p>
        <p>
So at least one zealot in the crowd aims pretty high! For the "No opinion"
crowd, TDD is the practice of writing your unit test before the implementation. The
intent of this is to essentially define the desired behavior in the test, then make
the software behave in that way. No doubt this is difficult, and requires you to be
a total unit testing &amp; pattern guru. I *think* this is possible, even on complex
projects like GIS, but you'd need to be working with a test friendly GIS framework
(as in don't come asking me to build you an ArcGIS Server .NET ADF site using TDD!)
</p>
        <p>
 
</p>
        <h2>Code Refactoring 
</h2>
        <p>
As you write code, there are times when you need to change it's structure - usually
to conform to a pattern, to facilitate extensibility, or just because your function
got long and messy (i.e. you're making maintenance easier!). This is called refactoring.
The first question was related to how often you refactor your code.
</p>
        <p>
          <img height="250" alt="refactoring" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/refactoring_f38322a3-f105-4d5b-a24b-bfa71219b1b0.png" width="353" border="0" />
        </p>
        <p>
The second question related to the use of .NET Refactoring tools. I appologize again
to the non-.NET people, but I don't know of any Java Refactoring tools.
</p>
        <p>
          <img height="270" alt="net-refactoring" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/net-refactoring_5c70c839-461a-4eba-b707-cd7280f09c91.png" width="466" border="0" />
        </p>
        <p>
What's interesting here is that the "Not Refactoring" people are not even
using the tools in Visual Studio. When we were doing a lot of desktop development,
we used RefactorPro - mainly because they had good Visual Basic.NET support. Now that
we're using C# and doing 99% web development, we are finding that the IDE tools /
manual refactoring is sufficient. 
</p>
        <h2>Code Documentation Generation
</h2>
        <p>
This was a quick question on the use of automatic code documentation generators. They
are pretty common in the larger developer community, and relatively easy to bring
into the mix, and spit out some good API documentation. Worth the effort in my opinion.
</p>
        <p>
          <img height="260" alt="doc-tools" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyUnitTestingOtherTools_13B3F/doc-tools_8d1cc877-a67a-41d8-ac8e-738874142dc0.png" width="315" border="0" />
        </p>
        <p>
 
</p>
        <h2>Comments
</h2>
        <p>
Fifty-Two respondents left comments at the end of the survey. Most were constructive,
and others... well... lets look:
</p>
        <blockquote>WTF, no C++ on the list of languages? What language do you think the bulk
of geospatial software (from GDAL to ArcGIS) is written in? C# is just a evil marketing
ploy from MS to try to deflate Java's market; nobody is expected to actually _use_
C#.</blockquote>
        <p>
          <strong>Reply:</strong> Not having C++ was an oversight. As for your issues with C#,
can't help you there.
</p>
        <h2>Summary:
</h2>
        <p>
Overall, this was an interesting experience. Clearly I could do a much better job
on the questions, and have a much wider range of options on the answers. I think it
does show that geospatial developers are adopting main stream techniques and tools,
just at a somewhat slower pace. Thoughts?
</p>
        <p>
          <a href="http://www.davebouwman.net/sourcecode/GeoDeveloperSurvey2008.zip">Download
the results</a> (Excel 2007 format)
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=44d75924-dc67-43f0-b940-4f9b45cb435e" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Dojo Toolkit Kickstart</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/06/03/DojoToolkitKickstart.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,997e27b7-f62f-4488-a8aa-db290e2d70d9.aspx</id>
    <published>2008-06-03T09:41:08.7758750-07:00</published>
    <updated>2008-06-03T09:41:08.7758750-07:00</updated>
    <category term="Ajax" label="Ajax" scheme="http://blog.davebouwman.net/CategoryView,category,Ajax.aspx" />
    <category term="Dojo" label="Dojo" scheme="http://blog.davebouwman.net/CategoryView,category,Dojo.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
While I've messed with the <a href="http://www.dojotoolkit.org">Dojo Toolkit</a> enough
to get the interface elements up and running, I've been delegating a lot of the more
detailed "wiring" work to Mike- "soon to be blogging"-Juniper,
while I worked on the back end web services and database tiers. When I did wire things
up, I tended to use the Microsoft Ajax Client-side Library. 
</p>
        <p>
Mike is out at Microsoft TechEd this week, so for my current project, I've got no
one to lean on, so I'm digging deeper into the Dojo Framework.
</p>
        <p>
For those not in the ArcGIS Server beta program, it's worth noting that the Javascript
API that will be shipping with 9.3 is based on Dojo.
</p>
        <p>
Here are a list of resources that I've been using:
</p>
        <p>
          <a href="http://sitepen.com/labs/guides/?guide=DojoQuickStart">SitePen Dojo Quick
Start Guide</a> 
</p>
        <p>
Pretty quick read, but covers the main ideas so well that it has apparently replaced
the old "Quick Start" guide that was on DojoToolkit.org
</p>
        <p>
          <a href="http://www.dojotoolkit.org/book/dojo-book-1-0">Book of Dojo @ DojoToolkit.org</a>
        </p>
        <p>
This is a one-stop shop for what's in Dojo. Quality varies between the sections, but
overall, a good starting point for what's in there. Covers Dojo, Dijit and DojoX.
</p>
        <p>
          <a href="http://dojocampus.org/explorer/">Dojo Feature Explorer @DojoCampus.org</a>
        </p>
        <p>
This is another good place to see what the controls can do, and you can see the code
as well. Again not 100% complete, but covers much of Dojo, Dijit and DojoX.
</p>
        <p>
          <a href="http://dojocampus.org/content/">Articles @ DojoCampus.org</a>
        </p>
        <p>
Be sure to check out the articles on the site. They are pretty focused, but well written.
</p>
        <p>
Have some other great Dojo Framework resources? Drop them in the comments! 
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=997e27b7-f62f-4488-a8aa-db290e2d70d9" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Mapping Bird Flu Data</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/30/MappingBirdFluData.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,e88f8e0c-07f2-4082-b647-07912bebbad4.aspx</id>
    <published>2008-05-30T10:26:39.7910000-07:00</published>
    <updated>2008-05-30T10:28:57.6196250-07:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="http://blog.davebouwman.net/CategoryView,category,ASP.NET.aspx" />
    <category term="DNN" label="DNN" scheme="http://blog.davebouwman.net/CategoryView,category,DNN.aspx" />
    <category term="Dojo" label="Dojo" scheme="http://blog.davebouwman.net/CategoryView,category,Dojo.aspx" />
    <category term="Virtual Earth" label="Virtual Earth" scheme="http://blog.davebouwman.net/CategoryView,category,Virtual%2BEarth.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Starting in February we have been working with the <a href="http://www.wcs.org">Wildlife
Conservation Society</a> to create a map viewer for their Global Avian Influenza site
(<a href="http://www.gains.org">www.gains.org</a>). This updated viewer launched a
few weeks ago, and I thought I'd share a little bit about the project. 
</p>
        <h2>About the Project
</h2>
        <p>
The project is pretty straightforward, with only a few top level user stories: 
<br /></p>
        <blockquote>
          <p>
- Map the scientific data that has been collected as part of the GAINS program.<br /></p>
        </blockquote>
        <blockquote>
          <p>
- Allow users to filter the displayed this data by : 
<br /></p>
        </blockquote>
        <blockquote>
          <blockquote>
            <p>
country,date range,species, and influenza subtype.<br /></p>
            <p>
Also facilitate this functionality via Url parameters. 
</p>
          </blockquote>
        </blockquote>
        <blockquote>- Functionality to be delivered as a <a href="http://www.dotnetnuke.com">DotNetNuke</a> module<br /><br />
- It has to be fast.</blockquote>
        <h2>Technologies:
</h2>
        <p>
We used Virtual Earth for the mapping canvas since WCS needed a high-quality global
data set, and this platform is free for non-profits.
</p>
        <p>
For the UI, we dove into the <a href="http://www.dojotoolkit.org/">Dojo Toolkit</a>.
This ended up working really well, with the exception of the tree view. It was just
a huge pain to get the Dojo Tree to work the way we wanted it to, and dropping in
the <a href="http://developer.yahoo.com/yui/treeview/">YahooUI TreeView</a> solved
these issues in minutes.
</p>
        <p>
On the back end, it's we used ASP.NET. Since this was going to be a heavy Ajax site,
we also leveraged the ASP.NET web services which are marked up so that they "speak"
json (anyone know if there is a more graceful / concise name for this??? ASP.NET Script
Services?). Behind that there is a SQL 2005 tabular database, ArcGIS Server and ArcSDE.
</p>
        <p>
The main UI for the map can be seen below. The data points are clustered, and symbolized
based on the match to the filter criteria.
</p>
        <p>
 <img alt="wme" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/MappingAvianInfluenzaIncidentsBehindtheS_F435/wme_b3d916d3-7aaa-47d4-a101-d124152a8478.png" border="0" height="428" width="505" /></p>
        <h2>Data Filtering
</h2>
        <p>
The points displayed on the map meet a set of criteria, which can be chosen on this
UI. Not that the design is overly beautiful, but it's a mix of Dojo and Microsoft
Ajax controls - using the best parts of both. Actually applying this criteria against
the database and retrieving the points was non-trivial, so I'm going to write up another
post about how we got all that working.
</p>
        <h2>
          <img alt="wme-criteria" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/MappingAvianInfluenzaIncidentsBehindtheS_F435/wme-criteria_a06ff2ff-6126-4cf7-86e6-f224e665f642.png" border="0" height="428" width="505" />
        </h2>
        <h2>External Data: Dynamic WMS Tile Caching
</h2>
        <p>
The module can be configured to pull in tile services from different WMS servers.
This shows my favorite - the global poultry density map. If you are on the site, you
can turn these layers on / off this from Map Data --&gt; Manage Atlas Layers. Administrators
have a UI to setup the WMS Services. Since mass poultry migrations are rare, most
of this data is pretty static. Thus we dynamically cache the tiles on the WCS server
so we get improved performance. We do see some offsets in the tiles at the lower zoom
levels due to the variations between WGS84 and the Web Mercator projection of VE.
</p>
        <p>
          <img alt="wms-atlas-layers" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/MappingAvianInfluenzaIncidentsBehindtheS_F435/wms-atlas-layers_b202e7d1-c673-4722-b522-3cdc321012dc.png" border="0" height="428" width="505" />
        </p>
        <h2>External Data: GeoJSON Features from ArcGIS Server 9.2
</h2>
        <p>
We also have the <a href="http://www.arcdeveloper.net/Source.ashx">ArcDeveloper 9.2
REST API</a> for ArcGIS Server 9.2 in the mix, pulling in flyway geometries. For species
that have flyways, an extra item shows up in the identify tree. Here's a link to a
map showing <a href="http://www.gains.org/MapTools/WISDOMMapExplorer/tabid/547/language/en-US/Default.aspx?taxaid=572">Calidris
alpina</a>, which has flyways. Mouse over a feature, click "View Details" in the pop-up
and then expand the tree until you see "Show Flyway". This makes a JSONP call to the
REST service running on a different server, grabs the geometries and drops them into
the map. Since this species as multiple flyways, multiple polygons are drawn with
various colors.
</p>
        <h2> <img alt="flyways" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/MappingAvianInfluenzaIncidentsBehindtheS_F435/flyways_cbbb6d5f-bf24-450e-8542-6d4f17d1c711.png" border="0" height="428" width="505" /></h2>
        <p>
It's been a great project to work on, and we are continuing to work with the Wildlife
Conservation Society to add additional functionality into this application. 
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=e88f8e0c-07f2-4082-b647-07912bebbad4" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Developer Survey: Design Patterns</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/29/DeveloperSurveyDesignPatterns.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,652e98f0-10f4-4176-be3b-5d79b2ca1292.aspx</id>
    <published>2008-05-29T15:42:30.0727500-07:00</published>
    <updated>2008-05-29T15:42:30.0727500-07:00</updated>
    <category term="Fundamentals" label="Fundamentals" scheme="http://blog.davebouwman.net/CategoryView,category,Fundamentals.aspx" />
    <category term="General" label="General" scheme="http://blog.davebouwman.net/CategoryView,category,General.aspx" />
    <category term="Software" label="Software" scheme="http://blog.davebouwman.net/CategoryView,category,Software.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
In this go round, we'll look at the questions related to Design Patterns...
</p>
        <h2>Design Patterns
</h2>
        <p>
The question was "When you hear the term 'Design Patterns' what comes to mind?". 
</p>
        <p>
 <img height="241" alt="GOF-Patterns" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyTechnicalInsights_12FF7/GOF-Patterns_db50153f-59cc-45ca-add7-b6a4682e775b.png" width="332" border="0" /></p>
        <p>
A majority of people did get that GOF = Gang of Four = Erich Gamma, Richard Helm,
Ralph Johnson, and John Vlissides<strong><em> </em></strong>the authors of the
book <strong><em>"Design Patterns: Elements of Reusable Object-Oriented Software",</em></strong> 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. <a href="http://martinfowler.com/">Martin
Fowler's</a> 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.
</p>
        <h2>Pattern Adoption
</h2>
        <p>
I guess this one has a call to action for someone to setup a community site to document
and evolve some geospatial patterns. 
</p>
        <p>
          <img height="265" alt="pattern-adoption" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyTechnicalInsights_12FF7/pattern-adoption_f2afef4e-d6fc-4eb4-9417-0fae212928af.png" width="345" border="0" />
        </p>
        <p>
If people are interested, I can stand up a wiki at <a href="http://www.arcdeveloper.net">ArcDeveloper.net</a>,
but someone else will need to push this forward as I've got a full plate.
</p>
        <h2>Model View Pattern Use
</h2>
        <p>
"Rate your use of Model View * Patterns" was the question. 
</p>
        <p>
 <img height="256" alt="MVC-Usage" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyTechnicalInsights_12FF7/MVC-Usage_fc4031f2-bcf7-43e0-8012-b6ed41498a4e.png" width="314" border="0" /></p>
        <p>
For those not familiar with MV* - this refers to a whole family of patterns, related
to the <a href="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller</a> 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 <a href="http://martinfowler.com/eaaDev/uiArchs.html">Martin
Fowler</a> has a (burly) overview of these patterns. You can also check out the <a href="http://www.asp.net/mvc/">ASP.NET
MVC</a> stuff to get the Microsoft take on this, or check out <a href="http://www.castleproject.org/monorail/index.html">MonoRail</a>,
which is part of the <a href="http://www.castleproject.org/">Castle Project</a>. And
for a change of pace, you could check out <a href="http://www.rubyonrails.org/">Ruby
on Rails</a> which is rooted in this pattern. 
</p>
        <h2>Inversion of Control &amp; Dependency Injection
</h2>
        <p>
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. 
</p>
        <p>
          <img height="252" alt="IOC" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/DeveloperSurveyTechnicalInsights_12FF7/IOC_a06ca229-dcf6-448d-99d9-ef6d00a82ead.png" width="350" border="0" />
        </p>
        <p>
So, with nearly 75% not knowing what this is... succinctly put, <a href="http://martinfowler.com/articles/injection.html">Inversion
of Control and Dependency Injection patterns</a> 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 <a href="http://www.castleproject.org/container/index.html">Castle Windsor IOC</a> container. 
</p>
        <p>
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.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=652e98f0-10f4-4176-be3b-5d79b2ca1292" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Getting my Mac(Book Pro) on...</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/29/GettingMyMacBookProOn.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,6ebc5e99-bb6f-4c31-a147-dca896e02095.aspx</id>
    <published>2008-05-28T19:58:21.3540000-07:00</published>
    <updated>2008-05-28T19:58:21.3540000-07:00</updated>
    <category term="Mac" label="Mac" scheme="http://blog.davebouwman.net/CategoryView,category,Mac.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img height="129" alt="apple" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/GettingmyMacon_126D2/apple_fdd23a9e-68b6-415f-8c35-a8f242f6804d.jpg" width="107" align="left" border="0" /> So
we needed to do some testing of sites on Safari on a Mac, and I asked around the company,
and low it turns out that there was an orphan MacBook Pro floating about. After a
quick trip via FedEx, this lithe beast is now sitting on my desk. Turns out that the
power supply has a short in it, so it will be a few days before I fire it up and take
furtive steps into the the heart of darkness.
</p>
        <p>
Actually I'm pretty excited to see what all the fuss is about. With a dead battery
and no juice, my take thus far is purely physical, and as everyone knows, Apple groks
design. Why can't my Toshiba be as solid, and well designed at this Mac? Who knows,
but it sure feels nice. Once I get it fired up, we'll see how OS10 treats me. I'm
got some rusty old-skool unix tricks up my sleeves, but it's going to be a little
bumpy at first. Clearly there is something good going in with them though, as MacBooks
were the rule for anyone with any sort of Neogeo cred at Where 2.0 . We'll see if
10 years of Windows development has ruined me, or if I can get my Mac on. Stay tuned!
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=6ebc5e99-bb6f-4c31-a147-dca896e02095" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Geospatial Developer Survey Results</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/27/GeospatialDeveloperSurveyResults.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,b7d4821e-74b9-4f0d-bb28-41d0a87d5e3a.aspx</id>
    <published>2008-05-27T09:00:58.1682500-07:00</published>
    <updated>2008-05-27T09:00:58.1682500-07:00</updated>
    <category term="Fundamentals" label="Fundamentals" scheme="http://blog.davebouwman.net/CategoryView,category,Fundamentals.aspx" />
    <category term="General" label="General" scheme="http://blog.davebouwman.net/CategoryView,category,General.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Newly refreshed after a week of vacation, I thought I'd start things up with the results
of the informal "2008 Geospatial Developer Survey". I'll start by thanking
the 320 people who took the time to complete it. Admittedly it was a little rough
in spots - turns out that writing good survey questions is tougher than you'd think! 
</p>
        <p>
Since there were 30 questions in the survey, I'm breaking this into a few posts. As
promised, I will post the results as an excel file with the last post. 
</p>
        <h2>Who are you?
</h2>
        <p>
I thought I should start off the survey with an easy one - what's your role.
</p>
        <p>
          <img height="277" alt="who-are-you" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/who-are-you_cb64fba3-917c-407b-a6be-b7d4ab7b8933.png" width="354" border="0" />
        </p>
        <p>
The split across titles was somewhat interesting - almost even between "Analysts
who write code", and those who consider themselves "GIS Software Developers",
with "Software Engineer" trailing slightly. I see this as a progression
from "getting things done" coding towards more "built to last"
coding.
</p>
        <h2>Primary Development Language
</h2>
        <p>
There were a lot of "other" responses on this one, mainly along the lines
of "Mix of languages - VB.NET, VBScript, JavaScript, Python, and others".
</p>
        <p>
The idea of this question was to get a feel for what you <strong>most commonly</strong> work
with. I went through the "others" and tabulated them into the mix. Since
there were so many variations in the "other" categories, I collapsed them
into one group for the pie chart. Perhaps not surprisingly, .NET was the prominent
platform with a 61% share.
</p>
        <p>
 <img height="279" alt="dev-lang" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/dev-lang_e58bbb5e-6334-4c89-bdf7-93d8f6f969c0.png" width="265" border="0" />  
</p>
        <p>
Here is how the "other" broke out by count of times they were mentioned.
I'm pretty surprised that there are still people using VB6 and VBA. While these tools
get the job done, the lifecycle for VB6 apps must be coming to a close. 
</p>
        <p>
 
</p>
        <p>
          <img height="275" alt="dev-other" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/dev-other_119671ba-5196-4124-8eea-16a3c65d839e.png" width="464" border="0" />
        </p>
        <h2>Who do you Develop For?
</h2>
        <p>
Almost a 50-50 split on internal vs external clients. Some people were asking why
I asked this. I was interested in seeing any relationships between engineering practices
and the client base - would there be more advanced software techniques used for the
external clients vs internal? With a 50-50 split, it's not entirely obvious, but I've
since downloaded the data into a database and I'll try to split out the data a little
more to see how this breaks things down. 
</p>
        <p>
          <img height="250" alt="clients" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/clients_32b307b7-9ab6-4a61-a5bd-c6c5498ef403.png" width="306" border="0" />
        </p>
        <h2>Use of ESRI GIS Products
</h2>
        <p>
This is another question that I got some flak for - but I think it's relevant in that
I'm interested in knowing what my readers are using. 40% of the respondents are only
using ESRI. Actually I had thought this would be higher - the idea that 60% of respondents
are using some mix of non-ESRI GIS tools is very interesting. I'm sure a lot of that
is Autodesk stuff, but there's got to be some MapServer, GeoServer, PostGIS and other
open source stuff making an appearance in here. Next year I'll change this one up
so we can see the mix of packages being used.
</p>
        <p>
          <img height="248" alt="esri-mix" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/esri-mix_b4cf1f05-70d1-45cf-8a35-37babcd7aebb.png" width="256" border="0" />
        </p>
        <h2>Coding Standards
</h2>
        <p>
It's nice to see that most respondents have some type of coding standards. 
</p>
        <p>
          <img height="243" alt="code-stds" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/code-stds_257e6b50-7b9c-4f8c-85e4-10a8e3634f0e.png" width="328" border="0" />
        </p>
        <p>
Mostly informal, but that's a start, and if you have a solid team, it's likely all
you need. Those folks with out any type of coding standards should really consider
setting up something - most languages have some sort of recommendations or conventions.
The goal of coding standards is simply to ensure that everyone on your team is writing
code in such a way that anyone else on the team can easily tell what's going on. If
nothing else - simply using clear names for your variables is a good starting point. 
</p>
        <p>
  
</p>
        <h2>Development Life-Cycles
</h2>
        <p>
This was interesting, and will require more analysis, but here's how I look at this.
50% of respondents classified themselves as Developers or Software engineers, and
just about 50% also fell into Agile or Waterfall. 30% classified themselves as GIS
Analysts who Code, and we see about 35% of cowboy coders. 
</p>
        <p>
          <img height="265" alt="dev-proc" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/SurveyResultsPart1_126D5/dev-proc_fda818ba-a7e5-42fd-b7c8-5812fee78824.png" width="451" border="0" />
        </p>
        <p>
I'll cut things off here for now - next time I'm going to cover some of the more technical
questions - design patterns, unit testing etc. I also need to get the data out of
survey monkey in a database format so I can use SQL to tease more information out
of the results.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=b7d4821e-74b9-4f0d-bb28-41d0a87d5e3a" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Where 2 Next?</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/15/Where2Next.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,12378293-4f9d-4349-97bc-a3bedf26387d.aspx</id>
    <published>2008-05-15T07:28:25.7442505-07:00</published>
    <updated>2008-05-15T07:28:25.7442505-07:00</updated>
    <category term="Where 2.0" label="Where 2.0" scheme="http://blog.davebouwman.net/CategoryView,category,Where%2B2.0.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
My thoughts after Where 2008...
</p>
        <p>
In my view, the "Where 2.0" movement/phenomena is about the democratization
of mapping - remix this, mash in that, geocode it and get it on a map. My Map. With
My Stuff and My Friends. Social graphs and all that. For many things, "close" <em>really
is</em> good enough, and since it's "your" data, validation is less of an
issue ( did you "really" like that pub? ) . Usability and performance are
huge driving factors because many of these sites rely on users "wanting"
to participate. This is driving the rapid evolution in terms of user experience, and
poorly designed or slow sites fade quickly.
</p>
        <p>
Meanwhile back in "GIScience"-land, the hard-core old guard have railed
against pushpins as too simple, in-accurate or just lame. Not sure why there is so
much insecurity, but maybe it's just a little envy that a bunch of javascript hackers
made maps "cool". Many GIS applications have a "captive" audience
(i.e. staff who have to use the site to do their job), usability has been low on the
list, and performance an after though. The emphasis was placed on trying to cram desktop
type work-flows and interaction models into a browser. Needless to say this has its
drawbacks. 
</p>
        <p>
Not to use the <a href="http://www.chrisspagnuolo.com/Where20JohnHankeGoogleAndJackDESRI.aspx">John
Hanke and Jack Dangermond</a> session as too much of a metaphor, but these two camps
seem to be coming together, or at least recognizing they both bring something valuable
to the table. Sure there is still lots of misunderstanding, but things are getting
better. Many of the "mash up" people I've talked to are realizing that the
next step is to add spatial analysis. Not buttons &amp; dials type analysis for the
sake of it, but leveraged in context of answering a question. Sure the social graph
is cool, but there are all sorts of new and interesting ways to leverage that when
used in conjunction with spatial analytics. It opens lots of new scenarios. There
is a realization that the scientifically backed, validated data has serious value
in addition to "my data" or crowd-sourced data. 
</p>
        <p>
Going the other way, the GIS crowd (sadly under-represented at Where) is coming around
to the idea that even their "captive" user base appreciates (or demand)
a good user experience - design &amp; performance matter. A lot more than they thought.
And maybe it does make sense to dial back some of the "science" options
in order to optimize performance. Some times "close" is good enough, and
the performance trade off to get to "really really really close" is not
always worth it. 
</p>
        <p>
This is a good thing and the whole industry / community will be better for it. GIScience
sites/services that embrace the usability and performance of the neogeography sites
will flourish if for no other reason than their users "like" using them.
And if you're a social site looking to stand out, adding a shot of analysis into the
sauce may be the trick.
</p>
        <p>
It's been fun and I'm leaving with a head full of interesting ideas. 
</p>
        <h2>If you are presenting...
</h2>
        <p>
A parting word for anyone presenting at Where (or anything else) - Please please please
read <a href="http://www.presentationzen.com/">Presentation Zen</a> (the book &amp;
site) before you show up.  I (and others I talked with) had really expected that
these presentations would be on the level of <a href="http://www.ted.com/">TED</a> -
sadly this was the exception, not the norm. There were some big name companies up
on stage with horrid slide decks - some were literally painful to view. Sure you have
a cool 3 minute video that's super slick, and you likely spend 500K on, but following
that with a jumble of bullets on neon-green background with heinous clip art some
what spoils the effect. If you have 15 minutes in front of a crowd of thought-leaders,
maybe you should spend more than 15 minutes on your slides.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=12378293-4f9d-4349-97bc-a3bedf26387d" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Where Ideas Worth Sharing...</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/13/WhereIdeasWorthSharing.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,f29131b6-6a26-4b9d-abab-6ee6623e7cdd.aspx</id>
    <published>2008-05-13T13:09:35.1663750-07:00</published>
    <updated>2008-05-13T13:09:35.1663750-07:00</updated>
    <category term="Where 2.0" label="Where 2.0" scheme="http://blog.davebouwman.net/CategoryView,category,Where%2B2.0.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Since there many <a href="http://blog.johnmckerrell.com">other</a> <a href="http://www.chrisspagnuolo.com">people</a> are
blogging the details of Where, I'm just going to take notes about the ideas that resonate
with me...
</p>
        <p>
          <strong>Make your maps permalink friendly:</strong> Everyblock.com has a Uri hierarchy
(RESTy?) that makes sense, and allows deep-linking and deep-search. 
</p>
        <p>
          <strong>Need to do more than points:</strong> deal with "areas" - neighborhoods,
routes etc. Especially relevant for geo-locating events/stories, where push-pins over
simplify. The situation. 
</p>
        <p>
          <strong>Roll your own maps:</strong> make the map relevant for your users. Don't show
what you don't need. Control the look &amp; feel of the cartography and make it part
of the site design. 
</p>
        <p>
          <strong>Federated Geodata:</strong> (Sean Gorman) someone other than ESRI talking
about breaking data out of the silos. Not much detail on the "how", or synchronizing
updates, but maybe he'll <a href="http://blog.fortiusone.com/">post more details</a>.
</p>
        <p>
          <strong>GOOG &amp; ESRI:</strong> Enabling data sharing / deep indexing. Good demos
of ArcGIS Server analysis fronted by a consumer UI experience - geoprocessing in Google
Earth. The "real" application were a change of pace - not that "my
friend recommends the calamari at this place" isn't useful, but real-time forest
fire modeling / evacuation planning just has a little more "bite" to it.  
</p>
        <p>
Overall, an interesting morning. The John Hanke and Jack Dangermond session certainly
got people talking - and that's always a good thing.  Should be interesting to
see how many groups open up their ArcGIS Server 9.3 systems to Google's indexing.
Discovering data that's been walled off for so long could be really interesting.
</p>
        <p>
More later...
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=f29131b6-6a26-4b9d-abab-6ee6623e7cdd" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Bloody Knuckles with Open Layers, PostGIS and GeoServer</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/12/BloodyKnucklesWithOpenLayersPostGISAndGeoServer.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,e143d922-130f-4f87-8a6d-24d19325c648.aspx</id>
    <published>2008-05-12T16:52:48.0413750-07:00</published>
    <updated>2008-05-12T16:52:48.0413750-07:00</updated>
    <category term="PostGIS" label="PostGIS" scheme="http://blog.davebouwman.net/CategoryView,category,PostGIS.aspx" />
    <category term="Web Mapping" label="Web Mapping" scheme="http://blog.davebouwman.net/CategoryView,category,Web%2BMapping.aspx" />
    <category term="Where 2.0" label="Where 2.0" scheme="http://blog.davebouwman.net/CategoryView,category,Where%2B2.0.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img height="263" alt="knuckles" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/OpenLayersPostGISandGeoServerSession_B964/knuckles_bb27d9d8-b253-4568-98a1-b30c835dac80.png" width="350" border="0" />
        </p>
        <p>
So the session was hampered by some corrupted data on the USB sticks, and was more
a loosely guided tour of the stack than anything else. I had PostGIS up and running,
but could not get my data (loaded into ArcSDE on PostgreSQL using the PostGIS datatype)
to load into GeoServer. Tried some other data, and same problem. Unclear what the
issue is.
</p>
        <p>
Many of the sample SLD's would not validate (hence could not be loaded), and I could
never get the WMS group layers to work. I did get some data up in Google Earth, and
open layers, but overall this session confirmed for me that the open source stack
learning curve is steep from the get go. I need to get into OpenLayers as the demo's
were pretty cool but until I can get the back end all working smoothly it's somewhat
moot.
</p>
        <p>
I think that the docs for this will be up somewhere. The software installers are below.
</p>
        <p>
Downloads: <a href="http://files.opengeo.org/where2/stick/software">http://files.opengeo.org/where2/stick/software</a></p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=e143d922-130f-4f87-8a6d-24d19325c648" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>OpenStreetMap</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/12/OpenStreetMap.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,dd2393a4-9d0d-4ae2-b9e8-d9af004eafab.aspx</id>
    <published>2008-05-12T10:10:18.3070000-07:00</published>
    <updated>2008-05-12T10:10:18.3070000-07:00</updated>
    <category term="Where 2.0" label="Where 2.0" scheme="http://blog.davebouwman.net/CategoryView,category,Where%2B2.0.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Grass roots re-mapping efforts, focused on Europe. Crowd-sourcing. Pretty nice cartography.
See the maps here: <a title="http://www.openstreetmap.org/" href="http://www.openstreetmap.org/">http://www.openstreetmap.org/</a></p>
        <p>
 <img height="364" alt="OSM" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/OpenStreetMap_9B23/OSM_e78c6519-dae1-4870-ae99-b17f5db7757e.png" width="464" border="0" /></p>
        <p>
Note the pubs shown on the map via the Pint glass on the map. Nice.
</p>
        <p>
Has features not in other maps - foot paths (dashed red lines), Pubs etc.
</p>
        <p>
Starting in the US based off Tiger data, and updated. 
</p>
        <h2>The Back-End Story
</h2>
        <p>
Simple data model. Nodes, Ways (lines, or polys if node1 = nodeN), Relations
</p>
        <p>
Runs on MySQL. 30,000,000 records. All changes stored. No "geo" columns,
just points. Use scaled integers instead of doubles, and some saucy indexes. "SDE
like" tiled indexes.
</p>
        <p>
Planet.osm - rendering format in Xml. ~4Gb. Released weekly. From there you usually
load it into PostGres with a Geocolumn, and then push this out via Mapserver, or GeoServer,
or subset as you need.
</p>
        <p>
Site runs in Ruby on Rails. OpenLayers for the slippy map. Off-line and on-line editors.
All stored in Subversion
</p>
        <p>
API was RESTful from day 1. <a href="http://www.openstreetmap.org/api/0.5/node/45">http://www.openstreetmap.org/api/0.5/node/45</a></p>
        <h2>Tags - What is it?
</h2>
        <p>
Every object has keys and values associated with it. Community process for selecting
keys and values. Keys and Tags must be approved, or features will not be on the map.
There are 100's of tags.
</p>
        <h2>Current Rendering
</h2>
        <p>
Mapnik (apparently easier and simpler than MapServer) c-based tool that uses a huge
Xml file for styling (looks like SLD?). Runs off the Postgres version of the OSM data.
Tiles are created on request, and cached. There is a background tile cacher daemon.
Tile cutter is on one box, cranking like 20 million tiles a day.
</p>
        <p>
Osmarender - Xml --&gt; Xslt --&gt; SVG. Slow to convert. Rendering is done across
a network of end-user PCs.  
</p>
        <p>
Tiles match the Google scheme, which makes mashups easy.
</p>
        <p>
Now moving onto mobile platforms
</p>
        <p>
OSM is topological from the start, so it supports routing. Currently there are some
simple routing options, but until the data density is higher, it's not too useful.
High-performance routing is CPU intensive, and no plans to add that as a service.
</p>
        <p>
Lots of other projects going on, so check it out over at openstreetmap.org.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=dd2393a4-9d0d-4ae2-b9e8-d9af004eafab" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Mapstraction Kung-Fu Session with Andrew Turner</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/12/MapstractionKungFuSessionWithAndrewTurner.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,96ae360c-c70a-4d15-9baa-dd09393ed05d.aspx</id>
    <published>2008-05-12T09:17:46.1820000-07:00</published>
    <updated>2008-05-12T09:17:46.1820000-07:00</updated>
    <category term="Where 2.0" label="Where 2.0" scheme="http://blog.davebouwman.net/CategoryView,category,Where%2B2.0.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ok, hopes for a Bruce Lee javascript smack down were thwarted when Andrew started
off with "this is Where 2.0 101". 
</p>
        <p>
Started out with a quick run over the common formats - GeoRSS, KML and Microformats.
</p>
        <p>
Microformats - additional HTML markup that are conventions for geolocating content. <a href="http://microformats.org/wiki/geo">geo</a> &amp; <a href="http://microformats.org/wiki/adr">adr</a> for
lat/long and address. 
</p>
        <p>
High-speed review of REST with <a href="http://highearthorbit.com/a-proposal-georss-kml/">"spiffy
diagram"</a></p>
        <p>
Must do some reading on Atom - maybe have lunch with local Atom fan-boy <a href="http://zcologia.com/news/">Sean
Gilles</a> ;-)
</p>
        <p>
 
</p>
        <h2>What is Mapstraction?
</h2>
        <p>
Javascript mapping API wrapper covering least common denominator functionality across
9 or so map platforms. Essentially a layer of indirection that will allow you to change
the back-end (i.e. Google Maps to Poly9) without breaking your application. 
</p>
        <p>
It can do image overlays - which is nice because you can then push very dynamic data
(i.e. data that can't be tiled) into the map.
</p>
        <p>
Nice tile layer schema for roll-your-own tile services
</p>
        <p>
GeoRSS and geojson direct consumption.
</p>
        <p>
Support Filtering by a range of things - category, date etc.
</p>
        <p>
It does not break terms of service - it still uses the underlying API's, so the tile
providers are cool with using this.
</p>
        <p>
Still allows you to go below Mapstraction to the underlying provider. So, you'd be
able to write most of the site in Mapstraction, then jump down into some VE/GM specific
stuff if you need to (obviously this limits how you can change between the back-ends)
</p>
        <p>
OpenSearch: Expose the search interface for a website directly into a browser search.
Details at opensearch.org. OpenSearch-Geo - extensions to support location strings.
Supports location name, lat/lon + radius, bbox.
</p>
        <p>
This is very cool - need to push this into some of our sites.
</p>
        <p>
Mapstraction is BSD license so do what you like.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=96ae360c-c70a-4d15-9baa-dd09393ed05d" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>PostGIS Round 2: Reading The Manual</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/12/PostGISRound2ReadingTheManual.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,181ed031-eff4-4427-9cd4-c416328c0024.aspx</id>
    <published>2008-05-12T08:21:07.7913750-07:00</published>
    <updated>2008-05-12T08:21:07.7913750-07:00</updated>
    <category term="ArcSDE" label="ArcSDE" scheme="http://blog.davebouwman.net/CategoryView,category,ArcSDE.aspx" />
    <category term="PostGIS" label="PostGIS" scheme="http://blog.davebouwman.net/CategoryView,category,PostGIS.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks to Ron Bruder who left a comment on the previous post with the link directly
to the <a href="http://webhelp.esri.com/arcgisserver/9.3/dotNet/index.htm#geodatabases/using_th485132809.htm">documentation
for using the PostGIS</a> geometries in the geodatabase. I did have some weirdness
trying to access the link - of course you'll need to login because it's still beta
documentation, but even after, that I'd see the page, and then it would jump me back
to the login screen. I was able to access it by saving the link to Html and then viewing
it. Moving on...
</p>
        <h2>Using PostGIS Spatial Format
</h2>
        <p>
The ArcSDE doc says that to store data in PostGIS format, you need to create the "database"
(presumably the "sde" database) using the postgis template, then create
the sde user and sde schema before running the post install. Ok. Since I'd already
done this, I dropped the sde database, then re-created it as per the instructions
and... yeah.
</p>
        <p>
So the post install failed. It did handily suggest looking at some logs buried away
in the sde folder tree, and low the log did have a handy little gem:
</p>
        <blockquote>
          <p>
db_table_grant_access: Grantee public does not have USAGE permission on schema sde.
</p>
        </blockquote>
        <p>
Ok. Back into <a href="http://pgsql.navicat.com/download.html">Navicat</a>, grant
USAGE to Public on the sde schema, and the post installer is completed. While my end
goal is to use Direct Connect, to start, I'm just going to run the SDE service until
I know everything else is working.
</p>
        <p>
The next step is to get ArcGIS to use the PostGIS format. For this you need to edit
the "dbtune file". From past experience with ArcSDE on SQL Server, I thought
that "dbtune" was now a table, and it's a whole lot easier to edit a table
than fiddle with the dbtune export/import mess. So, I simply updated the GEOMETRY_STORAGE
parameter in the DEFAULTS section of the SDE_DBTUNE table to be "PG_GEOMETRY".
So now I should be able to use ArcGIS Desktop to edit / manage data in PostGIS, while
still accessing the data as native PostGIS format for say GeoServer and uDig.
</p>
        <h2>Adding and Editing Data
</h2>
        <p>
I used the standard Import feature in ArcCatalog, and this worked smoothly. I then
fired up uDig to see if it would show up a native PostGIS layer... yep... along with
all the other tables in the sde schema. I think that there are likely better ways
to organize your data, so this is likely not a "real" issue.
</p>
        <p>
 <img height="363" alt="udig-map" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISRound2ReadingTheManual_7DF0/udig-map_f8e3f382-2ecb-4c77-b1d1-23e35800174f.png" width="500" border="0" /></p>
        <p>
I had some issues applying a thematic renderer to the layer - for some reason it would
only apply the renderer to the vectors. When I looked at the SLD xml, everything was
setup as a &lt;sld:LineSymbolizer&gt;... since it looks fine in ArcMap (see below),
and the original shapefile loads into uDig as polygons, this may be an "beta"
issue. Ordinarily I'd check the beta forums right now, but I'm writing this at 38575ft
en route to Where 2.0, so that will have to wait. ;-)
</p>
        <p>
Loading data via ArcSDE into ArcMap works very smoothly. 
</p>
        <p>
          <img height="353" alt="arcmap-map" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISRound2ReadingTheManual_7DF0/arcmap-map_8fa7ba81-72bb-4429-86ca-ca199dad75b6.png" width="500" border="0" />
        </p>
        <p>
And after telling ArcMap to let me edit "unversioned" data, I could edit
as usual. uDig says I can't edit the layer. Being really new to this whole stack,
I'm not sure if it's permissions (although I connect as the same identity in ArcMap),
or a limitation (heck - I don't even know if uDig can edit vanilla PostGIS layers!)
</p>
        <p>
I also wanted to try a direct connection - I stopped the ArcSDE service. Worked just
fine - note the "service" name. 
</p>
        <p>
          <img height="364" alt="image" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISRound2ReadingTheManual_7DF0/image_050f799d-b72e-4c37-9fa4-679ff3b26f09.png" width="395" border="0" />
        </p>
        <h2>Summary
</h2>
        <p>
I've got a few other things I want to mess with, but I've got the basics working.
It's been a few miss-steps but not too bad once I read the documentation. Although
I've been using ArcSDE on SQL Server for a long time, it's definitely worth reading
the docs when setting this up. Clearly I'd need to do more digging on optimizing the
database structure, permissions and other sundry tuning things, but if you are looking
to trade some time learning PostgreSQL for the $$$ involved buying Oracle or SQL Server,
it's pretty compelling. I can't say much about performance as this is just one small
layer (US Counties) running on my notebook. I do know people who are running some
big databases on PostgreSQL + PostGIS (like millions of spatial features in a layer)
and they've got it blazing. 
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=181ed031-eff4-4427-9cd4-c416328c0024" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Prepping for Where 2.0...</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/09/PreppingForWhere20.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,3e7a3af9-c3b0-4922-a9f4-ff551ba56212.aspx</id>
    <published>2008-05-08T21:36:07.5882500-07:00</published>
    <updated>2008-05-08T21:36:07.5882500-07:00</updated>
    <category term="ArcSDE" label="ArcSDE" scheme="http://blog.davebouwman.net/CategoryView,category,ArcSDE.aspx" />
    <category term="PostGIS" label="PostGIS" scheme="http://blog.davebouwman.net/CategoryView,category,PostGIS.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
So my company is sending me out to <a href="http://en.oreilly.com/where2008/public/content/home">Where
2.0</a> - I've never been and expect it will be quite different from many of the other
GIS conferences I've been to - more MacBooks and soul patches I'm guessing.
</p>
        <p>
I'm particularly excited about the pre-conference workshops, as it will be a chance
to get the low down on some technologies I have not worked with in the past. 
I'm hitting the <a href="http://en.oreilly.com/where2008/public/schedule/detail/1673">Geo-ify
your Web Site</a> session in the morning (Mapstraction) and the <a href="http://en.oreilly.com/where2008/public/schedule/detail/1724" name="session1724">The
Open Geo-Stack: OpenLayers, GeoServer, PostGIS</a> session in the afternoon. 
</p>
        <p>
In prep for the workshops I thought I'd get PostGIS (with ArcSDE 9.3 beta) installed
on my notebook - ideally I'd like to roll into the session with a little background
so I can ask relevant questions! 
</p>
        <h2>Installing Postgresql + PostGIS + ArcSDE 9.3 (beta)
</h2>
        <p>
Overall, not exactly the smoothest installation I've ever done. No step was particularly
difficult, there were just points where I had to do some head scratching, Googling
and then "just do it". I have to give ESRI credit as the ArcSDE installer
was smooth as silk, and they included Postgresql 8.2 on their media. However, having
not used PostGIS before, exactly how this fits into the mix was a little unclear.
I will say that if you have used ArcSDE in the past, and just want to get rolling
without paying for a database - the install is really pretty easy. 
</p>
        <p>
As noted, I installed PostgreSql 8.2 directly from the 9.3 beta media - this is super
simple. I then downloaded the <a href="http://www.postgis.org/download/windows/pg81/postgis-pg81-setup-1.3.3-1.exe">PostGIS
Installer for PostgreSql 8.2</a>. Again this was pretty easy, after you locate and
download it. As per the ArcSDE instructions, I then ran the ESRI post installer, authorized
ArcSDE and all looked good.
</p>
        <p>
I could immediately connect to the sde database as the sde user, and used ArcCatalog
to load a shapefile into PostGIS. Smooth. 
</p>
        <p>
But how do I know that this is actually using "PostGIS"? Would this data
be accessible to non-ESRI clients?
</p>
        <p>
Enter <a href="http://udig.refractions.net/">uDig</a>. This was a quick and painless
install, and uDig was installed. 
</p>
        <p>
When I browsed to my local PostGIS server, things were not looking good.
</p>
        <p>
          <a href="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISArcSDEInstall_12E74/image_4.png">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="510" alt="image" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISArcSDEInstall_12E74/image_thumb_1.png" width="529" border="0" />
          </a>
        </p>
        <p>
Where was my data? Clearly something is not lining up here. When I tried to connect
to ArcSDE via uDig (after I located the jar files) it could not connect. Not sure
if this is related to using the beta 9.3 jar files, or something else.
</p>
        <p>
Anyhow, I decided I should try loading the same data via the command line post gis
tools. Here I ran into a bit of a wall. The documentation for the PostGIS tools is
not bad, but certainly aimed at the unix sys admin type of person. The basic process
is to convert your shapefile into a Sql file, and then run that in Postgresql. Seems
simple. A quick little batch file ought to work this right out. The sql file was created
just fine, but it failed to load.
</p>
        <p>
Sorting this out really meant it was time to do a little learning about Postgresql.
After sorting out schemas, and learning that the most likely encoding of my shapefile
was "LATIN1" I was able to load my data and "see" it in uDig.
</p>
        <p>
          <a href="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISArcSDEInstall_12E74/image_6.png">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="510" alt="image" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/PostGISArcSDEInstall_12E74/image_thumb_2.png" width="529" border="0" />
          </a>
        </p>
        <p>
Actual loading the layer into uDig never completed. The application just sort of hung
stating that the "Project command" was executing. This was just a map of
all the counties in the US, so not sure what the issue was, but I'm pretty sure it
was my fault.
</p>
        <p>
I then tried to connect via ArcCatalog to see if I could "see" this layer...
and not too surprisingly I could not.
</p>
        <h2>Summary
</h2>
        <p>
Thus far I've simply come to realize that I have a lot to learn. I need to grok a
lot more about Postgresql and PostGIS to start, and then add ArcSDE into the mix.
I'm sure that if I read more of the ESRI documentation I'll find some answers, but
at this point it's unclear to me if they will be supporting direct access to PostGIS
data, or if they will be supporting the PostGIS spatial format for data stored in
traditional ArcSDE schemas (i.e. with all the GDB_ and SDE_ tables). I also learned
that I've been sheltered from the reality of "data" for many years!
</p>
        <p>
I'll continue this series as I make progress getting things sorted out.
</p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=3e7a3af9-c3b0-4922-a9f4-ff551ba56212" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Get the Skinny on &amp;quot;Model View Controller&amp;quot;</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/07/GetTheSkinnyOnQuotModelViewControllerquot.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,60d31447-1ecc-4ec4-b2ae-c41c3f4e8abc.aspx</id>
    <published>2008-05-07T06:36:28.0166630-07:00</published>
    <updated>2008-05-07T06:36:28.0166630-07:00</updated>
    <category term="Fundamentals" label="Fundamentals" scheme="http://blog.davebouwman.net/CategoryView,category,Fundamentals.aspx" />
    <category term="Unit Testing" label="Unit Testing" scheme="http://blog.davebouwman.net/CategoryView,category,Unit%2BTesting.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
...from Jeff Atwood author of the (wildly popular) <a href="http://www.codinghorror.com/blog/">Coding
Horror blog</a>. Hopefully you all subscribe to his blog, but for those who may not,
it's full of goodness, and you should check it out on a regular basis. 
</p>
        <p>
As for MVC - the results of the Geospatial Developer Survey show only about 50% of
respondents are using patterns, and about 46% were not using any sort of Model View
* patterns. This article is a great entry point to a pattern that can be applied to
a very wide range of scenarios (including easing the creation of unit tests!)
</p>
        <p>
          <a href="http://www.codinghorror.com/blog/archives/001112.html">Check it out at CodingHorror.com</a>
        </p>
        <img width="0" height="0" src="http://blog.davebouwman.net/aggbug.ashx?id=60d31447-1ecc-4ec4-b2ae-c41c3f4e8abc" />
        <br />
        <hr />
        <hr />
davebouwman.net weblog - copyright 2005-2008 - licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/"> Creative
Commons License. </a></div>
    </content>
  </entry>
  <entry>
    <title>Geospatial Developer Survey: Five Days Left!</title>
    <link rel="alternate" type="text/html" href="http://blog.davebouwman.net/2008/05/05/GeospatialDeveloperSurveyFiveDaysLeft.aspx" />
    <id>http://blog.davebouwman.net/PermaLink,guid,3bab4653-d903-4d28-93d8-8259d60ab1bf.aspx</id>
    <published>2008-05-05T09:11:49.0440000-07:00</published>
    <updated>2008-05-05T09:11:49.0440000-07:00</updated>
    <category term="Software" label="Software" scheme="http://blog.davebouwman.net/CategoryView,category,Software.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just a quick reminder that the <a href="http://www.surveymonkey.com/s.aspx?sm=cugzupf5rAG_2bIu5WJ_2f7rxQ_3d_3d">Geospatial
Developer Survey</a> will be closing this Friday, May 9th. 
</p>
        <p>
We're at 262 respondents who are describing themselves like this:
</p>
        <p>
 
</p>
        <p>
          <img height="306" alt="who-are-you" src="http://blog.davebouwman.net/content/binary/WindowsLiveWriter/GeospatialDeveloperSurveyFiveDaysLeft_8F62/who-are-you_21265b9e-ac3a-4bf4-ad9a-671b9ad399d4.png" width="431" border="0" />
        </p>
        <p>
 
</p>
        <p>
 
</p>
        <h3>Hey this is all .NET Stuff!
</h3>
        <p>
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 -<strong> "Other"</strong>. 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 <strong>Other</strong> and
write it in (15 of you already have). I'll add these into the mix when crunching the
numbers.
</p>
        <p>
 
</p>
        <p>
When will we see the results?
</p>
        <p>
Survey Monkey does a great job of crunching out some simple results, and I expect
to post a few inte