<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Tales from a JavaScript Developer]]></title>
  <link href="http://drewwells.net/blog/atom.xml" rel="self"/>
  <link href="http://drewwells.net/blog/"/>
  <updated>2012-05-04T08:16:38-05:00</updated>
  <id>http://drewwells.net/blog/</id>
  <author>
    <name><![CDATA[Drew Wells]]></name>
    <email><![CDATA[drewwells00@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[New job]]></title>
    <link href="http://drewwells.net/blog/2011/new-job/"/>
    <updated>2011-12-30T11:42:00-06:00</updated>
    <id>http://drewwells.net/blog/2011/new-job</id>
    <content type="html"><![CDATA[<p>I started a new job and haven&#8217;t had much time to update the blog or various github projects.  Well actually I&#8217;ve had plenty of time to update these, but I haven&#8217;t due to major data loss with my SSD.</p>

<p>As part of the job move, I have also relocated to Austin, TX.  It&#8217;s been a pretty stressful move, but everything is in it&#8217;s place now and I&#8217;m back on track running regularly.  Hopefully, I will be in great shape prior to the 115F summers here.</p>

<p>I have decided this year I will learn Erlang.  I will be somewhat starting over thanks to the SSD failure.  Going to a strict functional language is quite interesting.  I also end up spending hours and hours just to write 2 lines of code.  Erlang is pretty good at doing a lot of amazing things in just two lines of code, but it does take a while to get there.</p>

<p>Octopress has become very difficult to manage, I would have updated this sooner if I was still on Wordpress.</p>

<p>Peace out</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting More]]></title>
    <link href="http://drewwells.net/blog/2011/getting-more/"/>
    <updated>2011-10-12T20:49:00-05:00</updated>
    <id>http://drewwells.net/blog/2011/getting-more</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been reading a book lately, okay that&#8217;s a lie.  I fell for the Audible trap and have been listening to a few audio books lately mostly while driving in a car.
The book in particular is <a href="http://www.amazon.com/Getting-More-Negotiate-Achieve-Goals/dp/0307716899/ref=sr_1_1?ie=UTF8&amp;qid=1318467250&amp;sr=8-1">Getting More</a>.</p>

<p>Audible is great, especially if your family and girlfriend are a three to five hour drive away depending on Atlanta traffic and if there is a <a href="http://www.i75highway.com/">Knoxville/Florida</a> game that weekend.  My only beef with listening books instead of reading them is the time involved.  Even the slowest readers can get through a book much faster than the artful narrations these Audio books are read as.</p>

<p>I mostly read technical books, so I will talk about it in terms of what I understand.  I would call this book a cookbook for effectively communicating your desires to others.  For those unaware, a cookbook is the opposite of a technical reference that exhaustively enumerates every facet of a topic.  A cookbook tries to come up with an extensive list of problems you may encounter and provides solutions to those problems.</p>

<p>Take for instance a cookbook on kitchen disasters.  It may go something like this.</p>

<p><strong>Problem:</strong>
You burned the cookies.  They are dark brown but not black</p>

<p><strong>Solution:</strong>
Serve the cookies with milk and nobody will notice the difference.</p>

<p>The key part of books is organization.  People will buy these books then refer to them over and over, so you want to make it easy for them to find what they are looking for.  On this part, the author does an excellent job separating the topics into very descriptive categories, he understands pronouns and being vague are poisonous to <a href="http://www.amazon.com/Getting-More-Negotiate-Achieve-Goals/dp/0307716899/ref=sr_1_1?ie=UTF8&amp;qid=1318467250&amp;sr=8-1">Getting More</a>.  He has sections for work, getting hired, children, sales, and business situations.</p>

<p>I would also applaud his ability for effectively illustrating techniques for <a href="http://www.amazon.com/Getting-More-Negotiate-Achieve-Goals/dp/0307716899/ref=sr_1_1?ie=UTF8&amp;qid=1318467250&amp;sr=8-1">Getting More</a>.  The entire book could be shortened to this.</p>

<ul>
<li>Don&#8217;t assume, listen</li>
<li>Be incremental</li>
<li>Role reversal</li>
<li>Framing</li>
<li>Trading things of unequal value</li>
</ul>


<p>The one you may not be familiar with is <em>framing</em>.  Let&#8217;s say you wish your girlfriend would support you in you exercise routines by participating.  From her point of view, she doesn&#8217;t like to exercise or to be outdoors.  You tell her that running together will help us reach our mutual goals of us spending more quality time together (and you losing some weight).</p>

<p>Let&#8217;s say this isn&#8217;t enough for her to justify the energy expenditure.  You can use <em>framing</em>.  Explain to her that her commitment to run with you on a regular basis will show that she is able to keep committments.  In return, he will be more likely to commit to her.</p>

<p>If this still isn&#8217;t enough, we can use <em>trading things of unequal value</em>.  She supports you in your exercise routines, and you support her with some fancy jewelry that she has been wanting.</p>

<p>From this point of view, how could she <em>NOT</em> agree that running together is a mutually beneficial thing?</p>

<p>He has many other methods for when these techniques are not enough, in my opinion they are borderline bribery, taking advantage or plain abuse of skills.  He talks extensively to defend those techniques on how they were used, and why they are mutually beneficial.  He obviously is naturally very persuasive, and be prepared to have these themes repeated many timesover.  Each and every one of us has trouble listening, so repetition is key to learning the topics in the book.</p>

<p><strong>Conclusion</strong></p>

<p>I have unfortunately not used the skills in this book effectively.  He will remind you over and over that the keys to Getting More is to practice Getting More.  So I endeavour to practice these skills, and serve myself better by <a href="http://www.amazon.com/Getting-More-Negotiate-Achieve-Goals/dp/0307716899/ref=sr_1_1?ie=UTF8&amp;qid=1318467250&amp;sr=8-1">Getting More</a> myself.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My adventures into WebGL]]></title>
    <link href="http://drewwells.net/blog/2011/my-adventures-into-webgl/"/>
    <updated>2011-09-30T00:04:49-05:00</updated>
    <id>http://drewwells.net/blog/2011/my-adventures-into-webgl</id>
    <content type="html"><![CDATA[<p>So I have been pretty busy trying to get into WebGL.  It is easily the best way to have a bad time in programming right now.  The combination of experimental browser support, bad linux drivers, and JavaScript&#8217;s direct mapping to very old C code made it quite difficult.</p>

<p>I started by looking at a <a href="http://learningwebgl.com/blog/?page_id=1217">Learning WebGL</a>.  I 100% recommend this especially if you are unfamiliar with the domain.  Why would you keep reading this if you weren&#8217;t?  If you go through these lessons copy/pasting code, you will think this is simple.  However, the first thing I tried was tweaking things.</p>

<p>Who wants a pyramid?  I made a triangle cube.
Who wants a cube with solid color sides?  So, I made a cube with blending (gradients).</p>

<p>The first thing I noticed, you ever heard of perma-death games?  One typo, one vertex without a color and the whole thing fails to load.  There&#8217;s no 1%, 50%, or even 99% working it&#8217;s all or nothing.  So, much of my time was debugging the tiniest details of my application.</p>

<p>One time, I spent two hours drawing and staring of my 3d object on a piece of paper.  It actually didn&#8217;t help at all, the real problem was totally unrelated.  I think maybe paper helps those people either with super complex or super simple problems.  Mine was a problem of misunderstanding so staring at a 3d model on a 2d piece of paper did not help me.</p>

<p>So I will go into the most basic details here.  What is WebGL and why is canvas so much better?  Let&#8217;s say I want to draw a square.</p>

<p>I define my 4 points and tell OpenGL to go draw it.  OpenGL says go fly a kite.  OpenGL only understands triangles.  There are two ways to do this.  A triangle for every 3 vertices (gl.TRIANGLES), or one triangle, then every subsequent point forms a new triangle (gl.TRIANGLE_STRIP).  Obviously, the second one is ideal as it is far more efficient on the GPU to reuse existing vertices.  However, if you use the strip it will treat every new point as the foundation of the next triangle.  This can cause significant problems if you want to connect vertex 3 to vertext 7 and 8.  You can get some really crazy shapes that made my brain hurt looking at them.</p>

<p>Next post, I will start getting into the code behind <a href="http://drewwells.github.com/webglfu/graph.html">Graph 3d</a> and try to justify the few dozen hours I lost working on it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[jodoc-js]]></title>
    <link href="http://drewwells.net/blog/2011/jodoc-js/"/>
    <updated>2011-09-22T15:42:02-05:00</updated>
    <id>http://drewwells.net/blog/2011/jodoc-js</id>
    <content type="html"><![CDATA[<p>So it&#8217;s about time to post an update on things I&#8217;m working on lately which have been a lot, just look at my github feed: https://github.com/drewwells</p>

<p>Today I want to talk a bit about the documentation framework we are now using at work. It&#8217;s rather fantastic and based on a python implementation: https://github.com/davebalmer/joDoc.  It hasn&#8217;t been updated at all this year, but azakus has ported the whole thing to NodeJS!</p>

<p>The idea is quite simple, take markdown based comments in your JavaScript file and throw them into a web page. How hard was that? No complicated syntax, no huge comment blocks to facilitate special formatting. KISS.</p>

<p>So!</p>

<h3>What does this thing do, and why should you care?</h3>

<p>First off markdown knowledge would be good to know. You have two paths here</p>

<p>I know markdown, but rusty on syntax <a href="http://drewwells.github.com/showdown/example/">Try my demo</a>
I don&#8217;t know markdown give me the <a href="http://daringfireball.net/projects/markdown/">Full details</a></p>

<p>Sample JavaScript file</p>

<p>file.js</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"># file.js</span>
</span><span class='line'><span class="cm">Some information about the file.  The h1 above is</span>
</span><span class='line'><span class="cm">## main</span>
</span><span class='line'>
</span><span class='line'><span class="cm">Hey what is this, C code?</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">return</span> <span class="s1">&#39;I am not C code, see &#39;</span> <span class="o">+</span> <span class="mi">5</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, thanks to the /** part you will get a big h1 tag with &#8216;file.js&#8217; which also acts as the index.  Anywhere you link to [file.js] now links to the html page created for file.js.</p>

<p>There are two forms created, single file where links use hash tags to find documentation, or multi page where each html page is run through a template and an entire page with header links is provided.</p>

<p>Fring features: I have been adding cool features to it which can be found in &#8216;joapp-experiment&#8217;.  I&#8217;m working with the owner to get these integrated into his repository.</p>

<h3>File based configuration</h3>


<p>Currently, you must maintain complicated command line scripts to use it.  Why must it be so?  It&#8217;s great to put these in a build tool, but sometimes you want to set it and forget it.  So I have implemented via &#8216;require()&#8217;, Node 0.3.0+ I think, to require a separate file.  This is cool, because those files can require other files say to provide a dist and a dev version of your docs &lt;3 require().</p>

<p>I made a pull request for this feature on 9/8 and here it is 2 weeks later without even a comment: https://github.com/azakus/jodoc-js/pull/10. It includes a demo since I properly commented jodoeJS itself to dogfood and provide an easy demo for others.  There are notes on how to use this in the README.</p>

<h3>Serve the docs via NodeJS as a web page</h3>


<p>It&#8217;s cool that the docs run in NodeJS b/c they are sub second fast.  But why do I need to run a build command to get them going?  Can&#8217;t NodeJS serve to a browser instead?  The answer is Yes it can.  So I wrote a small web server inside the app.  It has no dependencies, so it&#8217;s very simple and dumb.  I had to add proper mime-types for picky browsers like Chrome.</p>

<p>As the HTML is created, it is sent to the browser by hitting the URL in your browser.  It can also serve the files created on disk, but way less cool.  Oh did I mention, it will reparse all your source files before doing so?  So, if you are actively writing documentation just hit refresh to see your changes.  It couldn&#8217;t be simpler.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Testing for optional false params in JavaScript]]></title>
    <link href="http://drewwells.net/blog/2011/testing-for-optional-false-params-in-javascript/"/>
    <updated>2011-08-08T15:10:30-05:00</updated>
    <id>http://drewwells.net/blog/2011/testing-for-optional-false-params-in-javascript</id>
    <content type="html"><![CDATA[<p>Sounds like a silly thing, but sometimes you want optional false parameters.  If for nothing else than to make your parameters human readable, not just syntactically convenient.</p>

<p>So let&#8217;s start out:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//blur: false</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="o">!</span><span class="nx">config</span><span class="p">.</span><span class="nx">blur</span> <span class="c1">//Oh noes reports true</span>
</span></code></pre></td></tr></table></div></figure>


<p>The trick here is to detect whether the variable is undefined, then for it&#8217;s truthy value.  Fixed implementation:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="k">if</span><span class="p">(</span> <span class="o">!</span><span class="nx">config</span><span class="p">.</span><span class="nx">blur</span> <span class="o">===</span> <span class="kc">false</span> <span class="p">){</span>
</span><span class='line'>  <span class="c1">//Won&#39;t execute</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">config</span><span class="p">.</span><span class="nx">blur</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span> <span class="nx">config</span><span class="p">.</span><span class="nx">blur</span> <span class="o">===</span> <span class="kc">false</span> <span class="p">){</span>
</span><span class='line'>  <span class="c1">//Will execute</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pretty cool huh?  Test with if/else structures or you will get errors.</p>

<p><em>Update:</em>
Thanks <a href="http://drewwells.net/blog/2011/testing-for-optional-false-params-in-javascript/#comment-339580774">Toby</a> for that one</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Github]]></title>
    <link href="http://drewwells.net/blog/2011/github/"/>
    <updated>2011-07-19T21:04:35-05:00</updated>
    <id>http://drewwells.net/blog/2011/github</id>
    <content type="html"><![CDATA[<p>As someone that isn&#8217;t afraid to get his hands dirty, I find Github to be a god send.  It really makes coding a dream, and it makes collaborative coding amazingly easy.</p>

<p>The current project I&#8217;m working on involves nearly a dozen libraries.  There&#8217;s a huge difference between those on Github and those hosted else where.  For one, the code hosted else where just sits in my lib directory.  I make modifications to it and commit to our internal version control system (Perforce).  If I want to commit those back it nearly always ends up being an arduous process of building diff files and going through a multi-week issue/communication with an author.</p>

<p>Now flip over to Github, let&#8217;s say there&#8217;s a minor issue with a particular feature.  I open an issue and the author is notified via email.  The next day that feature may get fixed.  Even if it isn&#8217;t, I fork the code base and make my own.  That&#8217;s how my dashboard is now almost  <a href="http://github.com/drewwells">30 repositories full</a>.  I have no qualms getting in there and hacking away at some things.  More often than not I learn 10 things for every one I bring to the table.  It&#8217;s incredibly rewarding and I thank Github for this.</p>

<p>Github provide an amazing service to the world and the betterment of developer kind.  I owe much of my working knowledge to Github committing code, reading code, and learning code from them.</p>

<p>My latest projects include in no particular order:
<a href="http://drewwells.github.com/fonttest/">Fonttest</a> enumerates the 30+ font&#8217;s from the excellent M+ non-web fonts, I&#8217;m working on WOFFing, EOTing them via <a href="http://fontsquirrel.com">FontSquirrel</a>.  This is also my first start at Github Pages, and it is totally amazing as usual.
<a href="http:/drewwells.github.com/jsdoc-js/">jodoc-js</a> This is a port from the amazing jodoc perl library.  It allows standard markdown and scraping of JavaScript of files.  I&#8217;m working to improve the Table of Contents building and automagic link building.  I&#8217;m heavily considering starting fresh with a new repository to reduce some of the technical debt.</p>

<p>On a side note, don&#8217;t you wish you could EMACS the world?  How many times do I ctrl+s, ctrl+b a day in the web browser and end up with some crazy shit going on :(</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HP Pavilion dv6 Quad Edition]]></title>
    <link href="http://drewwells.net/blog/2011/hp-pavilion-dv6-quad-edition/"/>
    <updated>2011-07-03T01:16:03-05:00</updated>
    <id>http://drewwells.net/blog/2011/hp-pavilion-dv6-quad-edition</id>
    <content type="html"><![CDATA[<p>My new laptop is wonderful and great.  It&#8217;s also completely a pos in Ubuntu.  Number one problem is the brightness level in Linux, it&#8217;s always 100% and it can&#8217;t be modified by the keyboard, or even /sys properties.  However, the magical xrandr can fix it.</p>

<p>In integrated graphics mode: use xrandr as so</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">xrandr</span> <span class="o">--</span><span class="nx">output</span> <span class="nx">LVDS1</span> <span class="o">--</span><span class="nx">brightness</span> <span class="mf">0.4</span>
</span></code></pre></td></tr></table></div></figure>


<p>I made a script to use make this a little more automated:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">xrandr</span> <span class="o">--</span><span class="nx">output</span> <span class="nx">LVDS1</span> <span class="o">--</span><span class="nx">brightness</span> <span class="nx">$1</span>
</span></code></pre></td></tr></table></div></figure>


<p>Save it to brightness.sh (no sudo required on my system).</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">.</span><span class="o">/</span><span class="nx">brightness</span><span class="p">.</span><span class="nx">sh</span> <span class="mf">0.7</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Leaflet]]></title>
    <link href="http://drewwells.net/blog/2011/leaflet/"/>
    <updated>2011-05-18T22:48:08-05:00</updated>
    <id>http://drewwells.net/blog/2011/leaflet</id>
    <content type="html"><![CDATA[<p>This is just a quick post, I&#8217;m working on putting together a demo using <a href="http://leaflet.cloudmade.com/">Leaflet</a>.  I&#8217;m curious if it has the necessary features to port Craigmaps to it, then I will finally have something that runs on mobile devices and can find a new place to live on the go!  Anyways, quick demo <a href="http://drewwells.net/leaflet/demo/">here</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SyntaxHighlighter Evolved is broken]]></title>
    <link href="http://drewwells.net/blog/2011/syntaxhighlighter-evolved-is-broken/"/>
    <updated>2011-03-02T18:01:13-06:00</updated>
    <id>http://drewwells.net/blog/2011/syntaxhighlighter-evolved-is-broken</id>
    <content type="html"><![CDATA[<p>I apologize all of the code of my posts now is completely unformatted and missing syntax highlighting.  I have looked into the problem numerous times, and fixed it numerous times.  It usually involves removing and re-adding the plugin or doing other things.  I am now very annoyed there has been no update to the reason syntax highlighter will stop working after a few days, weeks.</p>

<p>I am looking for a new one, preferably one that will not break every couple of days.  I will have to go back through all of my posts and update the syntax to this new highlighter.</p>

<p>Don&#8217;t use this plugin: <a href="http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/">SyntaxHighlighter Evolved</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Craigmaps]]></title>
    <link href="http://drewwells.net/blog/2011/craigmaps/"/>
    <updated>2011-02-05T18:12:40-06:00</updated>
    <id>http://drewwells.net/blog/2011/craigmaps</id>
    <content type="html"><![CDATA[<p>Quick post, I finally got Craigmaps generally stable.  It&#8217;s a huge series of ajax calls on average 150.  This could use some fine tuning or caching.  Try it out <a href="http://drewwells.net/craigmaps/">Craigmaps</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Better know JavaScript - Google Static Map]]></title>
    <link href="http://drewwells.net/blog/2011/better-know-javascript-google-static-map/"/>
    <updated>2011-01-18T20:17:57-06:00</updated>
    <id>http://drewwells.net/blog/2011/better-know-javascript-google-static-map</id>
    <content type="html"><![CDATA[<p>I&#8217;ve decided to start exploring JavaScript &#8211;not frameworks ontop of JavaScript&#8211; in order to better understand what I use but do not understand.  First candidate: <a href="http://www.coldfusionjedi.com/index.cfm/2011/1/5/Creating-map-previews-with-jQuery-and-Googles-Static-Map-API">Creating-map-previews-with-jQuery-and-Googles-Static-Map-API</a></p>

<p>My job is not to directly emulate what is going on in Ray&#8217;s Post, but to explore ways to do this in just JavaScript no pesky script tags above your raw code.  The only tricky part is tracking onkeyup, I refer to <a href="http://www.quirksmode.org/js/keys.html">http://www.quirksmode.org/js/keys.html</a>for browser compliance.</p>

<p>Here she goes!</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="o">&lt;</span><span class="nx">textarea</span> <span class="nx">cols</span><span class="o">=</span><span class="s2">&quot;30&quot;</span> <span class="nx">rows</span><span class="o">=</span><span class="s2">&quot;2&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;address&quot;</span><span class="o">&gt;</span><span class="nx">Type</span> <span class="nx">address</span> <span class="nx">here</span><span class="o">&lt;</span><span class="err">/textarea&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nx">br</span><span class="o">/&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="nx">img</span> <span class="nx">width</span><span class="o">=</span><span class="s2">&quot;400&quot;</span> <span class="nx">height</span><span class="o">=</span><span class="s2">&quot;400&quot;</span> <span class="nx">title</span><span class="o">=</span><span class="s2">&quot;Map!&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;map&quot;</span> <span class="o">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">base</span> <span class="o">=</span> <span class="s2">&quot;http://maps.google.com/maps/api/staticmap?zoom=12&quot;</span> <span class="o">+</span>
</span><span class='line'>    <span class="s2">&quot;&amp;size=400x400&amp;maptype=roadmap&amp;sensor=false&amp;center=&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">map</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;map&quot;</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">area</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;address&quot;</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">virgin</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">area</span><span class="p">.</span><span class="nx">onfocus</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">){</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span> <span class="nx">virgin</span> <span class="p">){</span>  <span class="c1">//Touched for the very first time?</span>
</span><span class='line'>    <span class="nx">virgin</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">area</span><span class="p">.</span><span class="nx">onkeyup</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">){</span>
</span><span class='line'>  <span class="c1">//All sorts of broken things with detecting keycodes,</span>
</span><span class='line'>  <span class="c1">//I&#39;m just looking for value</span>
</span><span class='line'>  <span class="nx">map</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">4</span> <span class="o">?</span> <span class="nx">base</span> <span class="o">+</span> <span class="nx">escape</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">)</span> <span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>However, <a href="http://drewwells.net/demo/static-google-map.html">seeing is believing</a></p>

<p>This should work in all browsers, I don&#8217;t have Windows to test this though :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[NodeJS proxy to simplify IWS API]]></title>
    <link href="http://drewwells.net/blog/2011/nodejs-proxy-to-simplify-iws-api/"/>
    <updated>2011-01-03T12:42:34-06:00</updated>
    <id>http://drewwells.net/blog/2011/nodejs-proxy-to-simplify-iws-api</id>
    <content type="html"><![CDATA[<p>Normally I learn a new platform by painfully doing some file operations in that language.  This is a good way to find out about some of the languages ability to provide synatic sugar atop bad APIs, but a poor way to explore the language.</p>

<p>Fortunately, I found a great use for node js.  Our corporate server technology is very behind on REST.  So I wanted to build a proxy server to convert their API into a RESTful or as RESTful as possible API.</p>

<p>First step was finding a way to create a HTTP proxy.  This can be done with <a href="http://www.catonmat.net/http-proxy-in-nodejs">20 lines of code in Node JS</a>.  However, this is pretty ghetto and I want to do this with a nice API and just one line of code, something like
proxy( port, domain, request, response ).</p>

<p>I found just that here: <a href="https://github.com/nodejitsu/node-http-proxy">https://github.com/nodejitsu/node-http-proxy</a>.</p>

<p>Now, let&#8217;s look at some code</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">),</span>
</span><span class='line'>     <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(),</span>
</span><span class='line'>     <span class="nx">httpProxy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http-proxy&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;/iws/*&quot;</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">proxy</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">httpProxy</span><span class="p">.</span><span class="nx">HttpProxy</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">);</span>
</span><span class='line'>   <span class="nx">proxy</span><span class="p">.</span><span class="nx">proxyRequest</span><span class="p">(</span><span class="mi">80</span><span class="p">,</span> <span class="s1">&#39;iws.erdas.com&#39;</span><span class="p">,</span> <span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will look for requests on /iws/, I&#8217;m using <a href="http://expressjs.com/">express</a> for easier routing, then proxy those to iws.erdas.com.  The requests are automatically sent back to the user.</p>

<p>This isn&#8217;t what I set out to do.  I wanted to simplify the API, so I looked over at ARCGIS REST services and went from there.</p>

<p>So, I will be taking this:</p>

<pre><code>http://iws.erdas.com/ImageX/imagex.dll?image?cache=true&amp;transparent=true
&amp;fill=ffffff&amp;quality=60&amp;type=jpg&amp;l=2&amp;tx=2&amp;ty=1&amp;ts=256&amp;
layers=/sampleiws/images/geodetic/usademo.ecw&amp;srs=EPSG:4326
</code></pre>

<p>and turning it into this:</p>

<pre><code>http://localhost:3000/iws/map/sampleiws/images/geodetic/usademo.ecw/2/2/1/
</code></pre>

<p>Now the how:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="sr">/^\/iws\/map\/?([^?]+)?(.+)?/</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">proxy</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">httpProxy</span><span class="p">.</span><span class="nx">HttpProxy</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">),</span>
</span><span class='line'>  <span class="nx">captures</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span> <span class="sr">/^\/iws\/map\/?([^?]+)?(.+)?/</span> <span class="p">),</span>
</span><span class='line'>        <span class="nx">layer</span> <span class="o">=</span> <span class="p">(</span> <span class="nx">captures</span> <span class="o">&amp;&amp;</span> <span class="nx">captures</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="nx">captures</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">)</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>  <span class="c1">//bug requires prependend /</span>
</span><span class='line'>  <span class="nx">qstring</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">tile</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span> <span class="sr">/\/\d+\/\d+\/\d+\//</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">layer</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">layer</span> <span class="o">=</span> <span class="nx">layer</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\/\d+\/\d+\/\d+\//</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">substr</span><span class="p">,</span> <span class="nx">offset</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">tile</span> <span class="o">=</span> <span class="nx">substr</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/\d+/g</span><span class="p">);</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">substr</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span> <span class="nx">offset</span><span class="p">,</span> <span class="nx">substr</span><span class="p">.</span><span class="nx">length</span> <span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">qstring</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;&amp;l=&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="nx">tile</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>         <span class="s1">&#39;&amp;tx=&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="nx">tile</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
</span><span class='line'>         <span class="s1">&#39;&amp;ty=&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="nx">tile</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
</span><span class='line'>         <span class="s1">&#39;&amp;type=jpg&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="s1">&#39;&amp;fill=ffffff&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="s1">&#39;&amp;transparent=true&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="s1">&#39;&amp;cache=true&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="s1">&#39;&amp;quality=60&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="s1">&#39;&amp;ts=256&#39;</span><span class="p">,</span>
</span><span class='line'>         <span class="s1">&#39;&amp;srs=EPSG:4326&#39;</span>
</span><span class='line'>        <span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span> <span class="nx">captures</span> <span class="o">&amp;&amp;</span> <span class="nx">captures</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="s1">&#39;QString: &#39;</span> <span class="p">);</span>
</span><span class='line'>  <span class="c1">//Test qString for url parameters, otherwise we need tile nouns to find the map tile</span>
</span><span class='line'>  <span class="nx">qstring</span> <span class="o">=</span> <span class="nx">captures</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Fail, what to do</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//get http://iws.erdas.com/ImageX/imagex.dll?image?cache=true&amp;transparent=true&amp;fill=ffffff&amp;quality=60&amp;type=jpg&amp;l=2&amp;tx=2&amp;ty=1&amp;ts=256&amp;layers=/sampleiws/images/geodetic/usademo.ecw&amp;srs=EPSG:4326</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">url</span> <span class="o">=</span> <span class="s1">&#39;/ImageX/imagex.dll?image?layers=&#39;</span> <span class="o">+</span> <span class="nx">layer</span> <span class="o">+</span> <span class="nx">qstring</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="nx">req</span><span class="p">.</span><span class="nx">url</span> <span class="p">);</span>
</span><span class='line'>    <span class="nx">proxy</span><span class="p">.</span><span class="nx">proxyRequest</span><span class="p">(</span><span class="mi">80</span><span class="p">,</span> <span class="s1">&#39;iws.erdas.com&#39;</span><span class="p">,</span> <span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>QED</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing NPM on Ubuntu 10.10 w/o sudo]]></title>
    <link href="http://drewwells.net/blog/2011/installing-npm-on-ubuntu-10-10-wo-sudo/"/>
    <updated>2011-01-01T11:56:10-06:00</updated>
    <id>http://drewwells.net/blog/2011/installing-npm-on-ubuntu-10-10-wo-sudo</id>
    <content type="html"><![CDATA[<p>It took a little digging, I started with these instructions.  However you must use npm with sudo and any scripts you download have full access to ravage your system.<a href="http://utahjs.com/2010/09/07/running-node-js-on-ubuntu-10-04/">Running node js on Ubuntu 10 04</a></p>

<p>The process is simple.  If you followed these instructions previously, you need to uninstall it or NPM will continue to install in /usr/local/bin.  If you are starting fresh move onto step 2.</p>

<p>Step 1. Remove old npm/node
<code>
cd ~/node-previously-installed
./configure
make uninstall
</code></p>

<p>Step 2. Install node locally</p>

<p>The following taken from <a href="https://gist.github.com/579814">gist</a></p>

<p><code></p>

<h1>IIRC, this only works for shell windows opened</h1>

<p>echo 'export PATH=$HOME/local/bin:$PATH' &gt;&gt; ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh</code></p>

<p>Now you can install useful middleware like express without sudo.
<code>npm install express</code></p>

<p>Happy Noding</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sentence Linking and Highlighting]]></title>
    <link href="http://drewwells.net/blog/2010/sentence-linking-and-highlighting/"/>
    <updated>2010-12-05T17:24:45-06:00</updated>
    <id>http://drewwells.net/blog/2010/sentence-linking-and-highlighting</id>
    <content type="html"><![CDATA[<p>A couple new server upgrades.  I&#8217;ve moved to Wordlpress 3.0.2 no hiccups so far and I have upgraded to using Disquss.  This should make it super easy to post comments on my blog.  All old posts have been upgraded to use this.</p>

<p>On to this new non-plugin&#8230; located <a href="https://github.com/drewwells/sentence-highlighting">Here</a>.  I noticed BBQ support is missing, I must have forgotten to push that.  I&#8217;ll get to that on Monday.</p>

<p>NYT has added a cool new feature that this website is calling <a href="http://www.swiss-miss.com/2010/12/the-evolution-of-the-hyperlink.html">The Evolution of the Hyperlink</a>.  I think this is a great example of hyperbole, anyways I thought it involved some nifty JavaScript and went ahead and wrote it based on jQuery.  Their implementation is a bit lame as it only runs when the page initially loads, I stepped it up a notch and used Ben Alman&#8217;s excellent <a href="http://benalman.com/projects/jquery-bbq-plugin/">BBQ: Back Button and Query Library</a>.</p>

<p>The premise is simple, allow people to generate links to particular sentences in a page without use of any HTML help.  So this must work without generating tons of ID&#8217;s all over the page.</p>

<p>The process for me was two fold.</p>

<ol>
<li>I needed a way to find the position of sentences in a page which was simpler than initially predicted.</li>
<li>I need a way to highlight these sentences.
</li>
</ol>


<p>The second problem seems very simple, parse paragraphs and find sentences within them.  I&#8217;ll start there.  I played around with a few regular expressions.  First I simply wrote something that found any text followed by a period.  This worked well in my regular expression test site: <a href="http://gskinner.com/RegExr/">RegExr</a> but didn&#8217;t work at all in JavaScript.</p>

<p>This is what I ended up with and works very well to split any length string finding periods.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">sentences</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;p&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="nx">innerHTML</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span> <span class="sr">/[^.]/g</span> <span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you&#8217;re not familiar with regular expressions, I told the engine to find all text that&#8217;s not a period.  It will run match on a string and produce an array of sentences.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="s2">&quot;This is a great paragraph.  It has many sentences. It is useful for testing&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">s</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span> <span class="sr">/[^.]/g</span> <span class="p">);</span>
</span><span class='line'><span class="c1">//[&quot;This is a great paragraph&quot;, &quot;It has many sentences&quot;, &quot;It is useful for testing&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>You will notice periods aren&#8217;t matched.  This is inline with NYT&#8217;s behavior, so I stuck with it.  Since JavaScript doesn&#8217;t support positive lookahead, there is no obvious way to catch those pesky periods and I need-ant bother looking for one right now.</p>

<p>Now, to find where sentences are.  This is needed so we can scroll to them.</p>

<p>Like many great ideas, I reused someone else&#8217;s :D <a href="https://github.com/kir/js_cursor_position">Kir&#8217;s JS Cursor Position</a>.  The idea is simple create a fake div with the preceding text and determine how big it is.  Based on this, we can determine where the sentence in question lives.</p>

<p>With jQuery, this is extremely simple.  See this, you need to be using jQuery 1.4 or 1.4.2 something new.  I don&#8217;t remember the exact version that supports this syntax as it is hard to find examples of this syntax :D.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//page.para = index of paragraph</span>
</span><span class='line'><span class="c1">//page.sent = index of sentence within paragraph</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">para</span> <span class="o">=</span> <span class="nx">paras</span><span class="p">.</span><span class="nx">eq</span><span class="p">(</span> <span class="nx">page</span><span class="p">.</span><span class="nx">para</span> <span class="p">),</span>
</span><span class='line'>     <span class="c1">//Collect all sentences before the necessary one</span>
</span><span class='line'>     <span class="nx">sentences</span> <span class="o">=</span> <span class="nx">para</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">innerHTML</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span> <span class="sr">/[^.]+/g</span> <span class="p">),</span>
</span><span class='line'>     <span class="nx">prefixSentences</span> <span class="o">=</span> <span class="nx">sentences</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">page</span><span class="p">.</span><span class="nx">sent</span> <span class="p">),</span>
</span><span class='line'>     <span class="nx">dummy</span><span class="p">,</span>
</span><span class='line'>     <span class="nx">top</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Create a dummy div with any text preceding your sentence and</span>
</span><span class='line'><span class="c1">// css properties of that element</span>
</span><span class='line'><span class="c1">//Inspired by: https://github.com/kir/js_cursor_position</span>
</span><span class='line'><span class="nx">dummy</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;&lt;div /&gt;&quot;</span><span class="p">,{</span>
</span><span class='line'>    <span class="nx">css</span><span class="o">:</span><span class="p">{</span>
</span><span class='line'>        <span class="nx">position</span><span class="o">:</span> <span class="s1">&#39;absolute&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">left</span><span class="o">:</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">fontSize</span><span class="o">:</span> <span class="nx">para</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontSize&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">fontFamily</span><span class="o">:</span> <span class="nx">para</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontFamily&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">fontWeight</span><span class="o">:</span> <span class="nx">para</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontWeight&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">fontStyle</span><span class="o">:</span> <span class="nx">para</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontStyle&#39;</span><span class="p">),</span>
</span><span class='line'>  <span class="nx">fontVarient</span><span class="o">:</span> <span class="nx">para</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontVarient&#39;</span><span class="p">),</span>
</span><span class='line'>  <span class="nx">fontTransform</span><span class="o">:</span> <span class="nx">para</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontTransform&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">html</span><span class="o">:</span> <span class="nx">prefixSentences</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}).</span><span class="nx">appendTo</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">top</span> <span class="o">=</span> <span class="nx">para</span><span class="p">.</span><span class="nx">offset</span><span class="p">().</span><span class="nx">top</span> <span class="o">+</span>
</span><span class='line'>     <span class="nx">dummy</span><span class="p">.</span><span class="nx">height</span><span class="p">()</span> <span class="o">-</span> <span class="nb">parseInt</span><span class="p">(</span> <span class="nx">dummy</span><span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;fontSize&#39;</span><span class="p">)</span> <span class="p">)</span> <span class="o">*</span> <span class="mf">1.2</span><span class="p">;</span>
</span><span class='line'>     <span class="nx">dummy</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span> <span class="c1">//Remove dummy</span>
</span><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">scrollTo</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">top</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Feel free to link directly to the code: <a href="https://github.com/drewwells/sentence-highlighting/raw/master/main.js">sentence-highlighting</a>.  I&#8217;ll update links and whatnot on Monday.  I&#8217;ll work to make BBQ support included via progressive enhancement.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[jQuery Plugin Authoring]]></title>
    <link href="http://drewwells.net/blog/2010/jquery-plugin-authoring/"/>
    <updated>2010-10-25T22:42:00-05:00</updated>
    <id>http://drewwells.net/blog/2010/jquery-plugin-authoring</id>
    <content type="html"><![CDATA[<p>I often find jQuery plugin development is a little over-hyped.  It is also severely lacking in documentation.  This may be because the jQuery core team are hoping we the developers revolutionize the practice and they see no reason to make us conform to a particular pattern.</p>

<p>Anyways, if you&#8217;re like me, you just want to know what jQuery is doing under the covers and what the penalties and benefits of architecting your code in a certain way.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">borderize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">options</span> <span class="p">){</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is the basic pattern, <em>this</em> is set to the jQuery object and you can use your plugin like so.  To access to the underlying dom, you return this.each() and doing so enables <a href="http://ejohn.org/blog/ultra-chaining-with-jquery/">chaining</a>.</p>

<p>I see three different areas to attach methods to a plugin, each with their own costs and benefits.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">borderize</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//I don&#39;t need access to the dom directly, and I am only</span>
</span><span class='line'>  <span class="c1">//initialized once.  I have to be called via global jQuery</span>
</span><span class='line'>  <span class="c1">//object.  I do not have access to any closures, so I rely</span>
</span><span class='line'>  <span class="c1">//on this manipulation or passing in arguments.</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">borderize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">options</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//I need access to the jQuery collection.  I am initialized</span>
</span><span class='line'>  <span class="c1">//once per plugin instance and I can be accessed within</span>
</span><span class='line'>  <span class="c1">//the return if need be.  I have access to the closure created</span>
</span><span class='line'>  <span class="c1">//by $.fn.borderize</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="c1">//I need access to the direct dom, but not necessarily</span>
</span><span class='line'>    <span class="c1">//the original jQuery collection.  I require two closures</span>
</span><span class='line'>    <span class="c1">//so I am the least memory efficient of the methods.</span>
</span><span class='line'>    <span class="c1">//I am instantiated for every dom targeted by this plugin.</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Moving on, passing in options and default parameters.  I won&#8217;t discuss this topic, there&#8217;s a lot of documentation on this pattern so I&#8217;ll be terse.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">borderize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">options</span> <span class="p">){</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">opts</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">options</span><span class="p">,</span> <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">borderize</span><span class="p">.</span><span class="nx">defaults</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">wrapDiv</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;&lt;div style=&quot;border: solid &#39;</span> <span class="o">+</span>
</span><span class='line'>          <span class="nx">opts</span><span class="p">.</span><span class="nx">color</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="s1">&#39;;&quot; /&gt;;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">wrapDiv</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">borderize</span><span class="p">.</span><span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">color</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">width</span><span class="o">:</span> <span class="s1">&#39;1px&#39;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you are using basic key/value pairs in your defaults and options, this extending is sufficient.  Otherwise, you should look at deep copy option of <em>$.extend</em> in the documentation.  You notice, we aren&#8217;t putting this code inside this.each, that&#8217;s because the jQuery collection being acted on is the context of the plugin.  If would be silly to do this.each on the collection, then wrap each item in a jQuery collection just to wrap it.</p>

<p>So that leaves the question, if we are doing something different like providing functionality.  Where should we put our code?  As best I understand, $.fn.borderize is best if you need access to the jQuery collection and $.borderize is best for when you don&#8217;t.</p>

<p>I&#8217;ll add two types of methods to this plugin, one is a simple utility function that doesn&#8217;t need any sort of context or state information and another that does.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">borderize</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">debug</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">msg</span><span class="p">){</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span> <span class="nx">console</span> <span class="o">&amp;</span><span class="nx">amp</span><span class="p">;</span><span class="o">&amp;</span><span class="nx">amp</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="p">){</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="nx">msg</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="c1">//Number of initialized elements globally</span>
</span><span class='line'>  <span class="nx">initialized</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">borderize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">options</span> <span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">...</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">instanceInitialized</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">initUpdate</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">instanceInitialized</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">borderize</span><span class="p">.</span><span class="nx">initialized</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">initUpdate</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a silly example, we could just as easily update these values procedurally.  It would also be more efficient to update the value via this.length (length of the jQuery collection) rather than as each is initialized.</p>

<p>I&#8217;ll post about converting singletons to jQuery plugins.  The singleton pattern is one of the most prolific patterns on the internet and being able to wrap that in a jQuery plugin provides a powerful pattern for building jQuery plugins.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dive into HTML5 Bullseye]]></title>
    <link href="http://drewwells.net/blog/2010/dive-into-html5-bullseye/"/>
    <updated>2010-10-13T18:55:24-05:00</updated>
    <id>http://drewwells.net/blog/2010/dive-into-html5-bullseye</id>
    <content type="html"><![CDATA[<p>I thought I would be clever today and make a button as a canvas element.  For some reason, I had it in my mind that this should be a bullseye.  Boy was this difficult to do in canvas, probably took me 3 hours to go from knowing nothing about canvas to a working example.  Also, it may all be for nothing as jQuery doesn&#8217;t appear to like binding to a canvas element.</p>

<p>The basic idea of a bullseye conceptually is to draw circles on top of each other.  Each circle within the next is red or white.  The final result looked something like this.
<img src="http://drewwells.net/blog/wp-content/uploads/2010/10/bullseye.png" alt="Bullseye" /></p>

<p>Canvas has some nice features for drawing arcs.  You basically access the context of a canvas element, and start drawing paths on it.  Filling an arc results in a circle or using stroke results in a circle as a line.  This is the same code but with strokes instead of fills.
<img title="bullseye-stroke" src="http://drewwells.net/blog/wp-content/uploads/2010/10/bullseye-stroke.png" alt="" width="50" height="50" /></p>

<p>Lets dive into the code here.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;canvas&gt;&lt;/canvas&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">canvas</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;bullseye&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">getContext</span><span class="p">(</span><span class="s2">&quot;2d&quot;</span><span class="p">);</span>
</span><span class='line'><span class="c1">//I had issues with width/height so I manually set these</span>
</span><span class='line'><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span><span class='line'><span class="c1">//Find the center, this will be used for drawing our arcs</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">center</span> <span class="o">=</span> <span class="p">[</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span><span class="o">/</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="nx">context</span><span class="p">.</span><span class="nx">beginPath</span><span class="p">();</span> <span class="c1">//Tell canvas to start registering a path</span>
</span><span class='line'><span class="nx">context</span><span class="p">.</span><span class="nx">arc</span><span class="p">(</span> <span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">center</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
</span><span class='line'>  <span class="mi">25</span><span class="p">,</span> <span class="c1">//Radius</span>
</span><span class='line'>  <span class="mi">0</span><span class="p">,</span>   <span class="c1">//Starting point in radians (right side of a circle)</span>
</span><span class='line'>  <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span>  <span class="c1">//Ending point in radians (same right side of circle)</span>
</span><span class='line'>  <span class="kc">true</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="c1">//Now lets draw another circle inside this one</span>
</span><span class='line'><span class="nx">context</span><span class="p">.</span><span class="nx">arc</span><span class="p">(</span> <span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">center</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
</span><span class='line'>  <span class="mi">18</span><span class="p">,</span>
</span><span class='line'>  <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>  <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span>
</span><span class='line'>  <span class="kc">true</span><span class="p">);</span>
</span><span class='line'><span class="c1">//Draw what we have done</span>
</span><span class='line'><span class="nx">context</span><span class="p">.</span><span class="nx">stroke</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Cool stuff, that was easy why did you spend so long on this?  Well if you execute this code, this is what you get.  Two circles with a big line between them.</p>

<p><img src="http://drewwells.net/blog/wp-content/uploads/2010/10/bullseye-lines.png" alt="" title="bullseye-lines" width="50" height="50" /></p>

<p>I was looking at the example on the MDC, and simply could not figure out why mine had lines between the circles and theirs didn&#8217;t.  It did not help that their example was a smiley face, mocking me. <a href="https://developer.mozilla.org/samples/canvas-tutorial/2_2_canvas_moveto.html">Canvas moveto example</a>.</p>

<p>Then I looked closely at their example, and saw that their moveTo was not realigning the center point of the arcs as I originally thought.  It was actually moving the path to the edge of one of the new shapes.  This prevents a line being drawn from the end point of your initial circle to the start of the next one.  I later discovered, you can also just start a new path with <code>beginPath()</code>.</p>

<p>So the final code is such:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">canvas</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;bullseye&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span><span class='line'><span class="nx">drawCircle</span><span class="p">(</span> <span class="nx">canvas</span><span class="p">,</span> <span class="p">[</span><span class="mi">24</span><span class="p">,</span><span class="mi">18</span><span class="p">,</span><span class="mi">12</span><span class="p">,</span><span class="mi">6</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;red&#39;</span><span class="p">,</span><span class="s1">&#39;white&#39;</span><span class="p">,</span><span class="s1">&#39;red&#39;</span><span class="p">,</span><span class="s1">&#39;white&#39;</span><span class="p">]);</span>
</span><span class='line'><span class="c1">//I could probably just ask for two colors to alternate, eh?</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">drawCircle</span><span class="p">(</span><span class="nx">canvas</span><span class="p">,</span> <span class="nx">radius</span> <span class="cm">/* array */</span><span class="p">,</span> <span class="nx">color</span> <span class="cm">/* array */</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">getContext</span><span class="p">(</span><span class="s2">&quot;2d&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">center</span> <span class="o">=</span> <span class="p">[</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span><span class="o">/</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>    <span class="c1">//Sanity check, I don&#39;t want to attempt to draw</span>
</span><span class='line'>    <span class="c1">// circles that don&#39;t have an associated color</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span> <span class="nx">radius</span><span class="p">.</span><span class="nx">length</span> <span class="o">&lt;=</span> <span class="nx">color</span><span class="p">.</span><span class="nx">length</span> <span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span><span class="p">(</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">length</span> <span class="o">=</span> <span class="nx">radius</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">length</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span> <span class="p">){</span>
</span><span class='line'>      <span class="c1">//must move to next circle first, or else you get a line between circles</span>
</span><span class='line'>      <span class="nx">context</span><span class="p">.</span><span class="nx">moveTo</span><span class="p">(</span> <span class="nx">radius</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="o">+</span><span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">);</span>
</span><span class='line'>            <span class="nx">context</span><span class="p">.</span><span class="nx">arc</span><span class="p">(</span>
</span><span class='line'>                <span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>                <span class="nx">center</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
</span><span class='line'>                <span class="nx">radius</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span>
</span><span class='line'>                <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>                <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span>
</span><span class='line'>                <span class="kc">false</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">context</span><span class="p">.</span><span class="nx">fillStyle</span> <span class="o">=</span> <span class="nx">color</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</span><span class='line'>      <span class="nx">context</span><span class="p">.</span><span class="nx">fill</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now this works, right?  Wait, no it doesn&#8217;t.  You see strokes would work fine, but we are trying to fill our drawn shapes.  So a little more work is needed here.</p>

<p>I thought as I draw each arc, the fill would just fill that one path I had drawn.  However, fill iterates through the entire context stack and fills each object.  So what you end up with is a big circle drawn, then filled, then another circle drawn, and both of those circles filled, etc.</p>

<p>It took a bit of digging, and frankly the w3c document wasn&#8217;t a huge help.  Basically what we need to do, is draw our shape, fill it, then empty it from the stack.  beginPath() does this.  Add this to the line prior to context.moveTo and you should be in business.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//must move to next circle first, or else you get a line between circles</span>
</span><span class='line'><span class="nx">context</span><span class="p">.</span><span class="nx">beginPath</span><span class="p">();</span>
</span><span class='line'><span class="nx">context</span><span class="p">.</span><span class="nx">moveTo</span><span class="p">(</span> <span class="nx">radius</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="o">+</span><span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nx">center</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;ll update this when I find out how to bind a click to this.  Even if it takes a div wrapper <em>sigh</em>.  I&#8217;d like to know which command is more efficient, moveTo or beginPath.  I can only imagine moveTo is more efficient, but nothing to back that up at the moment.</p>

<p>This was an interesting topic for me, but really I was taking a break from my ginormous work project and getting a feel for emacs at the same time.  I think I will end up with a very oddly shaped left hand if I continue to use emacs, but the fact that everything is available via the keyboard (or maybe home row) is extraordinarily more efficient than eclipse.  I fear digging into the JavaScript templates to tweak some of the odd autoformating things it does to my files.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My first Geospatial project]]></title>
    <link href="http://drewwells.net/blog/2010/my-first-geospatial-project/"/>
    <updated>2010-09-15T13:04:10-05:00</updated>
    <id>http://drewwells.net/blog/2010/my-first-geospatial-project</id>
    <content type="html"><![CDATA[<p>Not sure why I never posted this.  I made a test project to get ready for my Geospatial job.  This is a simple mashup with <a href="http://openlayers.org/">OpenLayers</a>, Twitter, and Google Maps.</p>

<p>When I wrote this, the World Cup was still going on.  I included some of the stadiums in South Africa and a static list of Trending topics on Twitter.  The twitter birds may not work as these trending locations can change over time.  I didn&#8217;t bother to use their trending locations availability service since WOEID to real LAT/LON transation wasn&#8217;t readily available when I wrote this, so I had to manually translate all of the WOEIDs when I wrote this.
<a href="http://drewwells.net/mapmashup">Map Mashup</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New job]]></title>
    <link href="http://drewwells.net/blog/2010/new-job/"/>
    <updated>2010-08-26T20:23:16-05:00</updated>
    <id>http://drewwells.net/blog/2010/new-job</id>
    <content type="html"><![CDATA[<p>I have started a new job with <a href="http://www.erdas.com/">ERDAS</a>.  They are an established geospatial company looking to get into the websphere.  I&#8217;m doing all sorts of JavaScript/Java and Java build tooling.</p>

<p>I should have some exciting topics down the road!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ColdFusion generic getters/setters]]></title>
    <link href="http://drewwells.net/blog/2010/coldfusion-generic-getters-setters/"/>
    <updated>2010-04-23T15:02:44-05:00</updated>
    <id>http://drewwells.net/blog/2010/coldfusion-generic-getters-setters</id>
    <content type="html"><![CDATA[<p>One of the useful features missing from ColdFusion is automatic getters and setters.  This is a common practice used when writing Java Beans.  Steven Ross wrote this utilizing onMissingMethod <a href="http://blog.stevensross.com/2008/7/16/using-missing-method-to-do-automatic-getters-and-setters">here</a></p>

<p>I have slightly tweaked this.  You should know some limitations of onMissingMethod().  While external calls, say from a cfm page, will trigger the onMissingMethod calls, internal calls within the CFC will not utilize this behavior.</p>

<p>The behavior I wish to achieve is something like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>  <span class="nt">&lt;cfset</span> <span class="na">object =</span><span class="err"> </span><span class="s">CreateObject(&quot;Component&quot;,&quot;baseObject&quot;)</span> <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;cfset</span> <span class="na">object</span><span class="err">.</span><span class="na">val</span><span class="err">(&quot;</span><span class="na">Value</span><span class="err">&quot;)</span> <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;cfoutput&gt;</span>#object.val()#<span class="nt">&lt;/cfoutput&gt;</span> <span class="c">&lt;!--- Value ---&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Inside the CFC is a different story, setting and getting is a little different</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>...
</span><span class='line'><span class="nt">&lt;cffunction</span> <span class="na">name=</span><span class="s">&quot;GenericFunction&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="c">&lt;!--- Set some variables ---&gt;</span>
</span><span class='line'>  <span class="nt">&lt;cfset</span> <span class="na">setValue</span><span class="err">(&quot;</span><span class="na">var1</span><span class="err">&quot;)</span> <span class="err">=</span> <span class="err">&quot;</span><span class="na">String1</span><span class="err">&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;cfset</span> <span class="na">value =</span><span class="err"> </span><span class="s">getValue(&quot;var1&quot;)</span> <span class="nt">/&gt;</span> <span class="c">&lt;!--- Value now set to &quot;String1&quot; ---&gt;</span>
</span><span class='line'><span class="nt">&lt;/cffunction&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here&#8217;s the Helper functions to make this happen.  You can read about advanced version of this very basic getter/setter code at <a href="http://www.pbell.com/index.cfm/2008/4/8/Generic-Getters">Peter Bell&#8217;s Blog</a></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c">&lt;!--</span><span class="o">-</span>
</span><span class='line'>    <span class="nx">Author</span><span class="o">:</span> <span class="nx">Drew</span> <span class="nx">Wells</span> <span class="nx">http</span><span class="o">:</span><span class="c1">//drewwells.net/blog/2010/04/23/coldfusion-generic-getters-setters/</span>
</span><span class='line'><span class="o">---&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Handles calls to functions that do not exist</span>
</span><span class='line'><span class="c1">//@MissingMethodName - Name of function being called</span>
</span><span class='line'><span class="c1">//@MissingMethodArguments - Arguments passed to non-existant function</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">OnMissingMethod</span><span class="p">(</span> <span class="p">){</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span> <span class="nx">StructKeyExists</span><span class="p">(</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="s2">&quot;2&quot;</span> <span class="p">)</span> <span class="p">){</span> <span class="c1">//invalid, expected 1 argument</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span> <span class="nx">StructKeyExists</span><span class="p">(</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="s2">&quot;1&quot;</span> <span class="p">)</span>  <span class="p">){</span> <span class="c1">//setter</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">setValue</span><span class="p">(</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">//getter</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="nx">getValue</span><span class="p">(</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//Setter method</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">setValue</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">variables</span><span class="p">.</span><span class="nx">instance</span><span class="p">[</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">]</span> <span class="o">=</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//Getter method</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">getValue</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span> <span class="nx">StructKeyExists</span><span class="p">(</span> <span class="nx">variables</span><span class="p">.</span><span class="nx">instance</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">)</span> <span class="p">){</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">variables</span><span class="p">.</span><span class="nx">instance</span><span class="p">[</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Setting up Wordpress SES URLs]]></title>
    <link href="http://drewwells.net/blog/2010/setting-up-wordpress-ses-urls/"/>
    <updated>2010-04-13T23:01:59-05:00</updated>
    <id>http://drewwells.net/blog/2010/setting-up-wordpress-ses-urls</id>
    <content type="html"><![CDATA[<p>A few quick updates.  I have installed the wp-touch plugin, so it will auto apply a mobile friendly theme when viewed on iPhone, Android, Blackberry or Opera (woohoo).</p>

<p>Also, I have updated to SES URLs, it was a bit of a challenge.  You must update your apache settings, wordpress will take care of the .htaccess file configuration automatically.</p>

<p>To enable the use of .htaccess, you must configure your apache site configuration.  This could be default or a specialized file inside the /etc/apache2/sites-available/ directory ie.
[code light=&#8221;true&#8221;]/etc/apache2/sites-available/default[/code]</p>

<p>Go to the directory definition (or add one if it doesn&#8217;t exist) and turn on these two options at a mininum.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;Directory /var/www/blog>
</span><span class='line'>    Options FollowSymLinks
</span><span class='line'>    AllowOverride FileInfo
</span><span class='line'>  &lt;/Directory></span></code></pre></td></tr></table></div></figure>


<p>Afterwards, reload your apache configuration.  On Ubuntu, this is</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo /etc/init.d/apache2 reload</span></code></pre></td></tr></table></div></figure>


<p>Piece of cake</p>
]]></content>
  </entry>
  
</feed>

