<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Dan Carroll | Blog</title>
        <link href="http://dancarroll.org/feeds/latest/" rel="self" />
    
        <link href="http://dancarroll.org" />
    
        
    <updated>2013-04-04T23:30:01Z</updated>

    <id>http://dancarroll.org/feeds/latest/</id>

                    
<entry>
    <title type="html">PAX East 2013</title>
    <author><name>Dan Carroll</name></author>
    <link href="http://dancarroll.org/blog/2013/04/pax-east/"/>
    <updated>2013-04-04T23:30:00Z</updated>
    <published>2013-04-04T23:30:00Z</published>
    <id>http://dancarroll.org/blog/2013/04/pax-east/</id>

    <content type="html">
        &lt;p&gt;I wanted to write a quick post with some general impressions from my time at the 2013 edition of &lt;a href=&#34;http://east.paxsite.com/&#34;&gt;PAX East&lt;/a&gt;. I&#39;ve been attending PAX since 2008, but this was just my second year at the East coast version.  I also only went for a single day, which greatly limits the amount of stuff you can see on the convention floor.&lt;/p&gt;
&lt;h2 id=&#34;the-venue&#34;&gt;The venue&lt;/h2&gt;
&lt;p&gt;PAX East is held at the &lt;a href=&#34;http://www.advantageboston.com/bcec.aspx&#34;&gt;Boston Convention &amp;amp; Exhibition Center&lt;/a&gt;, and is the perfect location for this type of event.  The building has a ton of space, and can easily handle the number of people that attend.  It doesn&#39;t have the wacky charm that the Washington State Convention Center has (the site of PAX Prime), but I&#39;ll take the elbow room over charm any day.&lt;/p&gt;
&lt;h2 id=&#34;the-games&#34;&gt;The games&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Battleblock Theater&lt;/strong&gt;: I first saw this game back at PAX Prime in 2009, before it had a name.  I&#39;ve watched it closely since then, following its progression over the years. The game finally released today, and it seems to have benefited from the extra polish.  I hope it can captivate me the same way Castle Crashers did, and I look forward to seeing what&#39;s next for &lt;a href=&#34;http://www.thebehemoth.com/&#34;&gt;The Behemoth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nutjitsu&lt;/strong&gt;: This was a brand new game from &lt;a href=&#34;http://www.ninjabee.com/&#34;&gt;Ninjabee&lt;/a&gt;.  In its current state, it is a simple path building and stealth game built for tablets, with a fun art style and main character.  I&#39;m a big fan of their Kefling series of games, so I&#39;m looking forward to playing this when it gets released.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perspective&lt;/strong&gt;: This game was one of the games playable at the Digipen booth, as it was a &lt;a href=&#34;https://www.digipen.edu/?id=1170&amp;amp;proj=25930&#34;&gt;student project&lt;/a&gt;.  It&#39;s an excellent platformer that makes very clever use out of the interaction between 2D and 3D space.  I highly recommend checking it out, as well as some of the other Digipen games from recent years.&lt;/p&gt;
&lt;h2 id=&#34;the-talks&#34;&gt;The talks&lt;/h2&gt;
&lt;p&gt;Beyond playing new games, I really enjoy PAX for the variety of industry talks and panels that are held.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mass Effect Retrospective&lt;/strong&gt;: This panel had a number of designers, writers, and even a voice actor from the Mass Effect series of games.  I had envisioned fans with pitchforks, still angry about the ending of &lt;em&gt;Mass Effect 3&lt;/em&gt;, but the panel ended up being mostly fluff and softball questions.  It was still nice to hear some background information over various bits of the development process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Classic Videogame Panel&lt;/strong&gt;: This panel was hosted by &lt;a href=&#34;http://classicarcademuseum.org/index.html&#34;&gt;ACAM&lt;/a&gt;, who also have a classic arcade game room at PAX East.  They hosted a similar panel last year, with a number of the same panelists, but that didn&#39;t dampen my enthusiasm.  I have no problem listening to those guys share stories and talk about what it was like to develop videogames back in the 80s.&lt;/p&gt;    </content>
</entry>


                    
<entry>
    <title type="html">Configuring No-WWW for IIS on Azure</title>
    <author><name>Dan Carroll</name></author>
    <link href="http://dancarroll.org/blog/2013/03/iis-no-www/"/>
    <updated>2013-03-22T00:45:00Z</updated>
    <published>2013-03-22T00:45:00Z</published>
    <id>http://dancarroll.org/blog/2013/03/iis-no-www/</id>

    <content type="html">
        &lt;p&gt;As part of the rollout of my site redesign, I&#39;ve also switched hosts from &lt;a href=&#34;http://www.webfaction.com/&#34;&gt;WebFaction&lt;/a&gt; to &lt;a href=&#34;http://www.windowsazure.com/&#34;&gt;Windows Azure&lt;/a&gt;.  WebFaction was a great value for a shared host, and I&#39;ll probably continue to use it in the future for small Python/Django projects, but I&#39;ve been experimenting with Azure on some other projects and took the opportunity to make the switch.&lt;/p&gt;
&lt;h2 id=&#34;whered-my-htaccess-go&#34;&gt;Where&#39;d my .htaccess go?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://www.windowsazure.com/en-us/home/features/web-sites/&#34;&gt;Azure Web Sites&lt;/a&gt; use IIS as a web server, not the more common Apache (or Nginx) server widely used across the Unix world.  While Azure handles all of the server setup and maintenance for many cases, you&#39;ll still need to get your hands dirty if you need custom handling.&lt;/p&gt;
&lt;p&gt;One of the big behaviors I needed to maintain in the migration was to continue adherence to the &lt;a href=&#34;http://no-www.org/&#34;&gt;No-WWW philosophy&lt;/a&gt;.  This means making dancarroll.org the canonical name of my site, with www.dancarroll.org redirecting to the no-www version.&lt;/p&gt;
&lt;p&gt;I had this set up on the previous iteration of the site using an Apache .htaccess file.  It was very easy to find examples of how to do this across the web.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;nb&#34;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;On&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;RewriteBase&lt;/span&gt; /
&lt;span class=&#34;nb&#34;&gt;RewriteCond&lt;/span&gt; %{HTTP_HOST} ^www\.(.+)$ [NC]
&lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^(.*)$ http://%1/$1 [R=permanent,L]
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;IIS, however, does not use .htaccess files.  Instead, I needed to create a &lt;a href=&#34;http://en.wikipedia.org/wiki/Web.config&#34;&gt;Web.config&lt;/a&gt; file with the appropriate settings.&lt;/p&gt;
&lt;h2 id=&#34;iis-url-rewrite&#34;&gt;IIS URL Rewrite&lt;/h2&gt;
&lt;p&gt;Luckily, IIS has its own &lt;a href=&#34;http://www.iis.net/downloads/microsoft/url-rewrite&#34;&gt;URL rewriting module&lt;/a&gt;.  And, even luckier, Azure Web Sites get this module configured automatically.&lt;/p&gt;
&lt;p&gt;To get this set up, you need to create a file named &lt;code&gt;Web.config&lt;/code&gt; in the wwwroot directory of your Azure deployment.  I was only able to find a few examples of doing no-www redirects for IIS, but all of them hardcoded the domain name in the file.  This wasn&#39;t acceptable, as I like to reduce maintenance and use a similar configuration across many different web sites.&lt;/p&gt;
&lt;p&gt;Here&#39;s what I came up with:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;system.webServer&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;rewrite&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;nt&#34;&gt;&amp;lt;rules&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;rule&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Canonical Hostname&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stopProcessing=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;(.*)&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class=&#34;nt&#34;&gt;&amp;lt;conditions&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;logicalGrouping=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MatchAll&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;trackAllCaptures=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&#34;nt&#34;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;input=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;{HTTP_HOST}&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;pattern=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;^(www\.)(.*)$&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class=&#34;nt&#34;&gt;&amp;lt;/conditions&amp;gt;&lt;/span&gt;
          &lt;span class=&#34;nt&#34;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Redirect&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;http://{C:2}{REQUEST_URI}&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;redirectType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Permanent&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;nt&#34;&gt;&amp;lt;/rules&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/rewrite&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/system.webServer&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And that&#39;s it!  I found that Azure would recognize the file modification and start using it, but you may need to manually restart the site using the Azure management portal.&lt;/p&gt;
&lt;h2 id=&#34;breaking-it-down&#34;&gt;Breaking it down&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference&#34;&gt;documentation for IIS URL Rewrite&lt;/a&gt; is decent, but I wanted to provide a few quick notes about what is going on here.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;(.*)&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;conditions&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;logicalGrouping=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MatchAll&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;trackAllCaptures=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;add&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;input=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;{HTTP_HOST}&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;pattern=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;^(www\.)(.*)$&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/conditions&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;match&lt;/code&gt; element defines the pattern that will be used to find URLs to be processed.  In this case, the regular expression used captures all URLs.  A condition is then created to provide additional refinement to which URLs will have a rewrite action taken.  Here, the condition only looks at the server variable &lt;code&gt;HTTP_HOST&lt;/code&gt;, which requires matching the &lt;em&gt;host domain&lt;/em&gt; (not the full URL).  The regular expression used only matches hosts starting with &lt;code&gt;www.&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Redirect&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;http://{C:2}{REQUEST_URI}&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;redirectType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Permanent&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If there was a successful match, then an action is taken for that particular URL.  In this case, the action is a redirect, with the &#34;Permanent&#34; &lt;code&gt;redirectType&lt;/code&gt; mapping to an HTTP 301 status code.  The &lt;code&gt;url&lt;/code&gt; attribute defines the redirect URL, and I&#39;m using two features here to generate it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{C:2}&lt;/code&gt; is a back-reference, which as its name implies, refers back to data captured previously in the rule.  The &lt;code&gt;C&lt;/code&gt; states that we are referring to something captured by a condition (as opposed to the rule match), and the &lt;code&gt;2&lt;/code&gt; is the second group match (0 is the full pattern, 1 is the &lt;code&gt;www.&lt;/code&gt; part, and 2 is the remainder of the host).&lt;/p&gt;
&lt;p&gt;Finally, &lt;code&gt;{REQUEST_URI}&lt;/code&gt; is a another server variable that IIS lets us reference, and it contains the full path to the requested document.  If the URL is &lt;code&gt;http://www.dancarroll.org/blog/&lt;/code&gt;, then &lt;code&gt;REQUEST_URI&lt;/code&gt; is &lt;code&gt;/blog/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;bonus-rules&#34;&gt;Bonus Rules&lt;/h2&gt;
&lt;p&gt;A couple of extra URL rewrite rules I am using that are worth sharing.&lt;/p&gt;
&lt;h3 id=&#34;forcing-lowercase-urls&#34;&gt;Forcing lowercase URLs&lt;/h3&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;rule&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Convert to lower case&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stopProcessing=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;  
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;.*[A-Z].*&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;ignoreCase=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;  
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Redirect&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;{ToLower:{R:0}}&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;redirectType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Permanent&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id=&#34;redirecting-default-documents&#34;&gt;Redirecting default documents&lt;/h3&gt;
&lt;p&gt;For default documents (i.e. index.html), it is nice to redirect a request to &lt;code&gt;domain.com\dir\index.html&lt;/code&gt; to its parent directory, &lt;code&gt;domain.com\dir\&lt;/code&gt;.  This also help to ensure there is only a single canonical name for any document.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;rule&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Default document - html&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stopProcessing=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;(.*)index.html&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;nt&#34;&gt;&amp;lt;action&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Redirect&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;url=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;{R:1}&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;redirectType=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Permanent&amp;quot;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;    </content>
</entry>


                    
<entry>
    <title type="html">Redesign</title>
    <author><name>Dan Carroll</name></author>
    <link href="http://dancarroll.org/blog/2013/03/redesign/"/>
    <updated>2013-03-16T22:38:05Z</updated>
    <published>2013-03-16T22:38:05Z</published>
    <id>http://dancarroll.org/blog/2013/03/redesign/</id>

    <content type="html">
        &lt;p&gt;This site has been quiet for a long time.  My last post was over a year ago in February 2012.  That post before that was yet another year prior.  With a full-time job and other personal commitments, blog posting and other side projects easily fall off the radar.&lt;/p&gt;
&lt;p&gt;Take my site&#39;s new design, rolling out today.  I initially started working on it in February 2011, going by the file creation timestamps on my machine.  I worked on it for a week or so, got some feedback, then dropped it.  A year later, I took the big step to actually create a source repository on &lt;a href=&#34;https://bitbucket.org/&#34;&gt;Bitbucket&lt;/a&gt; to make sure the code was backed up somewhere safe (I don&#39;t recall making any other progress at the time).&lt;/p&gt;
&lt;p&gt;It took me over a year from that point to actually pick up the project and push it through to completion.&lt;/p&gt;
&lt;h2 id=&#34;the-design&#34;&gt;The design&lt;/h2&gt;
&lt;p&gt;Like the previous design of my site, I have taken a lot of inspiration from people in the &lt;a href=&#34;http://www.djangoproject.com/&#34;&gt;Django&lt;/a&gt; community.  A lot of the design inspiration comes from &lt;a href=&#34;http://stevelosh.com/&#34;&gt;Steve Losh&lt;/a&gt;, who has consistently done an excellent job at clean, readable web design.&lt;/p&gt;
&lt;p&gt;I&#39;m not sure what I was thinking with the previous iteration, which featured orange and beige on a darker, almost navy blue background.  That&#39;s been fixed now!&lt;/p&gt;
&lt;h2 id=&#34;the-code&#34;&gt;The code&lt;/h2&gt;
&lt;p&gt;Like Steve, I also made a transition in how the site is implemented.  Previously, my site was developed using Django.  Django is a Python-powered web framework, and it gave me tremendous flexibility to add features like a &lt;a href=&#34;http://en.wikipedia.org/wiki/Lifestreaming&#34;&gt;lifestream&lt;/a&gt;.  However, it came with a lot of overhead for a simple blog, and could be unreliable on inexpensive, shared web servers.&lt;/p&gt;
&lt;p&gt;This new iteration of the site is built using &lt;a href=&#34;https://github.com/hyde/hyde&#34;&gt;Hyde&lt;/a&gt;, a static web site generator built in Python.  Hyde allows me to work with Python code and templating languages, much like the one used with Django, but the end result is a static HTML and CSS website (rather than a dynamic site backed by executing Python code and databases).  The end product can now be hosted anywhere with relatively good performance.&lt;/p&gt;
&lt;p&gt;And like the previous iteration, the new version is still open source.  For ease of browsing both implementations, the new design lives in a &lt;a href=&#34;https://bitbucket.org/dancarroll/dancarrollorg_hyde&#34;&gt;separate code repository on Bitbucket&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-problems&#34;&gt;The problems&lt;/h2&gt;
&lt;p&gt;Another big improvement made during this transition is in ease of use and maintainability for me.  Previously, I tried a few different ways of creating blog posts.  First, I tried writing HTML each time I needed to create a new post, and uploaded it using Django&#39;s admin UI.  This was a pain and prone to rendering issues.&lt;/p&gt;
&lt;p&gt;Next, I spent a lot of time implementing support for the &lt;a href=&#34;http://en.wikipedia.org/wiki/MetaWeblog&#34;&gt;MetaWeblog API&lt;/a&gt;, which allowed me to create blog posts using applications like &lt;a href=&#34;http://en.wikipedia.org/wiki/Windows_Live_Writer&#34;&gt;Windows Live Writer&lt;/a&gt;. That made post creation much easier for me, but those blogging applications would create ugly HTML with their own special markup, and often required tweaking the HTML by hand to get things to show up correctly.&lt;/p&gt;
&lt;p&gt;Finally, regardless of how I created posts, they ended up being saved to a database on my web host. That&#39;s not a very safe location, so I needed to make sure to create regular backups.&lt;/p&gt;
&lt;h2 id=&#34;the-solutions&#34;&gt;The solutions&lt;/h2&gt;
&lt;p&gt;With Hyde, it was easy to convert all of my blog posts to be written in &lt;a href=&#34;http://en.wikipedia.org/wiki/Markdown&#34;&gt;Markdown&lt;/a&gt;.  When generating the site, the posts get passed through a Markdown filter to convert them to HTML.  As long as I have good CSS defined on how to render what HTML gets produced, I can create a blog post using a simple text editor and know that it will come out looking good on the other side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aside:&lt;/strong&gt; Django has built-in support for Markdown, so I could have used it with the site&#39;s previous implementation.  However, things would have been more complicated.  There would be performance issues if posts were passed through the Markdown filter for each web request, deployment complexity if I needed to leverage server-side caching, or implementation complexity if both versions were stored (Markdown version for editing, HTML version for serving up web requests).&lt;/p&gt;
&lt;p&gt;For the issue of storing and backing up blog posts, content is now part of the codebase itself.  It gets pushed up to Bitbucket, and lives on a few different machines where I have the code checked out.&lt;/p&gt;
&lt;h2 id=&#34;the-future&#34;&gt;The future&lt;/h2&gt;
&lt;p&gt;I feel very accomplished for finally completing this major redesign project, so I hope to actually use this thing more often.  I&#39;ll never be prolific, but my goal is to publish at least several posts a year.&lt;/p&gt;    </content>
</entry>


                    
<entry>
    <title type="html">Caveat about WP7 Live Tiles without cellular data</title>
    <author><name>Dan Carroll</name></author>
    <link href="http://dancarroll.org/blog/2012/02/live-tiles-without-cellular-data/"/>
    <updated>2012-02-14T14:23:53Z</updated>
    <published>2012-02-14T14:23:53Z</published>
    <id>http://dancarroll.org/blog/2012/02/live-tiles-without-cellular-data/</id>

    <content type="html">
        &lt;p&gt;I have owned and used a Windows Phone since they were introduced in late 2010.  While I am currently a Microsoft employee, I do love the device as a consumer.  I previously used an iPhone 3G and have not had an desire to go back to that world.  The biggest downside is missing out on some of the big iOS apps, especially games, but the overall experience WP7 provides with improved email, people, and information management has made up for the loss.&lt;/p&gt;
&lt;p&gt;While I&#39;ve owned one for a while, I hadn&#39;t had much of an opportunity to develop apps.  As a former iPhone user, I wanted to jump into iOS app development, but was not able to since the development tools were only available on a Mac.  I finally made the commitment and jumped into the mobile development world.  For the past month and a half, I have been using my spare coding time working on Windows Phone development.  Hopefully I will get the chance to blog about my experience, along with tips and tricks.&lt;/p&gt;
&lt;h2 id=&#34;meet-wi-fi-the-battery-hog&#34;&gt;Meet Wi-Fi, the battery hog&lt;/h2&gt;
&lt;p&gt;One interesting &#34;feature&#34; of WP7 aims to save gobs of battery life. Whenever the screen is locked, the OS will turn off any active Wi-Fi connection (unless it is being used to stream music/video or download something in the background).  I&#39;m sure this feature is great for battery savings, but it does have one interesting implication that recently hit me.&lt;/p&gt;
&lt;p&gt;I have a second phone I just acquired to use for testing my apps.  I only have a single cell phone plan for my main phone, and the second phone connects using Wi-Fi only.  One of my apps uses a background agent to download information and update a live tile.  The live tile will not get updated, since the background agent has no connection to use when the screen is locked (as Wi-Fi is disabled).&lt;/p&gt;
&lt;p&gt;The workaround?  Plug your phone in.  Wi-Fi connectivity stays active when the phone is plugged in, regardless of whether the screen is locked.&lt;/p&gt;
&lt;p&gt;It would be nice if there was an option to disable this feature, since Windows Phone loses functionality if you don&#39;t have a cellular data plan.  There is a &lt;a href=&#34;http://windowsphone.uservoice.com/forums/101801-feature-suggestions/suggestions/2282561-add-option-to-keep-wifi-alive-while-the-phone-is-l&#34;&gt;suggestion on the WP7 UserVoice forum to add that option&lt;/a&gt;, in case you want to go vote for it.&lt;/p&gt;
&lt;p&gt;Update (2013-02-27): Windows Phone 8 includes an option to keep Wi-Fi alive when the screen is off.&lt;/p&gt;    </content>
</entry>


                    
<entry>
    <title type="html">Announcing django-activitysync</title>
    <author><name>Dan Carroll</name></author>
    <link href="http://dancarroll.org/blog/2011/02/announcing-django-activitysync/"/>
    <updated>2011-02-15T23:25:46Z</updated>
    <published>2011-02-15T23:25:46Z</published>
    <id>http://dancarroll.org/blog/2011/02/announcing-django-activitysync/</id>

    <content type="html">
        &lt;p&gt;Today I&#39;m happy to announce the release of my first reusable Django app, &lt;a href=&#34;http://pypi.python.org/pypi/django-activitysync/&amp;quot;&amp;gt;django-activitysync&#34;&gt;django-activitysync&lt;/a&gt;. The app allows easy integration of social network activities and status updates into Django projects. I&#39;ve been using it to power the activity section of this website for the past year and have been eager to decouple it into a separate application.&lt;/p&gt;
&lt;h2 id=&#34;what-it-provides&#34;&gt;What it provides&lt;/h2&gt;
&lt;p&gt;Django-activitysync can provide functionality similar to other &lt;a href=&#34;http://en.wikipedia.org/wiki/Lifestreaming&#34;&gt;lifestream&lt;/a&gt; solutions, but its real power is as an extensible framework for aggregating, storing, and displaying any type of simple item. It currently provides built-in support for Twitter status items, Twitter searches, Google Reader shared items, and Reddit liked items.&lt;/p&gt;
&lt;p&gt;Adding support for a new network or activity type is as simple as implementing a new activity provider. Providers consist of 5 functions, one of which returns a list of simple objects containing the activity detail. Django-activitysync takes care of storage and duplicate detection.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;How to use it&lt;/h2&gt;
&lt;p&gt;Django-activitysync is available as an installable Python package &lt;a href=&#34;http://pypi.python.org/pypi/django-activitysync/&#34;&gt;on PyPI&lt;/a&gt;. You will also find detailed documentation there on installation, configuration, and use. The source code itself is also available in a &lt;a href=&#34;https://bitbucket.org/dancarroll/django-activitysync/src&#34;&gt;Bitbucket repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;future-plans&#34;&gt;Future plans&lt;/h2&gt;
&lt;p&gt;This announcement marks the initial release of django-activitysync. I plan to continue supporting it with additional features, new social networks, and bug fixes. Feel free to open issues on the Bitbucket repository if you encounter bugs or have feature suggestions.&lt;/p&gt;    </content>
</entry>


            </feed>