<?xml version="1.0" encoding="iso-8859-1"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en"> 
<title>menome</title> 
<link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?blogId=1" /> 
 
<modified>2010-07-13T13:18:35-0700</modified> 
<tagline>Exploration of ideas and memes relating to ever changing world of software development with a focus on the reproduction and replication of information</tagline> 
<generator url="http://www.plogworld.net/" version="1.0.1">pLog</generator> 
 
<copyright>Copyright (c) mimo</copyright> 
  
 <entry> 
 <id>tag:post:www.menome.com,2010-07-13:227</id>
 <title>Silverlight Managed Extensability Framework, Prism and MVVM Light</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=227&amp;blogId=1" /> 
  
 <modified>2010-07-13T13:18:35-0700</modified> 
 <issued>2010-07-13T13:18:35-0700</issued> 
 <created>2010-07-13T13:18:35-0700</created> 
 <summary type="text/plain"> On further research, we found that the  Prism framework  is not quite ready for version 4 silverlight. The Prism team are currently revamping Prism to use  MEF (Managed Extendability Framework) ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
Silverlight 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;On further research, we found that the &lt;a href=&quot;http://compositewpf.codeplex.com/releases&quot;&gt;Prism framework&lt;/a&gt; is not quite ready for version 4 silverlight. The Prism team are currently revamping Prism to use &lt;a href=&quot;http://mef.codeplex.com/&quot;&gt;MEF (Managed Extendability Framework)&lt;/a&gt; and while they have begun producing code drops (they are on Drop 3), these are still in alpha, so we can&#039;t use them yet.&lt;/p&gt;&lt;p&gt;So to bridge the gap while the Patterns team works towards full release, we decided to use the &lt;a href=&quot;http://www.galasoft.ch/mvvm/getstarted/&quot;&gt;MVVM Light framework&lt;/a&gt; from Laurent Bugnion of Galasoft. It provides a simplified version of Prism&#039;s feature set, and has proven to be a great framework to work with.&lt;/p&gt;&lt;p&gt;MVVM light provides:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Commanding - RelayCommand object that can be used with Sivleright 4 button commands, and has an extension that bridges other controls that don&#039;t yet have commanding&lt;/li&gt;&lt;li&gt;Messaging - A great messenger framework for decoupling viewmodels from each other by sending messages instead of binding&lt;/li&gt;&lt;li&gt;Blend support - MVVM light has been built with Blend support in mind, and works very well with Blend. This gets around another deficiency in the current Prism implementation, which doesn&#039;t play well with Blend.&lt;/li&gt;&lt;li&gt;ViewModelBase - base class for viewmodels &lt;/li&gt;&lt;li&gt;Templates - for Blend and Visual studio. It also include some code snippets to help with code writing.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I would recommend using MVVM light if you are looking for a good, simple  way of making MVVM easier and more clear to work with. It works extremely well with MEF - we have now refactored a complex Silverlight application to use MVVM light and MEF in less than a week. &lt;/p&gt;&lt;p&gt;Sean Wildermuth has a great 4 part &lt;a href=&quot;http://wildermuth.com/2009/12/27/Architecting_SL4_Applications_with_RIA_Services_MEF_and_MVVM_-_Part_3&quot;&gt;example&lt;/a&gt; series on using MVVM light with MEF to build an MVVM based Silverlight application. The source included with the examples also has a fantastic error handling, status message and centralized IsBusy indicator setup that leverages the MVVM messaging framework.&lt;/p&gt;&lt;br/&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2010-07-2:226</id>
 <title>Silverlight Managed Extensability Framework and Prism</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=226&amp;blogId=1" /> 
  
 <modified>2010-07-02T11:34:58-0700</modified> 
 <issued>2010-07-02T11:34:58-0700</issued> 
 <created>2010-07-02T11:34:58-0700</created> 
 <summary type="text/plain"> We have been doing extensive development using Silverlight, and have run into some barriers with the design of the application we are working on. Some of the issues we were able to mitigate with ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
C# .net development 
Silverlight 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;We have been doing extensive development using Silverlight, and have run into some barriers with the design of the application we are working on. Some of the issues we were able to mitigate with MVVM pattern. However, as the app has become more complex, dependencies have crept in between the viewmodels and the parent application.We are also running into trouble managing commands and events associated with the application - how do you have several components subscribe to the same event set without having to connect viewmodels together? &lt;/p&gt;&lt;p&gt;The application&#039;s Xap file has also grown to be fairly large, and it will be necessary to split the application up into separate chunks that are loaded only when required. Our current structure will not allow this. &lt;/p&gt;&lt;p&gt;Upon doing research into how to address these issues, I discovered the &lt;a href=&quot;http://compositewpf.codeplex.com/&quot;&gt;Prism&lt;/a&gt; framework from the Microsoft Patterns and Practices group. This appeared to be a great way to address a number of the issues. &lt;/p&gt;&lt;p&gt;Prism is a framework for composing applications from separate modules. It contains an approach for injecting components into others using the Unity framework (also a patterns and practices framework) to eliminate dependencies. It also has a very nice looking commanding approach implemented through an event aggregator publish/subscribe mechanism. &lt;/p&gt;&lt;p&gt;However, during reading through commentary on Prism, I also found the &lt;a href=&quot;http://mef.codeplex.com/&quot;&gt;Managed Extendability Framework&lt;/a&gt;, from a different part of Microsoft which looked initially like it was a competing approach to solve similar issues.&lt;/p&gt;&lt;p&gt;Microsoft often does things like this (take the whole Linq/ Linq-SQL/Ado.net entity framework/Windows Communication foundation maze as an example...) in which they come out with several almost the same but not completely technology bits that overlap. Inevitably one of the approaches will be adopted at the expense of the other, which forces developers who adopted the wrong one to refactor to the winner.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;This meant more research into the details of the frameworks. There has been a large amount of &lt;a href=&quot;http://stackoverflow.com/questions/1595409/mef-vs-prism-what-is-the-difference-what-will-be-supported-in-the-future&quot;&gt;discussion&lt;/a&gt; about the two frameworks and what roles they play. It looks like that while there is overlap, they do address slightly different issues. &lt;/p&gt;&lt;p&gt;MEF appears to be the &#039;lower level&#039; framework and allows each component to &#039;import&#039; things they need. Each component is
marked with &#039;export&#039; to mark things they provide- mef goes through the
apps and matches them up. In this way, you can create components that
are loosely coupled that assemble themselves at run time.&lt;/p&gt;&lt;p&gt;So it is essentially the &#039;glue&#039; (or duct tape in Canadian terms) that ties components together instead of using tightly coupled approach.&lt;/p&gt;&lt;p&gt;Prism has a similar concept for eliminating component coupling, but instead uses Unity (a Patterns and Practices dependency injection framework I think) for this purpose.&lt;/p&gt;&lt;p&gt;It then goes on to add guidance and tools for building modules, commands, and binding modules and commands to make an overall application. So Prism is more focused on the user interface concern side of the equation, where MEF operates at the component level. &lt;/p&gt;&lt;p&gt;In fact, MEF was included
in .net 4.0 and sivlerlight 4.0, which means that its approach &#039;won
out&#039; in terms of what it does over the the Unity approach used in Prism. It looks like for Prism release 4, the Prism team are refactoring the framework to use MEF.  &lt;/p&gt;&lt;p /&gt;&lt;p&gt;So - it looks like what we can do is use MEF to glue the components together, then use Prism to handle the user interface composition aspect via the modules and &lt;a href=&quot;http://denisvuyka.wordpress.com/2009/02/21/using-eventaggregator-with-mef/&quot;&gt;event aggregator&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Its a bit frustrating having to figure out two separate (for now) frameworks to accomplish our goals, and it would be nice if the different bits of Microsoft communicated better on these sorts of things, but at least I found out about the path of this before committing to fully using one approach. &lt;/p&gt;&lt;p&gt;Here are some additional resources:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://channel9.msdn.com/posts/mtaulty/MEF--Silverlight-4-Beta-Part-1-Introduction/&quot;&gt;Mef movie series on channel 9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://compositewpf.codeplex.com/wikipage?title=Learn%20Prism&amp;amp;referringTitle=Home&quot;&gt;Prism movie series on channel 9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://blogs.msdn.com/b/gblock/archive/2009/12/02/mef-and-prism-to-be-or-not-to-be.aspx&quot;&gt;Prism vs mef&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://codebetter.com/blogs/glenn.block/archive/2009/02/23/event-aggregation-with-mef-with-and-without-eventaggregator.aspx&quot;&gt;Prism Event aggregation with MEF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://denisvuyka.wordpress.com/2009/02/21/using-eventaggregator-with-mef/&quot;&gt;Event aggregation Prism and MEF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://blogs.msdn.com/b/dphill/archive/2009/12/09/prism-and-mef.aspx&quot;&gt;Prism 4 and MEF&lt;/a&gt;&lt;/li&gt;&lt;li /&gt;&lt;/ul&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2010-03-26:225</id>
 <title>Interview by Craig Bator Project Manager Quest For Canadas Smartest IT</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=225&amp;blogId=1" /> 
  
 <modified>2010-03-26T13:42:32-0700</modified> 
 <issued>2010-03-26T13:42:32-0700</issued> 
 <created>2010-03-26T13:42:32-0700</created> 
 <summary type="text/plain"> We were interviewed by Craig Bator PM of the Quest for Canada&#039;s Smartest IT.  We talk about the philosophy we use at Matrix for building an agile IT and software development team that works ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
About Me 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;We were interviewed by Craig Bator PM of the Quest for Canada&#039;s Smartest IT.&lt;/p&gt;&lt;p&gt;We talk about the philosophy we use at Matrix for building an agile IT and software development team that works directly with leadership to meet the ever changing needs of the business.&lt;/p&gt;&lt;p&gt;See it here: &lt;a href=&quot;http://smartest-it.ca/craigs_chronicles.aspx&quot;&gt;http://smartest-it.ca/craigs_chronicles.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p /&gt;&lt;br/&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2010-02-1:224</id>
 <title>WCF Debugging 404 error</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=224&amp;blogId=1" /> 
  
 <modified>2010-02-01T17:33:46-0700</modified> 
 <issued>2010-02-01T17:33:46-0700</issued> 
 <created>2010-02-01T17:33:46-0700</created> 
 <summary type="text/plain"> WCF is a great technology, but it is difficult to configure, and often the error messages are cryptic - if in fact you can get it to return exceptions at all. 
 Fiddler is a great way to debug ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
C# .net development 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;WCF is a great technology, but it is difficult to configure, and often the error messages are cryptic - if in fact you can get it to return exceptions at all.&lt;/p&gt;
&lt;p&gt;Fiddler is a great way to debug WCF based services, but even that sometimes doesn&#039;t work if you are using the visual studio/cassini based web host. &lt;/p&gt;
&lt;p&gt;Fortunately, adding the following code into your web.config file will put any exception information into a log file:&lt;/p&gt;
&lt;p /&gt;
&lt;div style=&quot;white none repeat scroll 0% 0%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;&quot;&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;system.diagnostics&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;sources&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;System.ServiceModel&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;              &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;switchValue&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;Information, ActivityTracing&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;              &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;propagateActivity&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;true&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;listeners&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;          &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;traceListener&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;              &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;System.Diagnostics.XmlWriterTraceListener&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;              &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;initializeData&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;= &lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;c:tempwcfErrors.svclog&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt; /&amp;gt;  &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;listeners&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;      &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;sources&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;blue;&quot;&gt;  &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;system.diagnostics&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;br/&gt;WCF 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2010-01-31:223</id>
 <title>Clustering points for Silverlight Bing maps control</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=223&amp;blogId=1" /> 
  
 <modified>2010-01-31T19:39:10-0700</modified> 
 <issued>2010-01-31T19:39:10-0700</issued> 
 <created>2010-01-31T19:39:10-0700</created> 
 <summary type="text/plain"> We are now finally underway building the first version of what will become the Menome system.  One of the things we needed was a way of clustering points on a map. The idea is to reduce the ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
C# .net development 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;We are now finally underway building the first version of what will become the Menome system.&lt;/p&gt;&lt;p&gt;One of the things we needed was a way of clustering points on a map. The idea is to reduce the number of points as the user zooms out by combining points together to keep performance up and to reduce map clutter. &lt;/p&gt;&lt;p&gt;The algorithm operates by creating a &#039;screen grid&#039; and passing this to the server. As the user zooms and moves around the map, the boundary window they are looking at in lat/long, the height and width of the current window in pixels and the zoom level are passed to the server. &lt;/p&gt;&lt;p&gt;The first level of filtering happens on the SQL server by doing an intersection of the boundary window with the point geography stored in the SQL server.&lt;/p&gt;&lt;p&gt;Points inside the boundary are returned to the web server, where above a given zoom threshold (10 for now), they are passed through the clustering class. The clustering class works by creating a grid out of the current window. Two nested loops are created, which loop through the grid cells. Each points coordinates converted from lat/long to pixel, and checked against the current grid cell. Points found in the same grid cell are grouped together into a single point, and stored into the grid cell list indexed by the X and Y cell index multiplied together. &lt;/p&gt;&lt;p&gt;Fortunately, &lt;span class=&quot;sn_ccIDWrap&quot;&gt;&lt;span id=&quot;ICc0&quot; class=&quot;cxp_ic_i&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;cxp_ic_name&quot; target=&quot;_top&quot; href=&quot;http://cid-42e1f70205ec8a96.profile.live.com/&quot; title=&quot;Johannes Kebeck&quot; onclick=&quot;i = new Image(); i.src = &#039;http://g.live.com/_9uxp9en-us/ic_dn??su=http://shared.live.com/Live.Spaces&#039;;&quot;&gt;&lt;span dir=&quot;ltr&quot;&gt;Johannes Kebeck&lt;/span&gt;&lt;/a&gt; has posted an algorithm for doing this on his &lt;a href=&quot;http://johanneskebeck.spaces.live.com/blog/cns!42E1F70205EC8A96!10821.entry&quot;&gt;fantastic blog &lt;/a&gt;The algorithm he presents is setup to return javascript, and is written in VB, so we changed it slightly to return a SiteLocationPoint object and to operate in C#, since that is the language we are using for the application we are building.  &lt;/p&gt;&lt;p&gt;We have turned this into a class, which takes a list of points, and returns a list of clustered points. The main change we had to make to the algorithm itself was modifying the it to use a Dictionary to store the clustered points in the gridCells object instead of a jagged array, which cannot be declared dynamically in C#. &lt;/p&gt;&lt;p&gt;We used a dictionary with the X*Y grid cell as a key for storing/extracting points in a given grid cell. The other modification we need to make, which I will post once we figure it out, is a way of changing the clustering density. &lt;/p&gt;&lt;p&gt;Click more to get the source code. &lt;/p&gt;&lt;p /&gt;&lt;p /&gt;&lt;br/&gt;&lt;div style=&quot;font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;&quot;&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0px;&quot; /&gt;&lt;p style=&quot;margin:0px;&quot; /&gt;&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;using&lt;/span&gt; System;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;using&lt;/span&gt; System.Linq;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;using&lt;/span&gt; System.Web;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;using&lt;/span&gt; System.Collections;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;namespace&lt;/span&gt; Matrix.Web.SiteManager&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;{&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;ClusterSitePoints&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;    {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GridSize = 40;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;//Constants for the Clustering&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;//(addressable area in Bing Maps)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; MinLatitude  = -85.05112878D;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; MaxLatitude  = 85.05112878D;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; MinLongitude  = -180D;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; MaxLongitude = 180D;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; ClusterSitePoints(&lt;span&gt;double&lt;/span&gt; north, &lt;span&gt;double&lt;/span&gt; west, &lt;span&gt;double&lt;/span&gt; south, &lt;span&gt;double&lt;/span&gt; east, &lt;span&gt;long&lt;/span&gt; mapWidth, &lt;span&gt;long&lt;/span&gt; mapHeight, &lt;span&gt;long&lt;/span&gt; mapZoomLevel, &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt; pointsToCluster)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.east = east;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.west = west;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.north = north;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.south = south;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.mapHeight = mapHeight;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.mapWidth = mapWidth;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.mapZoomLevel = mapZoomLevel;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;this&lt;/span&gt;.pointsToCluster = pointsToCluster;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt; ClusterPoints()&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt; clusteredPoints = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; numberOfCellsX = &lt;span&gt;Convert&lt;/span&gt;.ToInt64(&lt;span&gt;Math&lt;/span&gt;.Ceiling(&lt;span&gt;Convert&lt;/span&gt;.ToDouble(&lt;span&gt;this&lt;/span&gt;.MapWidth) / GridSize));&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; numberOfCellsY = &lt;span&gt;Convert&lt;/span&gt;.ToInt64(&lt;span&gt;Math&lt;/span&gt;.Ceiling(&lt;span&gt;Convert&lt;/span&gt;.ToDouble(&lt;span&gt;this&lt;/span&gt;.MapHeight) / GridSize));&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; numberOfCells = numberOfCellsX * numberOfCellsY -1;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;//MatrixSiteLocationPoint[numberOfCells][] gridCells = new MatrixSiteLocationPoint[][] { };&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;//ArrayList gridCells = new ArrayList();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt; gridCells = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;//Array MatrixSiteLocationPoint = Array.CreateInstance(typeof(MatrixSiteLocationPoint),&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; ulTotalX = 0;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; ulTotalY = 0;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            LatLongToPixel(&lt;span&gt;this&lt;/span&gt;.North, &lt;span&gt;this&lt;/span&gt;.West, &lt;span&gt;this&lt;/span&gt;.MapZoomLevel, &lt;span&gt;ref&lt;/span&gt; ulTotalX, &lt;span&gt;ref&lt;/span&gt; ulTotalY);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; poiTotalX = 0;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; poiTotalY = 0;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; poiMapX = 0;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;long&lt;/span&gt; poiMapY = 0;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;foreach&lt;/span&gt; (&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt; point &lt;span&gt;in&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.PointsToCluster)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                LatLongToPixel(&lt;span&gt;Convert&lt;/span&gt;.ToDouble(point.Latitude), &lt;span&gt;Convert&lt;/span&gt;.ToDouble(point.Longitude), &lt;span&gt;this&lt;/span&gt;.MapZoomLevel, &lt;span&gt;ref&lt;/span&gt; poiTotalX, &lt;span&gt;ref&lt;/span&gt; poiTotalY);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                poiMapX = poiTotalX - ulTotalX;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                poiMapY = poiTotalY - ulTotalY;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;// populate array with clustered points&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; x = 0; x &amp;lt; numberOfCellsX - 1 ; x++)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                    &lt;span&gt;if&lt;/span&gt;(( x * GridSize &amp;lt;= poiMapX) &amp;amp;&amp;amp; (poiMapX &amp;lt; (x + 1) * GridSize))&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                    {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                        &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; y = 0; y &amp;lt; numberOfCellsY - 1 ; y++)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                            &lt;span&gt;if&lt;/span&gt; ((y * GridSize &amp;lt;= poiMapY) &amp;amp;&amp;amp; (poiMapY &amp;lt; (y + 1) * GridSize))&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                &lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt; clusterPoint = &lt;span&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                &lt;span&gt;if&lt;/span&gt; (gridCells.ContainsKey(x * y))&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint = gridCells[x * y];&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.NumberOfPointsInCluster += 1;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.Location = clusterPoint.Location + &lt;span&gt;&amp;quot; : &amp;quot;&lt;/span&gt; + point.Location;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.LocationDescription = &lt;span&gt;&amp;quot;Site Point Cluster&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    &lt;span&gt;if&lt;/span&gt; (point.MatrixSiteKey.MatrixSiteCountOfProjects != &lt;span&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                        &lt;span&gt;//clusterPoint.MatrixSiteKey.MatrixSiteCountOfProjects.NumberOfProjectsInSite += point.MatrixSiteKey.MatrixSiteCountOfProjects.NumberOfProjectsInSite;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                        clusterPoint.NumberOfProjectsInCluster += point.MatrixSiteKey.MatrixSiteCountOfProjects.NumberOfProjectsInSite;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                &lt;span&gt;else&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint = point;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.NumberOfPointsInCluster = 1;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    &lt;span&gt;if&lt;/span&gt; (point.MatrixSiteKey.MatrixSiteCountOfProjects != &lt;span&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                        &lt;span&gt;//clusterPoint.MatrixSiteKey.MatrixSiteCountOfProjects.NumberOfProjectsInSite += point.MatrixSiteKey.MatrixSiteCountOfProjects.NumberOfProjectsInSite;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                        clusterPoint.NumberOfProjectsInCluster += point.MatrixSiteKey.MatrixSiteCountOfProjects.NumberOfProjectsInSite;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.IsClustered = &lt;span&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.Location = clusterPoint.Location + &lt;span&gt;&amp;quot; : &amp;quot;&lt;/span&gt; + point.Location;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                    clusterPoint.LocationDescription = &lt;span&gt;&amp;quot;Site Point Cluster&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                                gridCells[x * y] = clusterPoint;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                    }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;// extract point clusters&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;foreach&lt;/span&gt; (&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt; point &lt;span&gt;in&lt;/span&gt; gridCells.Values)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                clusteredPoints.Add(point);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;return&lt;/span&gt; clusteredPoints;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; LatLongToPixel(&lt;span&gt;double&lt;/span&gt; latitude, &lt;span&gt;double&lt;/span&gt; longitude, &lt;span&gt;long&lt;/span&gt; lvl, &lt;span&gt;ref&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; pixelx, &lt;span&gt;ref&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; pixely)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            latitude = Clip(latitude, MinLatitude, MaxLatitude);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            longitude = Clip(longitude, MinLongitude, MaxLongitude);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;double&lt;/span&gt; x  = (longitude + 180) / 360;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;double&lt;/span&gt; sinLatitude  = &lt;span&gt;Math&lt;/span&gt;.Sin(latitude * &lt;span&gt;Math&lt;/span&gt;.PI / 180);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;double&lt;/span&gt; y = 0.5 - &lt;span&gt;Math&lt;/span&gt;.Log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * &lt;span&gt;Math&lt;/span&gt;.PI);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;UInt32&lt;/span&gt; mapSize = Offset(&lt;span&gt;Convert&lt;/span&gt;.ToInt32(lvl));&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            pixelx = &lt;span&gt;Convert&lt;/span&gt;.ToInt64(Clip(x * mapSize + 0.5, 0, mapSize - 1));&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            pixely = &lt;span&gt;Convert&lt;/span&gt;.ToInt64(Clip(y * mapSize + 0.5, 0, mapSize - 1));&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; Clip(&lt;span&gt;double&lt;/span&gt; n, &lt;span&gt;double&lt;/span&gt; minValue, &lt;span&gt;double&lt;/span&gt; maxValue)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;Math&lt;/span&gt;.Min(&lt;span&gt;Math&lt;/span&gt;.Max(n, minValue), maxValue);&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;UInt32&lt;/span&gt; Offset(&lt;span&gt;int&lt;/span&gt; level)&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;UInt32&lt;/span&gt; bit = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;UInt32&lt;/span&gt;();&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            bit = 256;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;return&lt;/span&gt; bit &amp;lt;&amp;lt; level;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) North&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; north;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets/Sets Northern coordinate of map window&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; North&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; north;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                north = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) South&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; south;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets/sets Southern coordinate of map window&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; South&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; south;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                south = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) East&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; east;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets/Set eastern coordinate of map window&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; East&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; east;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                east = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) West&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; west;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets/Sets Western coordinate of map window&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;double&lt;/span&gt; West&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; west;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                west = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) MapWidth&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; mapWidth;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets width of map&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; MapWidth&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; mapWidth;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                mapWidth = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) MapHeight&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; mapHeight;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets/Sets height of map&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; MapHeight&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; mapHeight;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                mapHeight = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) MapZoomLevel&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; mapZoomLevel;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets/Sets zoom level of map&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; MapZoomLevel&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; mapZoomLevel;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                mapZoomLevel = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #region&lt;/span&gt; (Property) PointsToCluster&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt; pointsToCluster;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; List of points to cluster&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;MatrixSiteLocationPoint&lt;/span&gt;&amp;gt; PointsToCluster&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;get&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                &lt;span&gt;return&lt;/span&gt; pointsToCluster;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            &lt;span&gt;set&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            {&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;                pointsToCluster = &lt;span&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;            }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;        }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span&gt;        #endregion&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;    }&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;}&lt;/p&gt;
&lt;/div&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2009-08-23:221</id>
 <title>GIS Technology Stacks</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=221&amp;blogId=1" /> 
  
 <modified>2009-08-23T17:29:40-0700</modified> 
 <issued>2009-08-23T17:29:40-0700</issued> 
 <created>2009-08-23T17:29:40-0700</created> 
 <summary type="text/plain">In order to produce a single view of GIS data derived from multiple sources, it is necessary to abstract the rendering of the data from the actual datasources. This is similar to the concept of a ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
Systems Architechure 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 In order to produce a single view of GIS data derived from multiple sources, it is necessary to abstract the rendering of the data from the actual datasources. This is similar to the concept of a Services Oriented Architecture in which business data are rendered from their system domain to a domain specific language that suits the needs of the enterprise.&lt;br /&gt;
&lt;br /&gt;The term that is given to the systems required to perform the rendering function are called ?stacks? in the GIS world.&lt;br /&gt;
The Stack typically is composed of: Spatial Database, Internet Mapping Server (map services), Mapping Client, and Web Mapping Client.&lt;br /&gt;
There are a few different technology streams available for provisioning stacks. I have been doing research into the different stacks available for service enabling GIS data.&lt;br/&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
Database:&lt;br /&gt;&lt;br /&gt;Used for storing, indexing and querying spatial data. The most common of these is the ShapeFile or File Geodatabase. This is simply a set of specially configured files that combined together make a -database-. In the world of -real- databases, there are several common options&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.oracle.com/technology/products/spatial/index.html&quot; target=&quot;_blank&quot;&gt;Oracle Spatial&lt;/a&gt; - supposed to be the best in terms of accuracy and speed. It is expensive, and requires specially trained resources to keep it running&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://postgis.refractions.net/&quot;&gt;PostGres/PostGIS&lt;/a&gt; - best open source spatial database. It is fast, reliable and widely supported. There are good toolsets for it on most platforms&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx&quot;&gt;Sql Server Spatial&lt;/a&gt; - New spatial database on the block already has decent driver support, work is still required on optimization. The Geometry (planar) data type has support now on Mapserver and Geoserver, but not the Geography datatype. ESRI requires the use of the ESRI server for full connectivity.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.esri.com/software/arcgis/arcgisserver/index.html&quot;&gt;ESRI SDE - ESRI&lt;/a&gt; spatial extension for Oracle and SQL server - expensive, accurate, requires ESRI specific expertise. This product was moved into the ESRI Server offering as of version 9.3 &lt;br /&gt;&lt;br /&gt;Currently at Matrix (where I work) we are using:&lt;br /&gt;- SQL server for base and field data&lt;br /&gt;- SHP (ESRI Shape files) for project data used for spatial analysis and other core GIS functions&lt;br /&gt;- PostGres/PostGIS for hydrogeology data, and possibly base data.&lt;br /&gt;&lt;br /&gt;Internet Mapping Server (IMS):&lt;br /&gt;Internet Mapping Servers provides mapping services. These appear to be the key piece that we are missing to make this whole thing work on an enterprise scale.&lt;br /&gt;&lt;br /&gt;IMS typically are subdivided into WMS (Web Mapping) and WFS (Web Feature Mapping) servers (Article HERE describing the differences) . The Web Mapping Services are typically image based tiles that are rendered by the server through a map template from the datasources defined for that template, and output to image tiles. This is the most commonly used approach, and is what Google Maps, Virtual Earth etc are doing in the backend on a massive scale. The issue here is that while tiles are the fastest way of returning properly formatted spatial data, the objects (or Features in GIS speak) represented on the images cannot be directly manipulated. Additional query to database directly type techniques can be used to get around this if necessary. A better approach though is to use Tiled Map Services for base data or displaying dense datasets that do not change often, and use Features (vector/object data) for dynamic datasets or in places where the object density is reduced (higher zoom levels)&lt;br /&gt;The Web Feature Service returns actual object or in GIS speak Feature definitions. A typical IMS server will support returning data in both WMS and WFS type services. The WFS data return is typically an XML stream formatted in KML, GML, or GEORSS format. There are probably some proprietary ones as well for ESRI specific data.&lt;br /&gt;&lt;br /&gt;The players out there on this front are:&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.esri.com/software/arcgis/arcgisserver/index.html&quot;&gt;ESRI Server&lt;/a&gt; - full featured, very expensive, but does it all. It also has the ability to do spatial analysis through a web browser.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://mapserver.org/&quot;&gt;Mapserver&lt;/a&gt; - older open source IMS system we have tried it at Matrix. It works well, but has a more &#039;command line&#039; approach to layer provisioning and requires a higher understanding of specific mapping techniques to make it work.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.safe.com/products/server/overview.php&quot;&gt;FME Server&lt;/a&gt; - new this year. It is very useful for doing spatial transforms, analysis and providing data from a variety of sources, but is not an IMS server in production. It has a complicated licensing scheme based on engines that makes it difficult to get sense of what the cost of the system is. However, FME tries to mitigate this by giving users a long evaluation period to asses what they might need.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.manifold.net/info/ims.shtml&quot;&gt;Manifold IMS &lt;/a&gt;- very inexpensive, fast, but I was not crazy about the implementation. It is built around the idea of using the Manifold user interface to generate code for a website. The downside is the code that is generated is an older style postback server approach instead of a more modern Ajax style user interface. It is likely possible to customize this to give a better user experience, but it seems like a lot of work. However, for the cost its an excellent alternative.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://mapguide.osgeo.org/&quot;&gt;MapGuide&lt;/a&gt; - open source and commercial versions available. The open source version is the prior year&#039;s commercial offering. Seems to be good, but has spotty support. Similar to Manifold, it Is built more around a software factory approach, so is quick to get up and running without programming.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://geoserver.org/display/GEOS/Welcome&quot;&gt;GeoServer&lt;/a&gt; - open source, widely supported, has a very nice administration interface, and decent driver support. Supported by a very active community. It also has an associated commercial support style model called OpenGeo, which packages the various open source technologies together into one offering.&lt;br /&gt;It has a wide support base, uses XML for its layer definitions, has a very nice looking administration console, and excellent documentation.&lt;br /&gt;&lt;br /&gt;Geoserver also has several add-ons that look really good as well. One of immediate interest is GeoWebCache, which is a WMS tile caching and optimization server in effect a spatial proxy server.&lt;br /&gt;Another of interest, although very new on the scene is a WFS based versioning module, of which one branch appears to be looking into using SVN as the backing for spatial feature version control (http://geoserver.org/display/GEOS/Versioning+WFS)&lt;br /&gt;&lt;br /&gt;Map Editing Clients:&lt;br /&gt;These are clients that allow GIS experts to create, manage and manipulate the spatial data directly. They can derive spatial data from a variety of sources to produce an overall map.&lt;br /&gt;&lt;br /&gt;Typical clients are:&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://webhelp.esri.com/arcgisdesktop/9.2/index.cfm?id=176&amp;amp;pid=175&amp;amp;topicname=An_overview_of_ArcMap&quot;&gt;ArcMap&lt;/a&gt; - which is what ESRI collectively calls its mapping clients, and it is broken up into three levels in terms of increasing cost/features: ArcView,ArcEditor and ArcInfo&lt;br /&gt;- ArcView - Basic ESRI spatial data editing tool - designed for single user single datasource&lt;br /&gt;- ArcEditor - Encompasses ArcView plus adds multiple user editing&lt;br /&gt;- ArcInfo - All the features of the other Arcs plus spatial analysis&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.manifold.net/index.shtml&quot;&gt;Manifold&lt;/a&gt; - Low cost equivalent to ArcMap. Not as powerful as the ESRI offerings, but does some things better/faster than ArcMap. It is very useful as a general non-GIS client for editing spatial data.&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://www.qgis.org/&quot;&gt;Quantum GIS -&lt;/a&gt; open source GIS editor - pretty good equivalent to the ArcMap in terms of features etc.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://udig.refractions.net/&quot;&gt;Udig&lt;/a&gt; - open source GIS client by refractions research who build and maintain PostGis. This is an excellent well thought out easy to use client, and I would recommend it&lt;br /&gt;&lt;br /&gt;At Matrix, we will likely continue to use the core ESRI ArcMap series for the main GIS team. Manifold will likely be used for people who need to do desktop editing, but are doing so on a more limited basis. Quantum GIS has not been experimented with enough to know if it will be useful at Matrix.&lt;br /&gt;&lt;br /&gt;Web Mapping Clients&lt;br /&gt;&lt;br /&gt;There are a number of web mapping clients available. They are all roughly feature equivalent, and offer slightly different advantages. If the underlying data provisioning is done correctly, supporting more than one client is not a huge outlay of time&lt;br /&gt;&lt;br /&gt;Typical Web Mapping Clients are:&lt;br /&gt;&lt;br /&gt; Google Maps - the most common client. Base data provided by Google must be paid for on a $10,000 per year license for commercial use. Javascript based, relatively easy to work with. The APIs however are designed more towards support consumer mashup style development, and can be confusing to work with for developers used to more enterprise GIS style APIs&lt;br /&gt;&lt;br /&gt;Virtual Earth (now bing maps) - comes in two versions now: javascript and Silverlight. We have successfully used the javascript version to build basic demonstration map tools. However, the Silverlight one offers a lot more promise for corporate mapping applications. It is much faster, supports c# based development and can leverage WCF style services. For Matrix Rapid development, we think this will be the best client to focus on building a framework around. Virtual Earth also provisions base maps at a cost roughly equivalent to the Google Maps cost ~10,000 US per year.&lt;br /&gt;&lt;br /&gt;Open Layers - open source equivalent to Google Earth and Virtual Earth javascript mapping clients. It offers similar functionality, but does not come with a base maps subscription. OpenStreetMaps provides basic street level mapping data, but will not be of much use for Matrix given that most of the work focuses in areas where the OpenStreetMap approach will not work. There are a number of sources Matrix GIS team has studied on this front for base map provisioning 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2009-04-5:220</id>
 <title>Time Machine fails with Error mounting volume</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=220&amp;blogId=1" /> 
  
 <modified>2009-04-05T14:38:23-0700</modified> 
 <issued>2009-04-05T14:38:23-0700</issued> 
 <created>2009-04-05T14:38:23-0700</created> 
 <summary type="text/plain"> I use a Macbook pro for doing all my software development. Since switching over to Mac, I can&#039;t imagine using any other computer to develop with. The combination of the OSX operating system with ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
General 
Development 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;I use a Macbook pro for doing all my software development. Since switching over to Mac, I can&#039;t imagine using any other computer to develop with. The combination of the OSX operating system with the power of the Macbook Pro makes for an unbeatable development platform. &lt;/p&gt;&lt;p&gt;I have also eliminated all windows machines from our house now as well. I have a linux server for my websites, an Imac for our &#039;TV&#039;, which also acts as our primary media server for music, photos and family media, and an old 17&amp;quot; Powerbook G4 that my wife uses. I have the three Mac machines backing up to a 1 terabyte Timecapsule.&lt;/p&gt;&lt;p&gt;The Timecapsule is a great innovation on Apple&#039;s part, and has already saved my life on a few occasions. Not only does it handle all my media etc. but with the new version of VMWare fusion, I am able to have automatic backups of my local development and document files that I use on the Windows side.&lt;/p&gt;&lt;p&gt;Time Capsule was easy to setup, and had run without an issue until a few weeks ago, when I started getting errors during backups on my Macbook Pro.&lt;/p&gt;&lt;p&gt;These were &#039;Backup failed - Error mounting volume&#039;, or &#039;Network error during backup&#039;. After digging around a bit through various log files etc. I found that the likely culprit had nothing to do with the network, but was the fact that my hard drive had bad files and directories on it.&lt;/p&gt;&lt;p&gt;Resolving this issue involved booting up from the OSX CD and running the Disc Utiltiy Repair function on the Macbook Pro hard drive. Since doing this, Timecapsule is up and running again without a problem. &lt;/p&gt;&lt;p&gt;It would be nice if Time Capsule/Time Machine could produce a more informative message, or offer to take some kind of corrective action in the event of a failure like this instead of the misleading cryptic message it had generated. Thus this blog post so hopefully the next person who hits the problem will be able to fix it without having to dig through log files...&lt;/p&gt;&lt;br/&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2009-03-19:219</id>
 <title>Team based development systems - Article 1 - Tools</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=219&amp;blogId=1" /> 
  
 <modified>2009-03-19T09:29:12-0700</modified> 
 <issued>2009-03-19T09:29:12-0700</issued> 
 <created>2009-03-19T09:29:12-0700</created> 
 <summary type="text/plain"> I recently completed an assessment and subsequent construction and deployment of a development management system for our software development team at  Matrix   While Microsoft has brought out ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
C# .net development 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;I recently completed an assessment and subsequent construction and deployment of a development management system for our software development team at &lt;a href=&quot;www.matrix-solutions.com&quot;&gt;Matrix&lt;/a&gt;&lt;/p&gt;&lt;p&gt;While Microsoft has brought out Team system for doing source control, automated build/test, its a fairly expensive product. It has the advantage of being an &#039;install and go&#039; kind of thing, but the cost of it makes it prohibitive for smaller development teams.&lt;/p&gt;&lt;p&gt;There are also lots of great open source tools out there for performing these tasks that work very well. At Matrix where I work, I have assembled a set of tools that are doing a great job of letting us manage a very extensive set of code across a diverse team of people in a quick, easy and efficient manner. This blog post will review the tools we are using for this, and give examples of how to set it up.&lt;/p&gt;&lt;p /&gt;&lt;br/&gt;&lt;p&gt;&lt;b&gt;Source Control:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;At the heart of every development system is a good source control system. I have tried out a number of these including Visual Source Safe, Microsoft Team System, CVS and SVN.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Visual Source Safe:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Microsoft Visual Source Safe is easy to setup, but painful to use and it has a lot of issues. Its ok for small groups of people, but does not scale well. I found it works best for teams under 5 people who work on a small number of projects, or as a personal source control system. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Microsoft Team System:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;We did research Team System - but ruled it out mainly due to its cost, and the fact it is ecosystem tied. The pricing structure, as with anything Microsoft makes, is very complicated, so its hard to get an idea of what it actually costs to set this up. Team System covers a lot more than just source control - its a full development management system from source control through to build/test and software project health tracking.&lt;/p&gt;&lt;p&gt;I think for teams that do strictly Microsoft centric development who are fully immersed in the Microsoft world, and can leverage the value from the Team System Visual Studio clients it would be a very good tool. A full detail product comparison of the visual studio offerings can be downloaded &lt;a href=&quot;http://download.microsoft.com/download/5/f/e/5feb6914-bcdf-432f-81c7-e386812b086a/VisualStudio2008-ProductComparison-v1.08.pdf&quot;&gt;HERE&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;CVS and SVN:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;As anyone in the open source community knows, CVS and SVN are the best systems out there. CVS as I understand it was the original source control system. I have used it - and its the most comprehensive and some say the most powerful source control system out there. However, SVN is the one we ended up going with, as we needed something that was a bit easier to work with, was simple to setup and had a good variety of clients to choose from. &lt;/p&gt;&lt;p&gt;After initially starting with a standard linux based SVN system, which we got working without a hitch, we ended up switching over to a great tool I found called VisualSVN. We were just using Tortise SVN to the linux system, but with more junior developers ran into a few problems with the lack of direct IDE support for SVN in visual Studio. Through doing some research I found &lt;a href=&quot;http://www.visualsvn.com/&quot;&gt;VisualSVN&lt;/a&gt; which offers a $49.00 client that wires beautifully into Visual Studio. Makes using SVN as easy (if not easier) than the Microsoft equivalents.&lt;/p&gt;&lt;p&gt;The same company that makes VisualSVN also makes a VisualSVN server - which packages all the SVN bits for use on Windows Server. We were originally using VisualSVN against the linux based repository, but ended up switching over to the VisualSVN version simply because VisualSVN server has a nice GUI On it for managinge the repository using MMC snap in, and it integrates directly with Active Directory for security, thus eliminating the need for managing a second set of passwords etc. The best part is the VisualSVN server is a free download. &lt;/p&gt;&lt;p&gt;I would recommend VisualSVN for anyone looking for a powerful, easy to use alternative to Microsoft&#039;s tools.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Unit Testing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;On the Unit Testing front, there are several alternatives. The Microsoft Team Systems Test framework, &lt;a href=&quot;http://www.nunit.org/index.php&quot;&gt;Nunit&lt;/a&gt; and the more recent derivative &lt;a href=&quot;http://www.codeplex.com/xunit&quot;&gt;Xunit&lt;/a&gt;. There is a good &lt;a href=&quot;http://xunit.codeplex.com/Wiki/View.aspx?title=Comparisons&amp;amp;referringTitle=Home&quot;&gt;comparison&lt;/a&gt; of these on the Xunit site. At Matrix, we never got far enough into Microsoft Team System to try out the Visual Studio Test and Test system framework, so I cannot comment on it. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Nunit/Xunit:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I was using Nunit up until last year, when I went to the Patterns and Practices confrence and saw Jim Newkirk (who developed both Nunit and &lt;a href=&quot;http://xunit.codeplex.com/&quot;&gt;Xunit&lt;/a&gt; framework and is a long time proponent of unit testing) lecture on the subject. There are a number of things he did when building Xunit that make it a better testing framework - including having setup/teardown in constructor/destructor, and changing the way the tests are run by randomizing them. This forces each test to succeed or fail on its own, and ensures that there are no unforseen interdependancies of the tests. &lt;/p&gt;&lt;p&gt;We have been using Xunit for a while now, and it works very well. &lt;/p&gt;&lt;p&gt;&lt;b&gt;TestDriven.Net&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If you are looking for a tool that can be used to run the Nunit/Xunit tests directly from inside Visual Studio, check out &lt;a href=&quot;http://www.testdriven.net/&quot;&gt;TestDriven.Net &lt;/a&gt;- I have tried it out, and it works very well. It allows either Nunit or Xunit to be run directly inside visual studio. You can run one or many tests, and you can run tests under debug. This is very useful for framework level debugging as well as simply checking test results before committing code. Tests can be used as an entry point for code that would normally require a UI to trigger them for debugging purposes. &lt;/p&gt;&lt;p&gt;It therefore adds more value to building unit tests especially for lower system levels that don&#039;t have a presentation layer, since it gives a very simple quick way to step through code. They offer a personal, professional and enterprise license which are all pretty well priced. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Automated Build Tools:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The two main tools out there seem to be MSBuild, which is also part of Team System, and Nant. &lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://nant.sourceforge.net/&quot;&gt;Nant&lt;/a&gt;:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Most people will likely be familiar with &lt;a href=&quot;http://nant.sourceforge.net/&quot;&gt;Nant&lt;/a&gt; which is a derivative of Ant. At its simplest, Nant is a .net focused build tool that uses an XML file to generate .net compiler output. It can be used for a lot more than just that though, and has a very extensive set of commands associated with it. So extensive, I found it took a while to get a handle on how to best set it up.&lt;/p&gt;&lt;p&gt;I found a great tool though to help with the code markup though called &lt;a href=&quot;http://www.nantbuilder.com/&quot;&gt;NantBuilder&lt;/a&gt;. Its a simple IDE for building and debugging Nant scripts. It has auto complete, and a list of Nant codes and what they do, so is a great way to learn Nant very quickly. Its also very inexpensive, and they ave a 30 day trial as well. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Documentation:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I used to use &lt;a href=&quot;http://ndoc.sourceforge.net/&quot;&gt;NDoc&lt;/a&gt; - but it seems to have died out. There are a few other options out there such as Doxygen and a number of commercial products, but fortunately someone from Microsoft appears to have stepped up with the &lt;a href=&quot;http://sandcastle.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=13873&quot;&gt;Sandcastle&lt;/a&gt; project. (project blog is &lt;a href=&quot;http://blogs.msdn.com/sandcastle/&quot;&gt;here&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Sandcastle works very well, and generates docs for managed code using a very similar approach to Ndoc. It however supports all the new language elements such as generics. In addition, there is a GUI editor available for it also on codeplex &lt;a href=&quot;http://www.codeplex.com/SHFB&quot;&gt;here&lt;/a&gt;. This makes the process of setting up documentation generation for class libraries very simple.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Code Analysis:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;From a .net perspective there are two main free tools out there that are available for doing static analysis that I am aware of. One is &lt;a href=&quot;http://code.msdn.microsoft.com/sourceanalysis&quot;&gt;Style Cop&lt;/a&gt; (blog &lt;a href=&quot;http://blogs.msdn.com/sourceanalysis/&quot;&gt;here&lt;/a&gt;), and the other is &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=9AEAA970-F281-4FB0-ABA1-D59D7ED09772&amp;amp;displaylang=en&quot;&gt;FX Cop&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Style Cop:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Style Cop looks at the source code from  a code layout/design perspective using a set of style and consistency rules. These rules are derived from Microsoft&#039;s .net Framework design guidelines. Style cop produces a set of reports that show where source code is out of compliance with these guidelines. The tool can be tuned to suit individual development environments by changing the sensitivity and excluding rules that don&#039;t apply. Other rules can be added as well. Its useful to get an idea of how well developers are following standards guidelines.&lt;/p&gt;&lt;p&gt;&lt;b&gt;FX Cop:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;FX Cop anlayzes .net assemblies and generates reports on design, possible performance issues, potential security problems etc. It is also based on the .net Framework Design Guidelines produced by Microsoft. As with Style Cop, it can be tuned to suite individual development environment needs.&lt;/p&gt;&lt;p&gt;&lt;b&gt;NCover:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Another great code analysis tool that I have found very useful is &lt;a href=&quot;http://ncover.sourceforge.net/&quot;&gt;NCover&lt;/a&gt;. It looks at the amount of code that is being excercised by automated unit tests, and generates a report.&lt;/p&gt;&lt;p&gt;This is useful information as it clearly shows areas where code is not being executed, which either means unit tests are missing, or the code is in fact &#039;dead&#039;. It can also show branches of code that are not being tested - for example in the case where there may be conditional or object strategies that branch but whose branches are not covered by current unit tests. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Conclusion:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There are a fair number of tools outlined here. In our environment, we use:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SVN - Source Control through VisualSVN server and Visual SVN client&lt;/li&gt;&lt;li&gt;Xunit - for unit testing. We have a copy of TestDriven.net for test debuggging.&lt;/li&gt;&lt;li&gt;Nant - Build automation Scripts. Nantbuilder I found useful to help get up and running with this.&lt;/li&gt;&lt;li&gt;Sandcastle - Documentation generation, and the Sandcastle UI for building the doc generation script&lt;/li&gt;&lt;li&gt;FX Cop and Style Cop - for static code analysis&lt;/li&gt;&lt;li&gt;NCover - for code coverage analysis&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Because we have a small development team, automation is critical to being able to take advantage of these. So while it takes a bit of work to get the automated build/analyze/test scripts setup initially, it really pays off in terms of getting consistent reports, tests and documentation generated. &lt;/p&gt;&lt;p&gt;This requires though a tool which can act as the driver for all of these - and the best tool out there is ThoughtWorks Cruise Control, which comes in both an open source and a commercial version. We are now using the commercial version for our build management system, but the great news there is ThoughtWorks has a great licensing system that is tiered, so even with a small team such as ours, we can take advantage of a very powerful build automation system for initially no cost other than our time.&lt;/p&gt;&lt;p&gt;In the next post, I will delve in detail into how we set Cruise Control up to drive all these other tools. I will also include the scripts required to generate output from each tool as an example.&lt;/p&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2008-10-14:216</id>
 <title>Configuring Silverlight to use a secured WCF Service</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=216&amp;blogId=1" /> 
  
 <modified>2008-10-14T19:32:10-0700</modified> 
 <issued>2008-10-14T19:32:10-0700</issued> 
 <created>2008-10-14T19:32:10-0700</created> 
 <summary type="text/plain"> Configuring Silverlight to access a NT Authenticated WCF Services :     add .xap -&amp;gt; application/x-silverlight-app to the mime
type in IIS to get IIS to recognize and transmit the mime type ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
C# .net development 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;b&gt;Configuring Silverlight to access a NT Authenticated WCF Services :&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; add .xap -&amp;gt; application/x-silverlight-app to the mime
type in IIS to get IIS to recognize and transmit the mime type &lt;/li&gt;&lt;li&gt;add .xaml -&amp;gt; application/xaml+xml to the mime types in
IIS to get IIS to recognize and transmit the mime type &lt;/li&gt;&lt;li&gt;add the clientaccesspolicy.xml  to the root folder in IIS to get the
cross domain  working for wcf debugging&lt;/li&gt;&lt;li&gt;Ensure that you have the IIS virtual directory security set to use NT authentication only &lt;/li&gt;&lt;/ul&gt;If
we modify or create new services inside the service class, it is
necessary to make sure the URL is set correctly in the
ServiceReferences.ClientConfig file in the Silverlight project when you
update the service reference. It defaults to a value that is different
than the value visual studio uses when the debugger is run, which
causes an exception to be thrown when the silverlight call goes through
to the service. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;br/&gt;&lt;b&gt;Clientaccesspolicy.xml file: &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The
clientAccessPolicy.xml file is a file silverlight uses to determine
rules around accessing domains. Without this file, Silverlight throws a
‘404’ error. Docs indicate it has to be in the root of the website –
not in the virtual directory &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;access-policy&amp;gt;&lt;br /&gt;
  &amp;lt;cross-domain-access&amp;gt;&lt;br /&gt;
    &amp;lt;policy&amp;gt;&lt;br /&gt;
      &amp;lt;allow-from http-request-headers=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;domain uri=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/allow-from&amp;gt;&lt;br /&gt;
      &amp;lt;grant-to&amp;gt;&lt;br /&gt;
        &amp;lt;resource path=&amp;quot;/&amp;quot; include-subpaths=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/grant-to&amp;gt;&lt;br /&gt;
    &amp;lt;/policy&amp;gt;&lt;br /&gt;
  &amp;lt;/cross-domain-access&amp;gt;&lt;br /&gt;
&amp;lt;/access-policy&amp;gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Web.config WCF Settings:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Here’s what worked &lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;security binding has to be setup to use transportCredentialsOnly, with Windows for the type. &lt;/li&gt;
&lt;li&gt;This binding has to be bound to the basicHttpSerivce endpoint behaviour &lt;/li&gt;
&lt;li&gt;the
MEX binding that is created by the service generation tool has to be
deleted or it seems to confuse things once security is enabled &lt;/li&gt;
&lt;li&gt;The
service must be setup to use aspNetCompatibilityEnabled = true – and
associated code and includes added into the service class. This is done
automatically by the add new SilverlightWCF service&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
&lt;br /&gt;
&lt;b&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;
    &amp;lt;bindings&amp;gt;&lt;br /&gt;
      &amp;lt;basicHttpBinding&amp;gt;&lt;br /&gt;
        &amp;lt;binding name=&amp;quot;basicHttpSecuredBinding&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;security mode=&amp;quot;TransportCredentialOnly&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;transport clientCredentialType=&amp;quot;Windows&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/security&amp;gt;&lt;br /&gt;
        &amp;lt;/binding&amp;gt;&lt;br /&gt;
      &amp;lt;/basicHttpBinding&amp;gt;&lt;br /&gt;
&lt;br /&gt;    &amp;lt;/bindings&amp;gt;&lt;br /&gt;
        &amp;lt;behaviors&amp;gt;&lt;br /&gt;
   &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;
    &amp;lt;behavior name=&amp;quot;EmployeeDashboardServiceBehavior&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/behavior&amp;gt;&lt;br /&gt;
   &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;
  &amp;lt;/behaviors&amp;gt;&lt;br /&gt;
        &amp;lt;serviceHostingEnvironment aspNetCompatibilityEnabled=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;services&amp;gt;&lt;br /&gt;
   &amp;lt;service behaviorConfiguration=&amp;quot;EmployeeDashboardServiceBehavior&amp;quot;&lt;br /&gt;
    name=&amp;quot;EmployeeDashboardService&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;endpoint address=&amp;quot;&amp;quot; binding=&amp;quot;basicHttpBinding&amp;quot; bindingConfiguration=&amp;quot;basicHttpSecuredBinding&amp;quot;&lt;br /&gt;
     name=&amp;quot;basicHttpEndpoint&amp;quot; contract=&amp;quot;EmployeeDashboardService&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/service&amp;gt;&lt;br /&gt;
  &amp;lt;/services&amp;gt;&lt;br /&gt;
    &amp;lt;/system.serviceModel&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;&lt;/b&gt;&lt;p&gt;Silverlight over SSL With Authentication:&lt;/p&gt;
&lt;p&gt;Client Access policy file has to have some additional attributes added to it as below:&lt;/p&gt;
&lt;div style=&quot;margin:20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: rgb(244, 244, 244); width: 97.5%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 8pt; cursor: text;&quot;&gt;   &lt;div style=&quot;border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;     &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   1:&lt;/span&gt; &lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;&lt;span&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   2:&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;access-policy&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   3:&lt;/span&gt;   &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;cross-domain-access&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   4:&lt;/span&gt;     &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;policy&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   5:&lt;/span&gt;       &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;allow-from&lt;/span&gt; &lt;span&gt;http-request-headers&lt;/span&gt;&lt;span&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   6:&lt;/span&gt;         &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt; &lt;span&gt;uri&lt;/span&gt;&lt;span&gt;=&amp;quot;http://*&amp;quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   7:&lt;/span&gt;         &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt; &lt;span&gt;uri&lt;/span&gt;&lt;span&gt;=&amp;quot;https://*&amp;quot;&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   8:&lt;/span&gt;       &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;allow-from&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;   9:&lt;/span&gt;       &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;grant-to&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;  10:&lt;/span&gt;         &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;resource&lt;/span&gt; &lt;span&gt;include-subpaths&lt;/span&gt;&lt;span&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span&gt;path&lt;/span&gt;&lt;span&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;  11:&lt;/span&gt;       &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;grant-to&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;  12:&lt;/span&gt;     &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;policy&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;  13:&lt;/span&gt;   &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;cross-domain-access&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot;&gt;&lt;span&gt;  14:&lt;/span&gt; &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;access-policy&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot; /&gt;&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; color: black; font-size: 8pt;&quot; /&gt;
  &lt;/div&gt;
&lt;/div&gt;

Client Side:

&lt;div style=&quot;white none repeat scroll 0% 0%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    1&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    2&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;system.serviceModel&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    3&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;bindings&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    4&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;basicHttpBinding&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    5&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;binding&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;basicHttpEndpoint&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;maxBufferSize&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;2147483647&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    6&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                    &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;2147483647&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    7&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                    &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;security&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;mode&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;Transport&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    8&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;binding&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;    9&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;            &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;basicHttpBinding&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   10&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;bindings&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   11&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   12&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;endpoint&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;address&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;https://name.svc&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   13&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;binding&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;basicHttpBinding&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;bindingConfiguration&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;basicHttpEndpoint&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   14&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;contract&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;ServiceReferenceEmployeeDashboard.EmployeeDashboardService&lt;/span&gt;&amp;quot;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   15&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;=&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt;basicHttpEndpoint&lt;/span&gt;&amp;quot;&lt;span style=&quot;blue;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   16&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   17&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;system.serviceModel&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0px;&quot;&gt;&lt;span style=&quot;rgb(43, 145, 175);&quot;&gt;   18&lt;/span&gt; &lt;span style=&quot;blue;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;rgb(163, 21, 21);&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt; 
</content> 
</entry> 
 
 <entry> 
 <id>tag:post:www.menome.com,2008-10-14:215</id>
 <title>Silverlight</title> 
 <link rel="alternate" type="text/html" href="http://www.menome.com/blog/index.php?op=ViewArticle&amp;articleId=215&amp;blogId=1" /> 
  
 <modified>2008-10-14T18:49:20-0700</modified> 
 <issued>2008-10-14T18:49:20-0700</issued> 
 <created>2008-10-14T18:49:20-0700</created> 
 <summary type="text/plain"> While I am critical of Microsoft, its because I know they can do better than they have in recent years.  If you put the dismal performance of Vista and the horrible marketing campaigns of late, ...</summary> 
 <author> 
  
 <name>mimo</name> 
 <url>http://www.menome.com/blog/index.php?blogId=1</url> 
 <email>cloakofcarrot@gmail.com</email> 
</author> 
<dc:subject>
C# .net development 
</dc:subject> 
 <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.menome.com/blog/index.php?blogId=1"> 
 &lt;p&gt;While I am critical of Microsoft, its because I know they can do better than they have in recent years.  If you put the dismal performance of Vista and the horrible marketing campaigns of late,  Microsoft outside the consumer and platform sphere has
created some incredibly innovative products for developers over the last few years.  Linq, and WCF
are just two recent examples - not to mention the new SQL server 2008 which is amazing as
well - more on that in a later post...&lt;/p&gt;&lt;p&gt;Unfortunately, it is
Microsoft business model that needs innovation - not their tools. It is
mired in the world of PC software - often to the detriment of new and
innovative ideas. &lt;/p&gt;&lt;p&gt;Fortunately, Silverlight looks like a breakthrough technology for Microsoft: mainly because it shows a change of attitude. Microsoft is finally getting serious about cross platform support, and the web as the application platform. I have often wondered why Microsoft has not made a .net VM host for other
platforms - Mono aside.  The obvious answer being fear of cannibalizing its windows
franchise. I personally think Microsoft, if it were serious about this battle for the web, would make windows free for consumers, and instead shift its focus to a subscription service based model: say $50 a year for support for Windows or something to that effect. It would cost it a fortune initially, and would affect their stock price (could it get worse??) but would force the company to formally acknowledge what has already happened: Operating systems are a commodity. &lt;/p&gt;&lt;p&gt;Anyway - fantasy aside - It seems that Silverlight is at least a start at Microsoft opening its platform up to other operating systems.&lt;/p&gt;&lt;p&gt;Silverlight allows for .net managed code to run on any platform using Windows Presentation Framework. I am very excited about this, as many of the apps we are looking at building can then be made to run on any platform. It is of course possible to do this with Ajax, which I have done, but it will be nice to have the advantage of a full fledged debugger and a nice set of tools that finally is graphic designer friendly on the Microsoft side (Google of course has had this for a while with its GWT - I have never liked Microsoft&#039;s native implementation of asp.net Ajax - its complicated and messy). &lt;/p&gt;&lt;p&gt;I already have a version of a managed code graph written in C# using the open source &lt;a href=&quot;www.visifire.com&quot;&gt;Visifire&lt;/a&gt; control working in IE, Firefox, and Firefox on the mac (have to try linux next)... using the same code base. This graph gets its data from a WCF service that pulls data from our accounting system. &lt;/p&gt;&lt;p&gt;Here it is running in firefox on my MacBookPro:&lt;/p&gt;&lt;p&gt;&lt;a class=&quot;nodecoration&quot; id=&quot;res_19&quot; href=&quot;http://www.menome.com/blog/resserver.php?blogId=1&amp;amp;resource=wcf.jpg&quot; type=&quot;image/jpeg&quot;&gt;&lt;img border=&quot;0&quot; class=&quot;res_image_medium&quot; style=&quot;margin:5px;&quot; alt=&quot;d&quot; src=&quot;http://www.menome.com/blog/resserver.php?blogId=1&amp;amp;resource=wcf.jpg&amp;amp;mode=medium&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Getting this working though was a bit difficult from a configuraion standpoint. &lt;/p&gt;&lt;p /&gt;&lt;p /&gt;&lt;br/&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt; 
</content> 
</entry> 
 
</feed>