<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>Tom Wayson</title> <atom:link href="http://www.tomwayson.com/feed/" rel="self" type="application/rss+xml" /><link>http://www.tomwayson.com</link> <description>Making web apps and maps great since &#039;98</description> <lastBuildDate>Fri, 03 May 2013 15:54:47 +0000</lastBuildDate> <language>en-US</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.5.1</generator> <item><title>Getting to Know the ArcGIS Online Platform</title><link>http://www.tomwayson.com/2013/05/02/getting-to-know-the-arcgis-online-platform/</link> <comments>http://www.tomwayson.com/2013/05/02/getting-to-know-the-arcgis-online-platform/#comments</comments> <pubDate>Fri, 03 May 2013 06:15:00 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[Web Mapping]]></category> <category><![CDATA[arcgis-online]]></category> <category><![CDATA[GIS]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/?p=160</guid> <description><![CDATA[A few of the sessions at the 2013 Esri Developer Summit got me interested in learning more about how I could utilize some of the new features of ArcGIS Online to help me build web mapping applications. As a developer, my instinct is to approach each new application with a blank page in SublimeText and [...]]]></description> <content:encoded><![CDATA[<p>A few of the <a
href="http://proceedings.esri.com/library/userconf/devsummit13/index.html" target="_blank">sessions at the 2013 Esri Developer Summit</a> got me interested in learning more about how I could utilize some of the new features of <a
href="http://www.arcgis.com/home/" target="_blank">ArcGIS Online</a> to help me build web mapping applications. As a developer, my instinct is to approach each new application with a blank page in <a
href="http://www.sublimetext.com/" target="_blank">SublimeText</a> and a cup of coffee, but I’m getting better at learning to utilize the services that are out there to help jump start new development.</p><blockquote><p><strong>Full disclosure</strong>: I’ve been working for <a
href="http://www.esri.com/" target="_blank">Esri</a> for close to a year now. I’m sharing my personal experiences in trying to better understand the strengths and weaknesses of the <a
href="http://www.arcgis.com/home/" target="_blank">ArcGIS Online</a> platform versus other online mapping platforms. I won’t pretend to be able to be completely impartial, but it is also not part of my job to advocate for the platform.</p></blockquote><p>Now that we’ve got that out of the way we can get down to business. My goals are to understand:</p><ul><li>How far I can get without writing a single line of code<li>The limits of the built in features of the platform like web maps and templates<li>How to start a project using those built in features (e.g. for rapid prototyping) and then transition to a custom solution to get beyond those limits</li></ul><h3>The Plan</h3><p>My plan is to tackle a small application from a few different angles. After seeing the <a
href="http://proceedings.esri.com/library/userconf/devsummit13/papers/devsummit-193.pdf" target="_blank">Developing custom JavaScript Applications with ArcGIS Online presentation</a> where they running routes as sample data, I was inspired to build a map of my own trail running routes in Southern California.</p><p>Requirements for the app are to be able to:</p><ul><li>Import route data in the form of GPS tracks (.gpx files) and display them on a map<li>Integrate <a
href="https://plus.google.com/photos/103833081950211992816/albums/5745387760390203105" target="_blank">photographs I’ve taken along the routes</a> via API requests to a hosted service like <a
href="http://www.flickr.com/" target="_blank">flickr</a><li>Show elevation profiles of the routes<li>Allow me to manually create custom data like points of interest or annotations, and display that data on the map</li></ul><p>My approach will be to:</p><ol><li>Create an ArcGIS Online web map<li>Add that map to one of the out of the box application templates and publish it<li>Identify any features that are missing and fill the gaps by creating a custom application based on either the template and/or relevant samples</li></ol><h3>Look Ma, No Code!</h3><p>So far I’ve done the easy part (steps 1 &amp; 2 above). Without writing a single line of code, I was able to create <a
href="http://www.arcgis.com/home/webmap/viewer.html?webmap=cbb968b3854e4e4fac3f95c30ca41b38" target="_blank">a web map</a>, import some of my GPS tracks, set their symbols, add custom points of interest such as trailheads and parking lots.</p><p><a
href="http://www.arcgis.com/home/item.html?id=cbb968b3854e4e4fac3f95c30ca41b38"><img
style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.tomwayson.com/wp-content/uploads/2013/05/image.png" width="644" height="243"></a></p><p>What’s more, I was able to find an out of the box template that included one of my key functional requirements – showing elevation profiles of the routes. Again, without writing any code, I was able to <a
href="http://resources.arcgis.com/en/help/arcgisonline/index.html#//010q0000008t000000" target="_blank">share the map via a template and publish a fully functional application</a>:</p><p><a
href="http://www.arcgis.com/apps/ElevationsProfile/index.html?appid=524ec6fafff24b089fd54aa8c2967523"><img
style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.tomwayson.com/wp-content/uploads/2013/05/image1.png" width="718" height="772"></a></p><p>Pretty cool. You might be thinking “who needs developers?” However, revising the list of requirements above, I see there is still a one more feature to implement:</p><li><strike>Import route data in the form of GPS tracks (.gpx files) and display them on a map</strike><li>Integrate <a
href="https://plus.google.com/photos/103833081950211992816/albums/5745387760390203105" target="_blank">photographs I’ve taken along the routes</a> via API requests to a hosted service like <a
href="http://www.flickr.com/" target="_blank">flickr</a><li><strike>Show elevation profiles of the routes </strike><li><strike>Allow me to manually create custom data like points of interest or annotations, and display that data on the map</strike><p>Also, the application derived from the out of the box template has a few features that I don’t want such as the dialog that pops up on page load with instructions.</p></p><h3>The Next Steps</h3><p>In my next post I’ll consider my options for how to customize this application to meet all of the requirements.</p></p></p></p></li> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2013/05/02/getting-to-know-the-arcgis-online-platform/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>How to Build a 5 Ft Tall Web Map, and Why You&#8217;d Want to</title><link>http://www.tomwayson.com/2011/10/19/how-to-build-a-5-ft-tall-web-map-and-why-youd-want-to/</link> <comments>http://www.tomwayson.com/2011/10/19/how-to-build-a-5-ft-tall-web-map-and-why-youd-want-to/#comments</comments> <pubDate>Wed, 19 Oct 2011 22:39:47 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[My Projects]]></category> <category><![CDATA[ArcGIS Server]]></category> <category><![CDATA[Featured]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[Projects]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/2011/10/19/how-to-build-a-5-ft-tall-web-map-and-why-youd-want-to/</guid> <description><![CDATA[Recently, the major electric utility that I work for installed a wall full of 50”displays in their power outage response control center, and they asked me to start generating content for it. The content would be real-time summary data of the power outages across the utility’s electric distribution network, and the centerpiece was to be [...]]]></description> <content:encoded><![CDATA[<p>Recently, the major electric utility that I work for installed a wall full of 50”displays in their power outage response control center, and they asked me to start generating content for it. The content would be real-time summary data of the power outages across the utility’s electric distribution network, and the centerpiece was to be a map showing the location of all the current power outages affecting their customers.  This was an exciting challenge for me, since I’ve never created applications to be run on large screens with no human interface devices &#8211; keyboards, mice, etc. I was particularly excited about figuring out how to implement the map, since I typically develop mapping applications that are meant to be experienced inside of a web browser.</p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/10/IMG_20111017_112021.jpg"><img
style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="IMG_20111017_112021" src="http://www.tomwayson.com/wp-content/uploads/2011/10/IMG_20111017_112021_thumb.jpg" alt="IMG_20111017_112021" width="1028" height="772" border="0" /></a></p><h2>A Web Implementation Strategy</h2><p>The entire display wall is powered by <a
title="ActiVu" href="http://www.activu.com/" target="_blank">ActiVu</a> software, which basically projects a very large Windows desktop across the array of screens.  So, in theory, the content could come from any kind of application.  Most of the content that we wanted to display already appeared on web pages on an intranet site, so the fastest way to get the content on the wall without creating new applications was to just open those pages via ActiVu’s browser and fit them into a mosaic across the wall.  However, after getting content up in just a few clicks, it was soon obvious that those pages would need to be reformatted to work on the big screen. Again, the web turned out to be a nifty solution, because I was able to accomplish that by simply adding a new CSS style sheet that was invoked when requested from these screens.</p><p>With the rest of the wall’s content coming form web pages, why not try putting up our existing Bing Maps based power outage web map? While that worked, it wasn’t pretty. This map was originally designed to be displayed by our field crews running IE6 a 1024 x 768 laptop across a wireless connection. So, we were going to build a new map. While a desktop solution may have been possible (i.e. leaving a copy of ArcMap open on the display server), we chose to implement it as a web map using the <a
title="ArcGIS JavaScript API" href="http://help.arcgis.com/en/webapi/javascript/arcgis/" target="_blank">ArcGIS JavaScript API</a> for the following reasons.</p><h2>A 5ft Tall JavaScript Map, Really?</h2><p>While I considered using the ArcGIS Server REST API’s export option to generate fresh PNG images at the correct resolution every few minutes, I decided that an HTML5 web page with a small amount of JavaScript could do the job better.  The HTML5/JavaScript implementation is ideal because after the initial request for base and static map layer tiles, the dynamic content could be implemented as a graphics layer that refreshed only as frequently as needed. Though the same could be achieved with Esri’s other web APIS (Flex, JavaScript), I chose HTML5 and JavaScript because I would need fine grained control over the layout, fonts, etc.  I was also able to overlay my own custom inset map and the legend widget to make better use of the dead space around the edges of the map.  The best part is that the same map can be displayed in a web browser on a user’s desktop at “normal” resolutions because I set the size dynamically in the JavaScript.  Below is a screenshot taken at 1280 by 960 pixels:</p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/10/etvb_map_1280x960.png"><img
style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="etvb_map_1280x960" src="http://www.tomwayson.com/wp-content/uploads/2011/10/etvb_map_1280x960_thumb.png" alt="etvb_map_1280x960" width="966" height="772" border="0" /></a></p><h2>What’s Next for the Big Web Map?</h2><p>The initial feedback from the users has been very positive, but they had one main suggestion and that was to use color as well as size gradients for the outage symbols to differentiate the outages by the number of affected customers.  That’s an easy fix.  We also plan to add other operational data such as the locations of working crews as well as contextual information such as weather, earthquakes, etc.  Fortunately, the contextual information is already exposed as public Esri map services from other agencies.  The trick is going to be figuring out how to control the visibility of that data without any direct interaction from the user.  One possibility is to create a simple administration interface where a senior dispatcher can control what content is available on the map at a given time. Another would be to cycle through a series of pre-defined “views” each with different kinds of contextual information behind the outages.  Whatever we end up doing next, I’m really going to enjoy working on the solution!</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2011/10/19/how-to-build-a-5-ft-tall-web-map-and-why-youd-want-to/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Oracle: Get Month Start and End Dates for a Given Period (i.e. Year)</title><link>http://www.tomwayson.com/2011/06/10/oracle-get-month-start-and-end-dates-for-a-given-period-i-e-year/</link> <comments>http://www.tomwayson.com/2011/06/10/oracle-get-month-start-and-end-dates-for-a-given-period-i-e-year/#comments</comments> <pubDate>Fri, 10 Jun 2011 16:19:20 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[Database]]></category> <category><![CDATA[Oracle]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/?p=135</guid> <description><![CDATA[Took me a few minutes to think this one through, so I thought I&#8217;d share. In this example I show the start and end date for each month in the period that contains the fiscal year from 7/1/10 to 6/30/11. select trunc(add_months('01-JUL-10', level-1), 'MM') start_date, last_day(add_months('01-JUL-10', level-1)) end_date from dual connect by level &#60;= ceil(months_between('30-JUN-11', '01-JUL-10')) [...]]]></description> <content:encoded><![CDATA[<p>Took me a few minutes to think this one through, so I thought I&#8217;d share.  In this example I show the start and end date for each month in the period that <em>contains</em> the fiscal year from 7/1/10 to 6/30/11.</p><p><code>select trunc(add_months('01-JUL-10', level-1), 'MM') start_date,<br
/> last_day(add_months('01-JUL-10', level-1)) end_date<br
/> from dual connect by level &lt;= ceil(months_between('30-JUN-11', '01-JUL-10'))</code></p><table><TR><th> START_DATE</th><th> END_DATE</th></tr><p><TR><td> 7/1/2010</td><td> 7/31/2010</td></tr><p><TR><td> 8/1/2010</td><td> 8/31/2010</td></tr><p><TR><td> 9/1/2010</td><td> 9/30/2010</td></tr><p><TR><td> 10/1/2010</td><td> 10/31/2010</td></tr><p><TR><td> 11/1/2010</td><td> 11/30/2010</td></tr><p><TR><td> 12/1/2010</td><td> 12/31/2010</td></tr><p><TR><td> 1/1/2011</td><td> 1/31/2011</td></tr><p><TR><td> 2/1/2011</td><td> 2/28/2011</td></tr><p><TR><td> 3/1/2011</td><td> 3/31/2011</td></tr><p><TR><td> 4/1/2011</td><td> 4/30/2011</td></tr><p><TR><td> 5/1/2011</td><td> 5/31/2011</td></tr><p><TR><td> 6/1/2011</td><td> 6/30/2011</td></tr></table><p>It should work for periods of any length (i.e. one quarter, 6 months, 2 years, etc) by replacing the period start and end dates.</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2011/06/10/oracle-get-month-start-and-end-dates-for-a-given-period-i-e-year/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>My First Ride on the Elysian Valley Section of the L.A. River Bike Path</title><link>http://www.tomwayson.com/2011/05/13/my-first-ride-on-the-elysian-valley-section-of-the-l-a-river-bike-path/</link> <comments>http://www.tomwayson.com/2011/05/13/my-first-ride-on-the-elysian-valley-section-of-the-l-a-river-bike-path/#comments</comments> <pubDate>Fri, 13 May 2011 16:49:00 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[Biking]]></category> <category><![CDATA[biking]]></category> <category><![CDATA[Los Angeles]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/2011/05/13/my-first-ride-on-the-elysian-valley-section-of-the-l-a-river-bike-path/</guid> <description><![CDATA[A few happy days a year I have to take my car into the shop. On these days, I strap my bike onto my car rack and take the car into my old dealership in Glendale and get to ride the 9 miles from the shop to work.&#160; Along the way I retrace my old [...]]]></description> <content:encoded><![CDATA[<p>A few happy days a year I have to take my car into the shop. On these days, I strap my bike onto my car rack and take the car into my old dealership in Glendale and get to ride the 9 miles from the shop to work.&nbsp; Along the way I retrace my old bike commute route from Glassell Park to downtown L.A.&nbsp; While most of that route is fortunate enough to have actual bike lanes or bike routes, there is one stretch of San Fernando between Glendale Blvd and Fletcher that is outright hostile to bike riders. I recently found out from my friends at <a
href="http://www.bikesidela.org/" target="_blank">Bikeside LA</a> that the <a
href="http://lacreekfreak.wordpress.com/2010/12/05/there-it-is-ride-it/" target="_blank">Elysian Valley section of the L.A. River bike path opened back in December of 2010</a>, and looking at a map I realized that I could now completely circumvent that nasty bit of road by taking the L.A. River bike path from Glendale Blvd all the way down to the Riveside Drive bridge where I’d pick up my old commute route.&nbsp; See the map below:</p><p><a
title="Map and Log of Elysian Valley Ride on CardioTrainer" href="http://www.worksmartlabs.com/cardiotrainer/tracks.php?trackId=676808760&amp;sig=edb09e100da398a778c259a5a08f84ddeae69121" target="_blank"><img
style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tomwayson.com/wp-content/uploads/2011/05/image1.png" width="528" height="415"></a></p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/05/IMAG0132.jpg"><img
style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IMAG0132" border="0" alt="IMAG0132" align="left" src="http://www.tomwayson.com/wp-content/uploads/2011/05/IMAG0132_thumb.jpg" width="291" height="484"></a>This new stretch of river bike path is amazingly pleasant. There are a lot of trees that protect riders from the sun and wind. The path was getting a lot of use for a weekday, especially by dog walkers, but there didn’t seem to be any conflict between the pedestrian traffic and the roadies who, like me, were <a
title="Map and Log of Elysian Valley Ride on CardioTrainer" href="http://www.worksmartlabs.com/cardiotrainer/tracks.php?trackId=676808760&amp;sig=edb09e100da398a778c259a5a08f84ddeae69121" target="_blank">flying along at over 20mph</a>.</p><p>There are nice mini-parks strewn along the path where people can stop and enjoy the shade or use outdoor exercise equipment. These parks and access points are adorned with the super cool sculptured fences that have become the hallmark of the L.A. River bike path.</p><p
style="clear: left">However, the most amazing part was that at certain points, if you squinted, the L.A. River looked like, well, a river!</p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/05/IMAG0131.jpg"><img
style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IMAG0131" border="0" alt="IMAG0131" src="http://www.tomwayson.com/wp-content/uploads/2011/05/IMAG0131_thumb.jpg" width="644" height="387"></a></p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/05/IMAG0125.jpg"><img
style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IMAG0125" border="0" alt="IMAG0125" align="left" src="http://www.tomwayson.com/wp-content/uploads/2011/05/IMAG0125_thumb.jpg" width="119" height="303"></a>I have to say the only thing I didn’t like about the new stretch of bike path was the end. It drops riders off on Riverside Drive, just north of the bridge that crosses the river and train tracks. This forces southbound cyclists to cross where cars are speeding by uninhibited by cross streets or traffic signals and then climb up and over the broken glass and debris covered bridge. It’s not a big deal, but I hope that by the time <a
href="http://la.streetsblog.org/2011/02/25/city-poised-to-begin-construction-of-arroyo-seco-bikewayriver-confluence-gateway/" target="_blank">the Arroyo bike path is extended to the Confluence Gateway</a> the City will find a better way to link cyclists to the amenities in this area like the Metro station, Elysian Park, and even the Cornfield and Union Station.</p><p
style="clear: left">Until then, I’ll be looking forward to the next time I get to take my car into the shop!</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2011/05/13/my-first-ride-on-the-elysian-valley-section-of-the-l-a-river-bike-path/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Running The ArcGIS JavaScript API in a SquareSpace Site</title><link>http://www.tomwayson.com/2011/04/14/running-the-arcgis-javascript-api-in-a-squarespace-site/</link> <comments>http://www.tomwayson.com/2011/04/14/running-the-arcgis-javascript-api-in-a-squarespace-site/#comments</comments> <pubDate>Thu, 14 Apr 2011 22:31:18 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[Blogging]]></category> <category><![CDATA[ArcGIS Server]]></category> <category><![CDATA[javascript]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/2011/04/running-the-arcgis-javascript-api-in-a-squarespace-site/</guid> <description><![CDATA[Just in case you are curious, SquareSpace does allow you to run ArcGIS Server JavaScript API code on their pages.&#160; Here’s a screen shot of a I map made by copying and pasting code from the simple map sample into a SquareSpace page. The only trick was to move the script tags out of the [...]]]></description> <content:encoded><![CDATA[<p>Just in case you are curious, <a
title="SquareSpace" href="http://www.squarespace.com/" target="_blank">SquareSpace</a> does allow you to run <a
title="ArcGIS Server JavaScript API" href="http://help.arcgis.com/en/webapi/javascript/arcgis/" target="_blank">ArcGIS Server JavaScript API</a> code on their pages.&nbsp; Here’s a screen shot of a I map made by copying and pasting code from the simple map sample into a SquareSpace page.</p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/04/image2.png"><img
style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tomwayson.com/wp-content/uploads/2011/04/image_thumb1.png" width="583" height="484"></a></p><p>The only trick was to move the script tags out of the &lt;head&gt; section and into the &lt;body&gt;, since I don’t think that you are able to modify the &lt;head&gt;.&nbsp; Here’s the complete code listing:</p><div
class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">dojotype</span><span class="kwrd">="dijit.layout.BorderContainer"</span> <span class="attr">design</span><span class="kwrd">="headline"</span> <span class="attr">gutters</span><span class="kwrd">="false"</span> <span class="attr">style</span><span class="kwrd">="width: 100%; height: 100%; margin: 0;"</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>      <span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">="map"</span> <span class="attr">dojotype</span><span class="kwrd">="dijit.layout.ContentPane"</span> <span class="attr">region</span><span class="kwrd">="center"</span> <span class="attr">style</span><span class="kwrd">="border:1px solid #000;padding:0;"</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:  </span>     <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:  </span>    <span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">type</span><span class="kwrd">="text/javascript"</span><span class="kwrd">&gt;</span><span class="kwrd">var</span> djConfig = {parseOnLoad: <span class="kwrd">true</span>};<span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   6:  </span>    &lt;script type=<span class="str">"text/javascript"</span> src=<span class="str">"http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.2"</span>&gt;&lt;/script&gt;</pre><pre class="alt"><span class="lnum">   7:  </span>    &lt;script type=<span class="str">"text/javascript"</span>&gt;</pre><pre><span class="lnum">   8:  </span>      dojo.require(<span class="str">"dijit.layout.BorderContainer"</span>);</pre><pre class="alt"><span class="lnum">   9:  </span>      dojo.require(<span class="str">"dijit.layout.ContentPane"</span>);</pre><pre><span class="lnum">  10:  </span>      dojo.require(<span class="str">"esri.map"</span>);</pre><pre class="alt"><span class="lnum">  11:  </span>&nbsp;</pre><pre><span class="lnum">  12:  </span>      </pre><pre class="alt"><span class="lnum">  13:  </span>      <span class="kwrd">var</span> map;</pre><pre><span class="lnum">  14:  </span>      </pre><pre class="alt"><span class="lnum">  15:  </span>      <span class="kwrd">function</span> init() {</pre><pre><span class="lnum">  16:  </span>        <span class="kwrd">var</span> initExtent = <span class="kwrd">new</span> esri.geometry.Extent({<span class="str">"xmin"</span>:-13632648,<span class="str">"ymin"</span>:4542594,<span class="str">"xmax"</span>:-13621699,<span class="str">"ymax"</span>:4546875,<span class="str">"spatialReference"</span>:{<span class="str">"wkid"</span>:102100}});</pre><pre class="alt"><span class="lnum">  17:  </span>        map = <span class="kwrd">new</span> esri.Map(<span class="str">"map"</span>,{extent:initExtent});</pre><pre><span class="lnum">  18:  </span>        <span class="rem">//Add the topographic layer to the map.</span></pre><pre class="alt"><span class="lnum">  19:  </span>        <span class="kwrd">var</span> basemap = <span class="kwrd">new</span> esri.layers.ArcGISTiledMapServiceLayer(<span class="str">"http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"</span>);</pre><pre><span class="lnum">  20:  </span>        map.addLayer(basemap);</pre><pre class="alt"><span class="lnum">  21:  </span>        </pre><pre><span class="lnum">  22:  </span>        <span class="rem">//resize the map when the browser resizes </span></pre><pre class="alt"><span class="lnum">  23:  </span>        dojo.connect(map, <span class="str">'onLoad'</span>, <span class="kwrd">function</span>(theMap) { </pre><pre><span class="lnum">  24:  </span>          dojo.connect(dijit.byId(<span class="str">'map'</span>), <span class="str">'resize'</span>, <span class="kwrd">function</span>() {  <span class="rem">//resize the map if the div is resized</span></pre><pre class="alt"><span class="lnum">  25:  </span>            clearTimeout(resizeTimer);</pre><pre><span class="lnum">  26:  </span>            console.log(<span class="str">'resize'</span>);</pre><pre class="alt"><span class="lnum">  27:  </span>            resizeTimer = setTimeout( <span class="kwrd">function</span>() {</pre><pre><span class="lnum">  28:  </span>              map.resize();</pre><pre class="alt"><span class="lnum">  29:  </span>              map.reposition();</pre><pre><span class="lnum">  30:  </span>            }, 500);</pre><pre class="alt"><span class="lnum">  31:  </span>          });</pre><pre><span class="lnum">  32:  </span>        });</pre><pre class="alt"><span class="lnum">  33:  </span>      }</pre><pre><span class="lnum">  34:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">  35:  </span>      dojo.addOnLoad(init);</pre><pre><span class="lnum">  36:  </span>    <span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre></div><style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2011/04/14/running-the-arcgis-javascript-api-in-a-squarespace-site/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Why I Am Reviving My WordPress Blog in the Age of Twitter, Facebook, Del.ico.us, Google Reader, Tumblr&#8230;</title><link>http://www.tomwayson.com/2011/04/13/why-i-am-reviving-my-wordpress-blog-in-the-age-of-twitter-facebook-del-ico-us-google-reader-tumblr/</link> <comments>http://www.tomwayson.com/2011/04/13/why-i-am-reviving-my-wordpress-blog-in-the-age-of-twitter-facebook-del-ico-us-google-reader-tumblr/#comments</comments> <pubDate>Wed, 13 Apr 2011 11:34:00 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[Blogging]]></category> <category><![CDATA[BlogEngine.Net]]></category> <category><![CDATA[Orchard]]></category> <category><![CDATA[SquareSpace]]></category> <category><![CDATA[Tumblr]]></category> <category><![CDATA[WordPress]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/2011/04/why-i-am-reviving-my-wordpress-blog-in-the-age-of-twitter-facebook-del-ico-us-google-reader-tumblr/</guid> <description><![CDATA[I started this blog in 2005, and back then, it was pretty much either WordPress or Blogger.  WordPress seemed more customizable, especially since I had a hosting plan where I could host my own blog and dive in to the underlying PHP if I wanted to, so it seemed like the right platform for me [...]]]></description> <content:encoded><![CDATA[<p>I started this blog in 2005, and back then, it was pretty much either <a
href="http://wordpress.org/" target="_blank">WordPress</a> or <a
href="http://blogger.com" target="_blank">Blogger</a>.  WordPress seemed more customizable, especially since I had a hosting plan where I could host my own blog and dive in to the underlying PHP if I wanted to, so it seemed like the right platform for me at the time.</p><p>As the micro blogging platforms emerged, I realized that they were more appropriate for most of my posts (many were little more than a link with a short blurb on why I thought it was important).  Furthermore, I could reach different audiences via different channels: Facebook for friends and family, <a
title="My Twitter feed" href="http://twitter.com/tomwayson" target="_blank">Twitter</a> for quasi professional exchanges, <a
title="My Del.ico.us links" href="http://delicious.com/twayson" target="_blank">Del.ico.us</a> and <a
title="My Google Reader feed" href="http://www.google.com/reader/shared/tom.wayson" target="_blank">Google Reader</a> for sharing important articles, etc.  I’ve tried them all, and in the process have created a very fractured online identity.</p><p>It was starting to get out of hand, so I finally decided to take advantage of all the modern APIs and syndication formats to wrangle my content into a central repository, but where?  I could immediately rule out most of the services that I was such as Facebook, Twitter, Del.ico.us, and the Google services (Profiles, Buzz, Picasa)as they simply weren’t up to the task of incorporating all of my content.  Those services would be the source of content, but I would I need a real blogging platform to bring them all together under one branded site.  Below are all the options I considered along with some pros and cons of each.</p><h3>ASP.Net Solutions: BlogEngine.Net, and Orchard</h3><p>Although I develop for many frameworks, .Net is the one that pays the bills and therefore the one I spend the most time developing in.  So, it makes sense to have a my blog powered by .Net, right?  Not so fast.  I’ve had a rocky relationship with ASP.Net WebForms since the beginning.  As far as ASP.Net goes, the only joy to be had is in MVC, Razor, and now WebPages, and I want any under the hood tweaks I do to my blog to be fun for me.  After all, no one will be paying me for them.  So, while <a
title="BlogEngine.Net" href="http://www.dotnetblogengine.net/" target="_blank">BlogEngine.Net</a> is indeed a mature platform with an active community developing themes and plugins, I just can’t bring myself to type &lt;asp:… in my spare time.</p><p>I was looking for an MVC alternative to BlogEngine.Net when I found out about <a
title="Orchard" href="http://orchardproject.net/" target="_blank">Orchard</a>.  The idea of a content management system written in ASP.Net MVC and Razor really piqued my interest, but the platform was still in beta.  Since it launched I revisited it to see if it was ready for prime time.  I think it would be great for an ASP.Net developer starting a new blog, but it’s just too new, and lacking too many features for my needs.  I plan to get an Orchard site going soon so I can participate in the evolution of the platform and most likely I will eventually move all of my content there.</p><h3>Hosted Solutions: SquareSpace and Tumblr</h3><p>Do I really need to host my own blog?  After all, the last time I was under the hood of this blog was when I created a custom theme before I launched it.  I haven’t authored any great WordPress plug-ins, heck, I barely have time to post content.  Many of the widgets, plug-ins, and themes that I might use to incorporate syndicated content rely solely on front end technology like CSS and JavaScript, so why incur the hassle and cost of hosting if you don’t need access to the server code?</p><p><a
title="SquareSpace" href="http://www.squarespace.com/" target="_blank">SquareSpace</a> seems to be the most customizable of the hosted platforms out there.  The catch is that it’s not free and I couldn’t justify the extra cost with free alternatives out there.</p><p><a
title="Tumblr" href="http://www.tumblr.com/" target="_blank">Tumblr</a>, like WordPress.com and Blogger, offers free plans that fill the middle space between Facebook and Twitter and hosting your own blog.  While none offer as much customization as SquareSpace, they do offer a lot.  Tumblr seems to be particularly good at integrating your content from other feeds (exactly what I’m trying to do) and as a bonus it works really well on mobile devices (both for display and posting).  It almost won me over, after all If it’s good enough for <a
title="Rob Conery's blog" href="http://wekeroad.com/" target="_blank">Rob Conery</a>, it’s should be good enough for me, right?</p><p>The problem with all of these hosted solutions is that I couldn’t find an easy way to bring in content from my old blog.  Tumblr was good at brining in tweets and Del.ico.us links day forward, but I couldn’t find a way to bring in older content.  Furthermore, I wasn’t sure I wanted to since Tumbr integrates all of those into one feed.  What I really wanted to display the different sources of content as either sidebar or their own pages.</p><h3><strong>Back Where I Started, Hosting My Own WordPress Blog</strong></h3><p>Stick with what you know, right?  I’m already happy with my decision.  The WordPress platform has evolved a lot in the 6 years since I started this blog.  It was easy for me to find a <a
title="JustCSS WordPress Theme" href="http://pross.org.uk/2010/07/25/justcss/" target="_blank">clean, simple (just the code ma’am) theme that uses HTML5 and CSS3</a>, as well as a dozen new plug-ins to handle everything from incorporating my content from other services to simple SEO tweaks.  When there wasn’t a plug-in available to something, I have been able to write very simple PHP code to do it (more on that later).</p><p>More importantly, I had fun finding all the clever themes, widgets and plugins and even more fun whipping up a few lines of PHP code here and there to make things just the way I want them on the site.</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2011/04/13/why-i-am-reviving-my-wordpress-blog-in-the-age-of-twitter-facebook-del-ico-us-google-reader-tumblr/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>City of Pasadena Interactive Map Enhancements</title><link>http://www.tomwayson.com/2010/10/15/city-of-pasadena-interactive-map-enhancements/</link> <comments>http://www.tomwayson.com/2010/10/15/city-of-pasadena-interactive-map-enhancements/#comments</comments> <pubDate>Fri, 15 Oct 2010 17:39:00 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[My Projects]]></category> <category><![CDATA[Featured]]></category> <category><![CDATA[Google Maps API]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[jQuery]]></category> <guid
isPermaLink="false">http://www.tomwayson.com/?p=110</guid> <description><![CDATA[The enhancements that I’ve been making to the interactive map on The City of Pasadena’s web site went live yesterday! About the Project The Google Maps based interactive map was originally developed (by another consulting firm) to help residents identify what neighborhood and city council districts they lived in.  A user entered an address, and [...]]]></description> <content:encoded><![CDATA[<p>The enhancements that I’ve been making to the <a
title="The City of Pasadena Interactive Map" href="http://cityofpasadena.net/map" target="_blank">interactive map on The City of Pasadena’s web site</a> went live yesterday!</p><h3>About the Project</h3><p>The Google Maps based interactive map was originally developed (by another consulting firm) to help residents identify what neighborhood and city council districts they lived in.  A user entered an address, and the page would display a marker on the map with an info window listing the location’s city and neighborhood council districts.  Below the map the page would show a street view panorama of the location.  The user also had the option of viewing the city council district boundaries on the the map as KML overlays.</p><p>The City wanted to enhance the page by also displaying nearby features (such as libraries, transit stations, etc.) on both the map and the list.</p><p><a
title="The City Of Pasadena Interactive Map" href="http://cityofpasadena.net/map/" target="_blank"><img
style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="" src="http://www.tomwayson.com/wp-content/uploads/2011/04/image.png" alt="Screen shot of The City of Pasadena Interactive Map" width="715" height="772" border="0" /></a></p><p>In addition to adding the new features to the map and list, The City wanted a new page that showed the same information in a printer friendly format.</p><p><a
href="http://www.tomwayson.com/wp-content/uploads/2011/04/image1.png"><img
style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="" src="http://www.tomwayson.com/wp-content/uploads/2011/04/image_thumb.png" alt="Screen shot of The City of Pasadena Print Map" width="633" height="907" border="0" /></a></p><h3>A Google Maps API, SQL Server 2008, and ASP.Net Implementation</h3><p>I worked with The City and determined that the best strategy would be to expand on the existing implementation, which relied on the <a
title="Google Maps JavaScript API (v2)" href="http://code.google.com/apis/maps/documentation/javascript/v2/" target="_blank">Google Maps JavaScript API (v2)</a> to show spatial data stored in SQL Server 2008 in the context of their ASP.Net content management system.  Since the source data lives in Oracle Spatial and is managed by ESRI tools an ideal implementation would be to serve the spatial data via <a
title="ArcGIS Server" href="http://www.esri.com/software/arcgis/arcgisserver/" target="_blank">ArcGIS Server</a> web services and consume it using one of the ESRI client APIs (most likely the <a
title="ArcGIS Server JavaScript API" href="http://help.arcgis.com/en/webapi/javascript/arcgis/" target="_blank">ArcGIS Server JavaScript API</a>) in the host ASP.Net web page.  However, The City’s ArcGIS Server instance was not accessible from the public side of the firewall, so we decided to build upon the existing implementation.  I also decided to stick with v2 of the Google Maps API for this page because moving to v3 would have meant re-writing almost all of the original code.  I decided to use <a
title="Google Static Maps API" href="http://http://code.google.com/apis/maps/documentation/staticmaps/" target="_blank">Google Static Maps API</a> to implement the map on print page.</p><p>I faced two hurdles when coding the enhancements.  First, parameters that should be user configurable (such as the list of layers to be queried) were hard coded into the source code.  The second was that much of the logic was executed in the JavaScript and code behind of the ASP.Net page.  To overcome these hurdles I created a “lower level” framework to make the code more adaptable to future enhancements as well as those at hand.  This framework consisted of database tables to store the configurable parameters, new stored procedures for access those parameters as well as the spatial data, and REST JSON services wrap those procedures and expose the data to the ASP.Net front end .  This architecture would facilitate embedding maps and the results of spatial queries into other pages on the site in the future, which was part of The City’s long term vision for the project.</p><p>With my new framework in place, the rest of the work involved tying all the services together into an easy to use UI using <a
title="jQuery" href="http://jquery.com/" target="_blank">jQuery</a>, HTML, and CSS.  You can play with the application yourself at:</p><p><a
href="http://cityofpasadena.net/map/">http://cityofpasadena.net/map/</a></p><p>I’d love to hear your feedback!</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2010/10/15/city-of-pasadena-interactive-map-enhancements/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>VEMap.Find Returns Italian Location from US Addresses (Los Angeles)?</title><link>http://www.tomwayson.com/2009/09/03/vemapfind-returns-italian-location-from-us-addresses-los-angeles/</link> <comments>http://www.tomwayson.com/2009/09/03/vemapfind-returns-italian-location-from-us-addresses-los-angeles/#comments</comments> <pubDate>Thu, 03 Sep 2009 22:47:32 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[Web Mapping]]></category> <category><![CDATA[Bing Maps API]]></category> <category><![CDATA[javascript]]></category> <guid
isPermaLink="false">http://www.waysonweb.com/blog/2009/09/03/vemapfind-returns-italian-location-from-us-addresses-los-angeles/</guid> <description><![CDATA[This one took me a couple of minutes to figure out, so I thought I&#8217;d pass it along. Recently I launched an update to an application (in beta) that used the VEMap.Find method to geocode addresses in Los Angeles, CA, but for some reason the results for a few of the addresses would show up [...]]]></description> <content:encoded><![CDATA[<p>This one took me a couple of minutes to figure out, so I thought I&#8217;d pass it along.  Recently I launched an update to an application (in beta) that used the VEMap.Find method to geocode addresses in Los Angeles, CA, but for some reason the results for a few of the addresses would show up somewhere in Italy.  Eventually I noticed that this was only happening for avenues (as opposed to streets or boulevards).  I realized that our street database used the abbreviation &#8220;AV&#8221; instead of &#8220;AVE&#8221; and deduced that there must be an Italian province (Avellino?) that used that abbreviation and the parsing engine behind VEMap.Find must pick that out before the zip code.</p><p>My solution was to replace the word &#8220;AV&#8221; with &#8220;AVE&#8221; in the address string before passing it to the VEMap.Find function with the following:</p><p><code>address.replace(/\bAV\b/,"AVE")</code></p><p>So far, so good.  I wonder how may more calls to replace I&#8217;ll end up daisy chaining on to that before I&#8217;m through with this one&#8230;</p><p></p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2009/09/03/vemapfind-returns-italian-location-from-us-addresses-los-angeles/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>myjoglog.net &#8211; Iteration 3: MVC Membership Provider-based Access Control</title><link>http://www.tomwayson.com/2008/11/14/myjoglognet-iteration-3-mvc-membership-provider-based-access-control/</link> <comments>http://www.tomwayson.com/2008/11/14/myjoglognet-iteration-3-mvc-membership-provider-based-access-control/#comments</comments> <pubDate>Sat, 15 Nov 2008 00:17:37 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[My Projects]]></category> <category><![CDATA[.Net]]></category> <category><![CDATA[ASP.Net]]></category> <category><![CDATA[MVC]]></category> <category><![CDATA[Web]]></category> <guid
isPermaLink="false">http://www.waysonweb.com/blog/2008/11/14/myjoglognet-iteration-3-convincing-myself-that-this-will-work/</guid> <description><![CDATA[In my previous post in this series, I determined that I had to start looking into how MVC handles access control before moving forward. I came up with a list of functional specifications that I needed to write proof of concept code right away to learn how ASP.Net MVC helps (or hinders) me in implementing [...]]]></description> <content:encoded><![CDATA[<p>In <a
href="http://www.waysonweb.com/blog/2008/11/14/myjoglognet-iteration-2-user-stories/">my previous post in this series</a>, I determined that I had to start looking into how MVC handles access control before moving forward. I came up with a list of functional specifications that I needed to write proof of concept code right away to learn how ASP.Net MVC helps (or hinders) me in implementing access control. In this post, I&#8217;ll look at the first 2 specifications:</p><ol><li>Authenticate individual users and mange their credentials (i.e. a MembershipProvider)</li><li>Manage access to functionality based on membership (i.e. a MembershipProvider)</li></ol><p>I know that in MVC, controlling access to controller actions (and thereby the associated views) is done via <a
target="_blank" href="http://quickstarts.asp.net/previews/mvc/mvc_HowToRestrictAccessToAction.htm">a specific type of ActionFilter called an AuthorizationFilter</a>. Also, the ASP.Net MVC Web Application template includes code that shows how to use an ASP.Net membership provider to enable user registration and login. So, a quick test that will tell me if the built-in AuthorizationFilter will be able to meet the first 2 functional specifications above is to add an authorization filter to the Add action of the Workouts controller so that only users that have logged in will be able to add a workout.</p><p>I do this by changing the attribute for the Add method from:</p><p><code>AcceptVerbs(HttpVerbs.Get)</code></p><p>to:</p><p><code>AcceptVerbs(HttpVerbs.Get), Authorize()</code></p><p>Now when trying to add a workout, a user is redirected to the login page. After registering and logging in the user is now able to add workouts!</p><p>In the next installment I will try to convince myself that I can control access to actions based on user&#8217;s relationship to an entity (i.e. members can only delete their <em>own</em> workouts).</p><p>Stay tuned&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2008/11/14/myjoglognet-iteration-3-mvc-membership-provider-based-access-control/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>myjoglog.net &#8211; Iteration 2: User Stories</title><link>http://www.tomwayson.com/2008/11/14/myjoglognet-iteration-2-user-stories/</link> <comments>http://www.tomwayson.com/2008/11/14/myjoglognet-iteration-2-user-stories/#comments</comments> <pubDate>Fri, 14 Nov 2008 22:58:12 +0000</pubDate> <dc:creator>Tom Wayson</dc:creator> <category><![CDATA[My Projects]]></category> <category><![CDATA[.Net]]></category> <category><![CDATA[ASP.Net]]></category> <category><![CDATA[MVC]]></category> <category><![CDATA[Web]]></category> <guid
isPermaLink="false">http://www.waysonweb.com/blog/2008/11/14/myjoglognet-iteration-2-user-stories/</guid> <description><![CDATA[Creating User Stories Now that I&#8217;ve got a feel for how MVC handles the mechanics of a data-driven application, I&#8217;ve got to take a step back and think about how users are going to use the application. For a start, here&#8217;s what I came up with: The site will allow anyone (both anonymous and logged [...]]]></description> <content:encoded><![CDATA[<p><strong>Creating User Stories</strong></p><p>Now that I&#8217;ve got a feel for how MVC handles the mechanics of a data-driven application, I&#8217;ve got to take a step back and think about how users are going to use the application. For a start, here&#8217;s what I came up with:</p><ul><li>The site will allow anyone (both anonymous and logged in users) to view all recently logged workouts.</li><li>The site will allow users to create an account and thereby become members.</li><li>Members will be able to log their own workouts.</li><li>Members will be able to add events that they are training for.</li><li>Members will also be able to join one or more teams. A team is a group of members (e.g. that may train together or who are training for the same event).</li><li>Teammates (members of the same team) will be to see each others&#8217; complete workout logs</li><li>Teammates will be able to subscribe to updates (i.e. via a feed, e-mail alerts, or iCal) to the logs of their teammates.</li><li>Only certain members will be able to create, own, and manage a team.</li></ul><p>I&#8217;m sure these and other stories will get more flushed out as the project evolves, but that&#8217;s plenty for now.</p><p><strong>Turning Those Stories into Specifications </strong><br
/> From these stories I&#8217;ve derived some entities (the nouns) that I&#8217;ll be working with:</p><ul><li>Member &#8211; a user with an account</li><li>Workout &#8211; um, a workout</li><li>Event &#8211; a race (10K, marathon, triathlon, etc) that a member is training for</li><li>Team &#8211; a group of members</li></ul><p>I can see from these stories that the application will need to be able deliver certain functionality that I haven&#8217;t yet implemented in MVC. Specifically, the application will need to:</p><ol><li>Authenticate individual users and mange their credentials (i.e. a MembershipProvider)</li><li>Manage access to functionality based on membership (i.e. a MembershipProvider)</li><li>Manage access to functionality based on the user&#8217;s relationship (i.e. &#8220;owner&#8221;, or &#8220;teammate&#8221;) to a particular entity (workout, member, team, etc)</li><li>Manage access to functionality based on roles (i.e. a RoleProvider)</li><li>Return content in multiple formats (HTML, rss, iCal???)</li></ol><p>That all looks like pretty vanilla stuff for a WebForms application, but I&#8217;ll have to convince myself that it will all work out in the MVC world.  So it&#8217;s time to write some proof of concept code to convince myself I won&#8217;t get stuck.</p><p>Stay tuned&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://www.tomwayson.com/2008/11/14/myjoglognet-iteration-2-user-stories/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>