<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>CODE [sic]</title>
		<link>http://marcorogers.com/blog/</link>
		<description>Description of Marco's Blog</description>
		<pubDate>Wed, 24 Feb 2010 04:41:22 GMT</pubDate>
	<item>
		<title>Creating a Blog I'll Actually Use</title>
		<link>http://marcorogers.com/blog/02-24-2010/creating-a-blog-ill-actually-use</link>
									    <description><![CDATA[<p>I have 3 blogs including this one. &#160;And they're all being neglected. &nbsp;The last post on any of them was 5 months ago. &nbsp;There are lots of reasons why I don't write more. &nbsp;Busy at work, social life, good old-fashioned laziness. &nbsp;But there's only one that activates my programmer's itch. &nbsp;<strong>My blog interface is just not user-friendly enough.</strong></p>
<p>When I do get the urge to write, nothing derails it faster than getting irritated with the actual writing process. &nbsp;Getting your thoughts onto paper should be the easy part. &nbsp;The hard part is ensuring that those thoughts don't make you look like and idiot.</p>
<p>So this blog post serves 2 purposes.</p>
<ol><li>Announcing that I'm going to be putting more time into blogging.</li><li>Starting to lay out a plan for making blogging less painful</li></ol>
<p>First off, let's get a feel for why the current experience isn't working. &nbsp;Here's what my current blog interface looks like.</p>
<p><img alt="My blog interface is lacking some niceties" src="/blog/static/content/blog_interface.png" title="The post creation interface in my blog" width="400px"/></p>
<p>Not too shabby looking right? &nbsp;I'm running the blog app that comes with the Axiom Stack framework. &nbsp;I've written about Axiom Stack before and I think it's pretty sweet. &nbsp;I substituted the<a href="http://ckeditor.com/"> fckeditor</a>&nbsp;for <a href="http://wymeditor.org/">wymeditor</a>, because it produces more standard xhtml. &nbsp;This is a nice addition for Axiom Stack because it uses e4x to parse and manipulate xhtml on the back end. &nbsp;But there loads of problems here (no offense to the axiom software guys, this is a free blog app that's really just meant to be an example). &nbsp;The rest of this blog focuses on the most egregious offender. &nbsp;The WYSIWYG editor.</p>
<h2>WYSIWYeG: or What You See Is What You (eventually) Get</h2>
<p>WYSIWYG editors are terrible for any significant writing. &nbsp;The behavior is often inconsistent. &nbsp;They're often buggy. &nbsp;And you spend a lot of time fiddling with toolbars to get your content to look the way you want. &nbsp;Or worse yet, you have to flip over to the dreaded HTML view to fix things. &nbsp;However, they've become very popular on the web for 2 reasons.</p>
<ol><li>They give the user lots of controls for doing other important things, like working with tables, links images, bulleted lists, etc. &nbsp;All those other things that make up "content". &nbsp;In short, wysiwyg's give us an environment similar to (or at least inspired by)&nbsp;Microsft Word and other desktop word processing software.</li><li>It's a <em>hell</em> of a lot better than writing HTML by hand. &nbsp;HTML is the language of web content, but it's <strong>not</strong> what you want to be thinking about when you're writing. &nbsp;For instance just making one word bold in that last sentence requires 17 extra keystrokes than normal (I prefer &lt;strong&gt; to &lt;b&gt;, don't you?)</li></ol>
<p>There are good things about wysiwygs but my biggest complaint with the one's I've used is that none of them hide the HTML well enough. &nbsp;There are always quirks that remind me that I'm dealing with code. &nbsp;And that code needs to be formatted properly or I'm going to have issues. &nbsp;What I want is a language that allows me more flexibility with my content without shoving HTML in my face.</p>
<p>As far as I can tell, that's <a href="http://daringfireball.net/projects/markdown/">Markdown</a>. &nbsp;Markdown is gaining a lot of traction as a language for facilitating written composition on the web. &nbsp;You just write like you would normally, double newline for paragraphs, simple markers for formatting. So this:</p>
<p>This paragraph serves to *emphasize* some of the nicer features of markdown. &nbsp;It is _not_ meant to be a full-fledged [tutorial](http://daringfireball.net/projects/markdown/basics)</p>
<p>Produces this:</p>
<blockquote><p>This paragraph serves to <strong>emphasize</strong> some of the nicer features of markdown.  It is <em>not</em> meant to be a full-fledged <a href="http://daringfireball.net/projects/markdown/basics">tutorial</a></p></blockquote>
<p>The key feature with markdown is that you can write html if you need to. &nbsp;But if you don't, you'll never see it, and you can still do the usual formatting of your content; bold, italic, lists and links. &nbsp;99% of blog content is made up of words and these simple elements. &nbsp;That should be easy. &nbsp;And with markdown, it will be.</p>
<p>So my first goal is to replace wymeditor with a decent Markdown editor. &nbsp;As it turns out, a cursory google search couldn't find any that do what I want. &nbsp;Which is to provide a native markdown interface, syntax highlighted, with a function that will preview it in HTML. &nbsp;So that's my first project on the road to a better blogging experience.</p>
<p>Other posts in this series follow the changes I'm making as well as touching on anything else I run into that's interesting. &nbsp;Other stuff on my list include:</p>
<ul><li>Better integration and support for code snippets</li><li>Easy dictionary look up</li><li>Easy image inserts (uploaded to my server)</li><li>Re-usable formatting elements</li></ul>
<p>Most of this stuff can be easily accomplished with a few plugins in popular systems like Wordpress or Movable Type. &nbsp;But this is my technology blog. &nbsp;We're looking for something a little different here. &nbsp;Hopefully future installments will be more interesting than what this post turned into. &nbsp;But hey, give me a break, I haven't done this in like 5 months.</p>]]></description>
                <pubDate>Wed, 24 Feb 2010 04:41:22 GMT</pubDate>
	</item><item>
		<title>An Uneducated View of Checked vs. Unchecked Exceptions</title>
		<link>http://marcorogers.com/blog/09-27-2009/a-noobs-view-of-checked-vs-unchecked-exceptions</link>
									    <description><![CDATA[<p>Lately, I've been reading up on the raging debate surrounding exceptions and exception handling.&#160; Specifically, how useful is it that languages like Java have checked exceptions that the caller is forced to handle?&nbsp; Is it better to eliminate these and have only unchecked exceptions?</p>
<p>I don't write much Java.&nbsp; I'm all about dynamic languages (hence the Uneducated tag).&nbsp; But sometimes I have an opinion on things I don't know a whole lot about.&nbsp; So here are my thoughts.</p>
<p>I ran across a <a href="http://code.google.com/p/noop/wiki/ProposalForErrors">proposal to eliminate checked exceptions</a> in <a href="http://code.google.com/p/noop/wiki/Features">Google's experimental noop language</a>.&nbsp; I think this is a good forum to discuss the issue because the language doesn't have any baggage that comes with worries about backwards compatibility and that type of thing.&nbsp; We can talk about the problem that checked exceptions try to solve and thus think of new ways to approach that problem.</p>
<p>Anyway, I left a comment there and I'm just going to reproduce it here for posterity and possible discussion:</p>
<blockquote><p>I've been reading a lot about checked vs. unchecked exceptions lately.  This isn't my field, but I'd just like to offer some questions/comments. </p><p>Quick question.  With the above proposals (original and gabrielh), how would unhandled runtime exceptions propogate?  Since they aren't explictly thrown, they're just set as scope variables.</p><p>Some people argue for specific exception types.  But in my experience, most calling code trys to discern 1 thing.  Is it a problem I can recover from or not?  To try and clarify a little: </p><ul><li>The caller can't recover from a file not found error. You could suggest that the caller may be able to create the file, but that's probably giving the caller too much responsibility.  Essentially another code path should be started that may eventually culminate in calling the function again.  But the original path is essentially dead in terms of exception handling. </li></ul><ul><li>A caller can recover from a Timeout exception in a network call.  The method is idempotent in most cases, so it can just call again (and hope it was just a hiccup).  Or it can pass a higher timeout.  I think these are reasonable actions that are still within the caller's responsibility.  If these don't work, it's time to execute another code path or propogate the exception. </li></ul><p>So in my line of thinking, checked exceptions force a caller to consider whether it can handle any problems up front.  You're more likely to include exception handling code because it's part of fulling the method signature.  Only we've seen in practice that this is not the case.  In many cases, the try/catch structure encourages programmers to treat all exceptions as "unfixable".  Basically instead of handling the exception, most try/catches do one of the following. </p><ul><li>Clean up before re-throwing </li><li>Wrap the exception in your own to throw down the stack </li><li>Ignore It </li></ul><p>So if you buy all of this (and I'm not sure i do, this is just a line of thought) it looks like checked exceptions aren't that helpful.  But having a mechanism for explicitly specifying the exceptions that are possible is very helpful. </p></blockquote>]]></description>
                <pubDate>Sun, 27 Sep 2009 03:04:53 GMT</pubDate>
	</item><item>
		<title>The Things I Will Need Before Abandoning Firefox</title>
		<link>http://marcorogers.com/blog/08-14-2009/what-i-would-need-before-abandoning-firefox</link>
									    <description><![CDATA[<p>I should start by saying that Firefox has all but driven me away.&#160; I can no longer ignore the way the performance has continued to deteriorate with successive versions.&nbsp; I'm almost ready to switch to something else until they get their act together.&nbsp; But the fact is that, for me, what Firefox offers is really hard to beat.</p>


<p>So this is my list of must-haves before I'll consider using another browser setup on a regular basis.&nbsp; I'm a professional web developer, and like many people reading this, I'm also an internet junkie.&nbsp; So this isn't going to be the typical feature set.</p>


<h2>High Performance and Responsiveness</h2>


<p>Obviously this is the biggest issue and the real reason I'm considering the switch.&nbsp; My typical browsing session involves 8 or more tabs open to the most resource intensive sites you can think of.&nbsp; Web applications that are on the cutting edge of browser capability, vendor products that provide massive functionality behind the scenes, huge multimedia sites choc full of giant images, audio, video, flash and javascript.</p>


<p>And that's just my day job.</p>



 




<p>The fact is that for whatever reason, Firefox can't handle this level of activity anymore.&nbsp; It slows to a crawl.&nbsp; It eats my RAM like candy (and I have a lot of RAM).&nbsp; And on the days when I'm being particularly patient, it just calls it a day and crashes.&nbsp; Unacceptable.</p>


<p>Fortunately, Firefox has some real competition these days.&nbsp; Internet Explorer 8 isn't completey terrible.&nbsp; But I'm on a Mac, plus there's no way I would use it for web development.&nbsp; I've been using Safari 4 for the last week or so and it's zippy pretty much all the time.&nbsp; When I was a Windows guy, using Google Chrome was a joy.&nbsp; If they ever release a decent version for OS X, it'll definitely be in heavy rotation.&nbsp; Opera has always been one of the better performing contenders from what I hear.&nbsp; Firefox is easily beat in this category.</p>


<h2>Web Developer Tools</h2>


<p>This is pretty high on my priority list since I can't do my job without decent development tools built into the browser.&nbsp; Sure, I used to build websites before Firebug came along.&nbsp; But I now recognize that era as The Dark Ages of web development.&nbsp; I'm as eager to go back there as I am to see what the Black Plague was like.&nbsp; Fortunately, the other browsers have developed some nice tools as alternatives here.&nbsp; Safari and Chrome offer a console that allows you to inspect the DOM, see some applied css rules and debug javascript.&nbsp; The Chrome console is missing some key things though.&nbsp; My guess is it comes pretty much out of the box from Webkit.&nbsp; The Safari version is much more full-featured.&nbsp; But on closer inspection, they both have deficiencies that can't stand up to the combo of Firefox with Firebug and Web Developer Toolbar.</p>


<ul>
    <li><strong>Edit in place:</strong> With Firebug I can inspect html and edit in place.&nbsp; I can see tweak things in real time instead of the usual edit-save-reload cycle.&nbsp; This goes for css too, which is really helpful.</li>
    <li><strong>Full CSS view:</strong> Selecting a DOM element in Firebug shows the full cascade of css rules that apply to a given element rather than the truncated view in the Webkit console.&nbsp; It excludes inherited styles (e.g. default from the body element)</li>
    <li><strong>Network Profiling:</strong> The Net view in Firebug is great for getting a real sense for how your page loads and what the pain points are.&nbsp; The Webkit console has a page load view, but it seems buggy and wrong a lot of times (reporting 0 byte files and 0 load times).</li>
    <li><strong>View All Javascript/CSS:</strong> Not sure how many others use this feature.&nbsp; But the Web Dev Toolbar has an option that will give you a page with all of the javascript or css for a page all stitched together.&nbsp; This is awesome for searching for that one pesky line that's giving you trouble.&nbsp; Especially if some of the code is loaded from external sources and you're not very familiar with it.&nbsp; (To be fair, this can be replicated with a few bookmarklets though.)</li></ul>


<p>Add YSlow and other Firebug extensions this list and that's a lot to give up.</p>


<h2>Major Extensibility</h2>


<p>This section pretty much covers the rest of my gripes with other browsers.&nbsp; The greatest feature that Firefox brings to the table is that it is infinitely customizable.&nbsp; All of the features of Firefox that make it so indispensible were developed by third party developers.&nbsp; Over the last several years I've amassed a prodigious collection of add-ons that turn my firefox into exactly what I want it to be.&nbsp; My first couple of days trying to use Safari or Chrome, I could barely get anything done.&nbsp; I was missing the familiar environment that was tailored to my workflow.  Here are my favorites features and add-ons:</p>


<h3>Web Development</h3>


<ul>
    <li>Firebug and extensions plus Web Developer mentioned above.</li>
    <li>It's All Text.&nbsp; Let me use emacs wherever possible.</li>
    <li>Tamper Data.&nbsp; Cause sometimes HTTP can be a PITA.</li>
    <li>Not to mention MeasureIt, Colorzilla, Pixel Perfect,...</li></ul>


<p>I don't use all of these all the time.&nbsp; But when I need them, they make my life much easier.&nbsp; And when I don't have them, it makes me contemplate finding a new profession.&nbsp; I've been searching for replacements on the Mac and what I've found is that most of the good ones cost money.&nbsp; Yes, I've paid for a few I thought were good.&nbsp; But none of them are integrated into the browser very well.</p>


<h3>Productivity</h3>


<ul>
    <li>Bookmark keywords: &nbsp; This is actually built into Firefox and it may seem like a small thing.  But Firefox lets you give any bookmark a keyword, which is more like an alias from the unix world.&nbsp; When you type the keyword into the address bar it replaces it with that bookmark.&nbsp; So for instance, to visit facebook I just type "fb".&nbsp; No clicking, no googling, I'm immediately there.&nbsp; And I never have to remember anything.&nbsp; "What's that long stupid url for our dev wiki?" Type "devwiki".&nbsp; Easy enough.
    </li><li>OpenBook and XMarks.&nbsp; Combined with the above, I'm much better at managing links and navigating to my most frequent sites.</li>
    <li>Tab Mix Plus.&nbsp; Firefox has pretty decent defaults for getting navigating around and managing tabs.&nbsp; But after I got used to my TMP settings, it felt like things were broken whenever I didn't have them.&nbsp; Middle click on a tab to close it.&nbsp; Double click on a tab to duplicate it (including the history.)  Middle click on the tabbar to <em>re-open the last closed tab</em>.&nbsp; If you aren't doing this, you are missing out.&nbsp; Firefox saves your closed tab history by default, but this makes it much more accessible.</li>
    <li>Better Gmail.&nbsp; Makes GMail... better.&nbsp; CustomizeGoogle.&nbsp; Makes the rest of the google products better.</li>
    <li>QuickRestart.&nbsp; This is handy when you need to restart Firefox.&nbsp; It used to be needed when you installed new add-ons.&nbsp; But they have long since added a convenience button to do that.&nbsp; Now it's useful when your Firefox has consumed all of your memory like some kind of black hole, and it needs to be restarted so you can keep working.&nbsp; The reason this is notable is because QuickRestart gives you a button that can be added to your toolbar.&nbsp; Just right-click and select Customize and you get a whole list of things that can be pulled onto the toolbar.  Many other add-ons do this too, giving you very convenient access to their functionality.&nbsp; This is a clutch feature in my opinion.</li></ul>


<h3>Web Surfing and&nbsp;Social Media</h3>


<ul><li>Shareaholic.&nbsp; A couple of clicks to share anything I want instantly on Reddit, Digg, Facebook, Twitter, Gmail and 50 other sites I've never heard of.&nbsp; This is essential for minimizing my goofing off time.</li><li>Search Cloudlet.&nbsp; Adds tag clouds of relevant keywords to Google searches and Twitter.&nbsp; I thought this was just a novelty at first, but it actually prompts you to add words to your searches that you may not have thought of.  It can help refine your thoughts about what you're looking for.</li><li>Xoopit for GMail.&nbsp; This add-on crawls your emails and pulls out all of the media, making it organized and searchable.&nbsp; You can see all the pictures or videos people have sent you in the last week, month or year.&nbsp; Maybe not very useful in general.&nbsp; But it is very cool to look over the entire history of the random stuff people wanted me to see over the years.  That's how I found <a href="/blog/static/content/07-24-06_1114.jpg">this nugget of joy.</a></li></ul>


<h3>Everything Else</h3>


<p>Greasemonkey.&nbsp; This is probably the clincher.&nbsp; Userscripts.org has tons of scripts contributed by people who made the web work they wanted.&nbsp; I can't even use Facebook anymore without <a href="http://userscripts.org/scripts/show/8861">the Fixer.</a>&nbsp; Many of the best add-ons started as greasemonkey scripts.</p>


<p>The bottom line is that in my version of Firefox, I can have things my way.&nbsp; I've been trying to get other browsers to behave for a while now, and it's not working out very well.&nbsp; So I guess it's back to slow performance, frequent crashes and even more frequent restarts.&nbsp; I'm pretty confident that Mozilla is working on fixing these issues.&nbsp; But they had better step things up.&nbsp; The latest build of <a href="http://code.google.com/chromium/">Chromium for Mac</a> looks better every day.</p>]]></description>
                <pubDate>Fri, 14 Aug 2009 14:17:31 GMT</pubDate>
	</item><item>
		<title>Supporting the ServerJS Standard On Axiom Stack: First Steps</title>
		<link>http://marcorogers.com/blog/08-02-2009/supporting-the-serverjs-standard-on-axiom-stack</link>
									    <description><![CDATA[<p>
I've been following the <a href="http://groups.google.com/group/serverjs">ServerJS</a> list on google groups for a while.&#160;  I'm excited about the emergence of javascript as a full-fledged modern language. &nbsp; But it's sorely lacking in a lot of functionality we've come to take for granted in programming languages.&nbsp;  The ServerJS group has taken on the task of developing standard APIs and libraries to enable things like file system access, networking capabilities (although this is partially addressed by XMLHttpRequest) and a sensible, secure module system for pulling everything together.
</p>


<p>
There are several usable implementations of the early ServerJS standard available right now.&nbsp;  So I sat down this weekend to see if I could integrate one of them into <a href="http://www.axiomstack.com/">Axiom Stack</a> (the open source server-side javascript framework that powers this site.)&nbsp;  I chose <a href="http://narwhaljs.org/">Narwhal</a> simply because the primary maintainer, Tom Robinson, is focusing on support for the Rhino JavaScript Engine.&nbsp;  Getting things up and running ended up being pretty straight forward, so I figured I'd outline things here.
</p>


<p>
On the surface Narwhal, and any other ServerJS compatible implementation, is just a library of javascript files that provide the standard APIs.&nbsp;  The underlying implementation relies on java packages though, which is why the Rhino engine is key.&nbsp;  Narwhal includes Rhino as a dependency and it also includes scripts for bootstraping the javascript environment in a JVM and loading the necessary js files.
</p>


<p>
That's all great for getting started with Narwhal, but Axiom Stack already provides the Rhino environment, and in fact it already provides a mechanism for loading js code into your application.&nbsp;  So my task was to find the merge point between Axiom modules and Narwhal packages.
</p>


<p>
Axiom Stack modules are pretty simple.  Include your code in the modules folder under the Axiom install dir.&nbsp;  You need to follow a certain package structure that Axiom recognizes.&nbsp; Then add the module name, which is just the name of the module folder, into your app.properties file. &nbsp; It should look something like this:
</p>


<div><pre>AXIOM_R00T/
  modules/
     narwhal/
        Global/
           packages.js
            ...
            ...
</pre></div>


<p>
And in your app.properties:
</p>


<pre><code>
modules = narwhal
</code></pre>


<p>
Now to figure out which Narwhal files to load.&nbsp; <a href="http://github.com/tlrobinson/narwhal/tree/master">Download the narwhal source from github.</a>&nbsp; Narwhal actually includes support for several javascript platforms including Rhino, Spidermonkey and v8.&nbsp;  Since I'm interested in the Rhino version, I'm checking things out in <code>NARWHAL_ROOT/platforms/rhino/</code>.&nbsp;  The <code>lib/</code> folder has all kinds of good stuff, so I tried copying these files into my narwhal module Global/ folder. &nbsp; That didn't work.&nbsp;  I got all kinds of awesome error messages about missing functions or variables.&nbsp;  So I read up a little and finally came across <a href="http://groups.google.com/group/narwhaljs/browse_thread/thread/30175c713b7c382b#msg_4cdd1938f4a1028a">this helpful thread.</a></p>


<blockquote>
I think that for Jaxer and ASP, you can bypass bin/narwhal (which just
finds itself and calls platforms/*/bin/narwhal-*), and you can bypass
platforms/*/bin/narwhal-* (which just finds the engine and executes
platforms/*/bootstrap.js) and go straight to platforms/*/bootstrap.js. 
</blockquote>


<p>
So it looks like we need to bootstrap the narwhal environment first. &nbsp; But after that, the bootstrap file knows where everything else is.&nbsp;  So after some more futzing around and breaking things, I did what any self-respecting integration artist would do: I cheated.
</p>


<p>
All I needed was for Axiom Stack to load and execute that bootstrap file.&nbsp;  Axiom Stack loads whatever is in the <code>modules/narwhal/Global/</code> folder.&nbsp;  So here's my setup:
</p>


<div><pre>AXIOM_ROOT/
   modules/
      narwhal/
         Global/
            bootstrap.js -&gt; NARWHAL_ROOT/platforms/rhino/bootstrap.js
</pre></div>


<p>
Yes, I simply symlinked the bootstrap file into the Axiom Stack file tree.&nbsp; Almost there, but there's one more step.&nbsp;  The Narhwal loader looks for the "<code>NARWHAL_HOME</code>" environment variable to know where the install is. &nbsp; So set this in your environment and restart Axiom Stack and you should be rocking and rolling.</p>


<p>Yeah, I know this is not ideal, and certainly wouldn't be acceptable for a production setup.&nbsp;  But hey, we're talking baby steps here. &nbsp; This is pretty good for a couple of hours on a Saturday.&nbsp;  I've already got ideas on how make the integration a little more stable.&nbsp;  Hopefully in the future, Axiom Stack will be fully ServerJS compliant from the start.&nbsp;  Until then, check out Narwhal and make sure to give feedback to the group.
</p>]]></description>
                <pubDate>Sun, 02 Aug 2009 21:06:42 GMT</pubDate>
	</item><item>
		<title>Firefox Comment Rendering, It's Not A Bug! But We'll Fix It</title>
		<link>http://marcorogers.com/blog/08-02-2009/strange-firefox-rendering-bug</link>
									    <description><![CDATA[<p>Ran into an issue recently with how Firefox renders HTML comments.&#160; Everyone here knows what comments look like right?</p>
<pre><code class="html">
&lt;!-- This is a comment. --&gt;
&lt;!--
        They can also span
        multiple lines.
--&gt;
</code></pre>
<p>
Pretty straight forward.  And you would think it's easy to identify when rendering.  Once you see the "<code>&lt;!--</code>" then ignore everything until you see "<code>--&gt;</code>".&nbsp; Except Firefox doesn't do that exactly.&nbsp; It turns out if you have 2 dashes or hyphens contained in the comment, Firefox will prematurely end the comment.&nbsp; And probably break your page.&nbsp; Example:</p>
<pre><code>
&lt;!-- This is a fine looking comment--Until you get here. Now you're screwed! --&gt;
</code></pre>
<p>
The above comment Will break in all versions of Firefox up to the current stable version of 3.5.&nbsp;  <a href="/tests/firefox_comment_bug_test.html">Take a look</a> (You are using Firefox right?)&nbsp; This doesn't happen in any other modern browser including Internet Explorer.&nbsp;  But okay, so there's a rendering bug in Firefox.&nbsp;  It happens right?&nbsp;  No big deal.&nbsp; I'll just <a href="http://ejohn.org/blog/a-web-developers-responsibility/" title="A Web Developer's Responsibility">fulfill my responsibility</a> and go on over to the bug list and make sure it's there.&nbsp;  Sure enough, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=214476">I found the bug</a>, and that's when things got interesting.</p>
<p>Apparently people have been arguing about this bug for <em>6 years!</em>&nbsp;  And it still isn't fixed!&nbsp;  Because, like all good stories about programming minutia, some really smart guys don't agree that it's a bug.&nbsp; HTML is a tag-based language originally based on SGML, and apparently the spec for HTML relies on SGML to specify how comments should be handled.&nbsp; Here's the choice excerpt <a href="http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4" title="On SGML and HTML">from the spec.</a></p>
<blockquote>
White space is not permitted between the markup declaration open delimiter("&lt;!") and the comment open delimiter ("--"), but is permitted between the comment close delimiter ("--") and the markup declaration close delimiter ("&gt;"). A common error is to include a string of hyphens ("---") within a comment. Authors should avoid putting two or more adjacent hyphens inside comments.
</blockquote>
<p>You see the issue here is that the end delimiter of a comment in SGML isn't "--&gt;", it's just "--".  After the double hyphen your text starts to mean something again. And you can include as much text as you want after that.  But according to HTML you're still inside a tag, because it hasn't seen a closing "&gt;" yet.  Hence the weirdness.  In fact it's even more complicated than that.  <a href="http://www.howtocreate.co.uk/SGMLComments.html" title="HTML and SGML comments">Check out this more in-depth breakdown.</a>  Which explains why one set of double hyphens breaks comments while a second set will fix them.  <code>&lt;!-- So something -- like this -- would work just fine. --&gt;</code>.  Remember, if you're going to include double hyphens inside your HTML comments, make sure they come in multiples of 2.</p>
<p>Oh... well... fine then.&nbsp;  That's kind of stupid, but okay.&nbsp; Bug closed as invalid.&nbsp; And it was.&nbsp;  Until someone else realized it was stupid.&nbsp;  In fact, several people did.&nbsp;  Which is why it was successfully removed as a requirement for passing the Acid 2 compliance test.&nbsp;  And finally it was fixed where it should've originally been fixed, in the spec.&nbsp;  <a href="http://www.whatwg.org/specs/web-apps/current-work/#comments" title="HTML 5 Working Draft">HTML5 addresses this issue.</a> &nbsp; Hooray! &nbsp; Now the official end delimiter for comments is "--&gt;". &nbsp; Except you're still not supposed to use double hyphens... whatever.</p>
<p>So now the smart guys at Mozilla are listening to reason and plan to fix the bug in the next version of FF.&nbsp; But only after the HTML spec supports it.&nbsp;  That's the most interesting thing to come out of all of this in my opinion.&nbsp;  It raises a few questions.&nbsp;  Is it good to hang on doggedly to a spec written years ago, when clearly it does more harm than good in modern practice?&nbsp;  And more importantly, when is it time to stop being pedantic and fix the damn bug already?&nbsp;  Apparently you can give it at least 6 years.</p>]]></description>
                <pubDate>Sun, 02 Aug 2009 00:07:51 GMT</pubDate>
	</item><item>
		<title>Does a Complex Web App Really Need Clean Markup?</title>
		<link>http://marcorogers.com/blog/07-05-2009/does-a-complex-web-app-really-need-clean-markup</link>
									    <description><![CDATA[<p>I found myself pondering this question today in a response to a <a href="http://twitter.com/ncb000gt/status/2469370227">status message</a></p>






<blockquote>While I do really like the ExtJS APIs the generated markup makes me cry. A button should not be made of multiple 's. #fail</blockquote>






<p>I had this same gripe a while back when I was <a href="http://marcorogers.com/blog/04-05-2009/add-your-current-facebook-status-to-your-home-page">hacking facebook with greasemonkey</a>.&#160;
I felt like facebook was flouting everything we've learned about web
standards and structured content.&nbsp; Everything is a &lt;div&gt;
wrapped in multiple other &lt;div&gt;'s.&nbsp; In fact, most of the
content is generated with Javascript.&nbsp; With their last major
redesign, Facebook eliminated many of the explicit page reloads.&nbsp;
Now they literally pull in the entire page with ajax and regenerate the
markup.&nbsp; And a couple of weeks after I finished my greasemonkey
script, they changed the interface again and broke it!</p>






<p>But then I
started really considering what apps like Facebook are trying to
accomplish.&nbsp; They're task-oriented, not content oriented.&nbsp;
Most of Facebook requires a user to be authenticated.&nbsp; fb is more
concerned about people coming to the site, not robots.&nbsp; And even
considering that, the public pages still manage to rank pretty high in
Google.&nbsp; Search for <a href="http://www.google.com/search?q=marco+rogers">marco rogers</a>
and you'll get my profile link as the first result.&nbsp; Even though
the page is pretty much entirely generated with javascript. Today's web
apps put the application first and the web second. Many of them are
basically meant to be portable desktop apps. When was the last time you
cared how the visual elements in MS Outlook were put together?</p>






<p>Unless
I miss my guess, the markup spit out by fb is probably tied pretty
closely with some proprietary content framework they're using to
generate the pages.&nbsp; And generating semantic markup with
javascript is no mean feat.&nbsp; If you can get away with every
element being a &lt;div&gt; or &lt;span&gt;, you're almost certainly
doing yourself a favor.</p>






<p>That's how I read the promise of Ext JS.</p>






<blockquote>Ext JS is a cross-browser JavaScript library for building rich internet applications.</blockquote>






<p>Ext
JS is offering to do you that favor. You can build those complex
applications with an interface that will be consistent in functionality
as well as look and feel. As long as you're not worried about search
findability. And if you're building a web application, you should
really ask yourself that question sooner rather than later.</p>]]></description>
                <pubDate>Sun, 05 Jul 2009 00:31:54 GMT</pubDate>
	</item><item>
		<title>Add Your Current Facebook Status To Your Home Page</title>
		<link>http://marcorogers.com/blog/04-05-2009/add-your-current-facebook-status-to-your-home-page</link>
									    <description><![CDATA[<p><strong>Update:</strong> The most recent changes to Facebook broke this!  Hopefully I'll get some time to fix it at some point.<br/>--</p>






<p>Ever since the most recent Facebook redesign, you can't see your current status from the home page.&#160; You have to go to your profile or find out through some other method.&nbsp; This has been irking me, because the only time I update my status is when I got to my home page to read something and realize that it's old.</p>






<p>Anyway, I was looking for something to do so I wrote a <a href="http://www.greasespot.net/">greasemonkey</a> script that adds the status back to the home page.&nbsp; You'll need the firefox add-on if you don't already have it.</p>






<p>And you can get the script here: <a href="http://userscripts.org/scripts/show/45971">http://userscripts.org/scripts/show/45971</a>.&nbsp; I'll probably write a follow up about the headaches I ran into trying to get this to work.</p>]]></description>
                <pubDate>Mon, 06 Apr 2009 03:48:54 GMT</pubDate>
	</item><item>
		<title>Generating Abstract Text from HTML content</title>
		<link>http://marcorogers.com/blog/01-16-2009/generating-abstract-text-from-html-content</link>
									    <description><![CDATA[<p>In
the world of online content management, we often want to introduce an
article with a summary or abstract. The best example of this is the
front page of a blog. You are presented with a list of the most recent
articles with just a few paragraphs from each to get your interest. If
want to continue you can click through and get the full text. Until
recently, this blog didn't do that. It's a pretty important addition
for me because my posts tend to run long, and my Home Page was getting
pretty lengthy from just 3 posts. Here's the rundown on adding this
feature.</p>




<h2>A Few Requirements</h2>




<p>First a little setup. Ideally
this summary would be written specifically for the article and
formatting nicely for it's space in the page. But since we live in the
real world, we are generally given a few requirements for our system to
make this easier. These are the general guidelines I used:</p>




<ul>
    <li>The summary should be generated automatically from the first paragraph of the full text (or first 2 or first 3 ...)</li>
    <li>The summary should preserve any html that may be present (i.e. links, bullet points, etc).</li>
    <li>The editor (me) should have the option of overriding this auto-generated summary with a custom one.</li></ul>




<h2>The Tools</h2>




<p>I wanted to see how simple I could make this with the system I'm using.  I have a few things going for me.</p>




<p><strong>Almost all of the html content is available as well-formed xml.</strong>
This means I can manipulate xml node objects instead of parsing text.
Using text manipulation techniques to modify tag-based html has always
bothered me. You end up either writing lots of code to handle lots of
different possibilities or relying on complex regular expressions. By
representing your content as xml (or in this case xhtml) you can be a
little more confident that your output will still be well-formed and
valid. And you can probably manage your changes with less code.</p>




<p><strong>It's not DOM, it's e4x</strong>.
This system is Java based. And yes, that's a good thing. Because that
allows me to use the Rhino JavaScript Engine. In my opinion, javascript
is a very nice scripting language. And working with it on the server as
well as the client side is pretty nice. But more importantly, Rhino has
<a href="http://en.wikipedia.org/wiki/E4X">native xml support through the e4x specification.</a>  E4x is much easier to work with than the <a href="http://www.w3cdom.org/">w3c DOM spec</a> or most language APIs for manipulating xml.  This makes some of the code look a little funky.</p>




<p><strong>It's fully object oriented.</strong>
This isn't really an objective advantage. I just prefer it. All it
means in this case is that all of the functions I'm using are actually
methods on an object. The object represents my blog article and I have
access to any of the properties of the article through the "this"
keyword. I'll talk about this more in the second part to <a href="http://marcorogers.com/blog/01-08-2009/why-you-should-be-using-an-object-database-instead-of-orm">Why you should be using an Object Database instead of ORM.</a></p>




<h2>The Code</h2>




<p>The first step is a function that returns the summary.  I'm calling it "abstract" and the first pass just returns it.</p>




<pre><code><br/>function get_abstract(){<br/>    return this.post_abstract;<br/>}</code></pre>




<p>This
is just a getter function. But what if no abstract has been provided?
Then we're ready to generate it. So let's update this a bit.</p>




<pre><code><br/>function get_abstract(){<br/>    if(!this.post_abstract){<br/>        this.post_abstract = this.generate_abstract();<br/>    }<br/><br/>    return this.post_abstract;<br/>}</code></pre>




<p>A
few things to notice here. First off, the "post_abstract" is a property
on our blog article. That means when we give it a value, it's
automatically saved into our database. There's nothing else we need to
do to be able to access the value of this property again later. Second,
the "generate_abstract" function is also a method of our blog article,
so it needs to be accessed through "this".</p>




<p>So we've got a simple
function that returns our abstract. And if there isn't one, it calls a
function to get one. Let's check that out.</p>




<pre><code><br/>function generate_abstract(){<br/>    var limit = 3;<br/>    var tmpbody = this.body.elements();<br/><br/>    var abs = &lt;&gt;&lt;/&gt;;<br/>    for(var idx in tmpbody){<br/>        abs += tmpbody[idx];<br/>        if(abs.length() &gt;= limit) break;<br/>    }<br/><br/>    return abs;<br/>}</code></pre>




<p>This
is a pretty simple function. It grabs all of the elements out of the
body of the article. These are xml elements representing our xhtml.
Probably paragraph tags. But we don't have to actually worry about it.
It could be any tpye of element. We loop through these elements and
grab as many as we need. Then we add them to our temporary abstract.
This "abs" variable is the only place i this function where you see the
e4x peeking through. We start by creating an empty <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Processing_XML_with_E4X#Working_with_XMLLists">XMLList.</a>
This is essentially an xml fragment with no top level container
element. That describes the html body of our blog post perfectly.
Here's a snippet of the html of this post.</p>




<pre><code class="html">

&lt;p&gt;In the world of online content management, we often want<br/>&#160;to introduce an article with a summary or abstract.  <br/>The best example of this is the front page of a blog.  <br/>You are presented with a list of the most recent articles <br/>with just a few paragraphs from each to get your interest. <br/> If want to continue you can click through and get the full<br/>&nbsp;text.  Until recently, this blog didn't do that.  Since I <br/>I haven't seen a lot of&lt;/p&gt;<br/>&lt;h2&gt;A Few Requirements&lt;/h2&gt;<br/>&lt;p&gt;First a little setup.  Ideally this summary would be <br/>written specifically for the article and formatting nicely <br/>for it's space in the page.  But since we live in the real <br/>world, we are generally given a few requirements for our <br/>system to make this easier.  These are the general guidelines<br/>&nbsp;I used:&lt;/p&gt;<br/>&lt;ul&gt;<br/>    &lt;li&gt;The summary should be generated automatically from <br/>the first paragraph of the full text (or first 2 or first <br/>3 ...)&lt;/li&gt;<br/>    &lt;li&gt;The summary should preserve any html that may be <br/>present (i.e. links, bullet points, etc).&lt;/li&gt;<br/>    &lt;li&gt;The editor (me) should have the option of overriding<br/>&nbsp;this auto-generated summary with a custom one.&lt;/li&gt;<br/>&lt;/ul&gt;<br/>...

</code></pre>




<p>So in our list of elements would look something like this <code class="inline_code">[&lt;p&gt;, &lt;h2&gt;, &lt;p&gt;, &lt;ul&gt;, ...]</code>.
We grab the first 3 to form our abstract, and return the new XMLList.
That's our summary! The first 3 html elements from our body text. It
gets saved on our blog article object so that any time we need it, it's
available. No sense in doing this work every time. So that's it. I hope
this has given you a little taste of how things work on this blog. This
doesn't even scratch the surface of the power and convenience in using
e4x to manipulate your content.</p>




<p>Before we wrap, I have something
to confess. The get_abstract code doesn't work. This was a weird gotcha
moment in the e4x spec that I had to work around. When working with an
XMLList, calling the elements() function doesn't return the first level
children of the list. It returns the children of all of <em>those</em>
elements. So instead of my &lt;p&gt; tags I got the text nodes inside
them. Once I figured it out, there was a simple addition to account for
it. Just wrap the body in a top level node first. Then the call to
elements will give you the child nodes you expect. As an after-thought,
I've included the ability to specify the length of the abstract. Here's
the final version of the function.</p>




<pre><code><br/>function generate_abstract(elimit){<br/>    var elimit = elimit || 3;<br/><br/>    var tmpbody = &lt;div&gt;&lt;/div&gt;;<br/>    tmpbody.appendChild(this.body);<br/>    tmpbody = tmpbody.elements();<br/><br/>    var abs = &lt;&gt;&lt;/&gt;;<br/>    for(var idx in tmpbody){<br/>        abs += tmpbody[idx];<br/>        if(abs.length() &gt;= limit) break;<br/>    }<br/> <br/>   return abs;<br/>}</code></pre>




<p>Oh
yeah, replacing the full text on the home page with the abstract text
was pretty simple. Instead of calling this.body, call
this.get_abstract. Pretty straight up. Enjoy the shorter home page.</p>]]></description>
                <pubDate>Sat, 17 Jan 2009 02:11:28 GMT</pubDate>
	</item><item>
		<title>Why you should be using an Object Database instead of ORM: Part 1</title>
		<link>http://marcorogers.com/blog/01-08-2009/why-you-should-be-using-an-object-database-instead-of-orm-part-1</link>
									    <description><![CDATA[<p><strong>I think traditional relational databases (RDBMS) are generally crappy for as the data store for complex dynamic web sites.</strong>&#160;
But despite the inflammatory nature of that first sentence, I'm going
to try not to turn this into a rant.&nbsp; Instead, I'll try to explain
the problems I see and why I came to that conclusion.</p>






<h2>The problem with RDBMS</h2>






<p>First of all, I don't have a problem with RDBMS.&nbsp; I think it
has served us very well up to this point and will continue to do so for
the forseeable future.&nbsp; It's a perfectly workable solution to the
problem of storing and retrieving persistent data.</p>






<p>I don't think anyone will take issue with that argument.&nbsp; So
what's wrong with relational databases?&nbsp; The answer has been
getting a lot of attention lately so I'll keep it simple and let
Wikipedia define it for me.&nbsp; <a href="http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch">Impedance Mismatch</a>.&nbsp;
I pretty much agree most of the points listed, and several of them can
be rolled up into one argument.&nbsp; Essentially, RDBMS doesn't fit
the object-oriented way we like to use data on the web.</p>






<p>The last sentence is important, because it puts some necessary
context on the argument I'm making.&nbsp; I'm gonna go out on a limb
and say that the majority of working web professionals have bought into
object-oriented programming.&nbsp; That's not to say most people
program this way.&nbsp; PHP is still the most popular web language and
many people still generate pages in a very top down imperative
way.&nbsp; (I'm one of those people who thinks PHP lends itself to this
style, but that's a different rant... I mean discussion).&nbsp; Also,
some functional languages like <a href="http://www.haskell.org/">Haskell</a> and <a href="http://clojure.org/">Clojure</a> are getting attention as being viable for web programming.</p>






<p>But whenever I see examples of people doing anything useful, I see a trend.&nbsp; <strong>We like to work with object-like data.</strong>&nbsp;
More and more websites are being built to provide access to bigger and
more complex collections of data.&nbsp; Movies on Netflix, People and
their friends on Facebook even boring stuff like all of Physicians in
your Insurance network under your employee health benefits plan.&nbsp;
So it's more and more essential for programmers to be able to create a
good <a href="http://en.wikipedia.org/wiki/Mental_model">mental model</a>
of the data and how to work with it.&nbsp; Creating objects
representing these different data collections and then composing them
together seems to be the best thing going.</p>






<p>When using an RDBMS, in the simplest form, "object-like" just means
lists or arrays that represent rows in the database.&nbsp; This is
generally where PHP falls.&nbsp; You use PDO or some equivalent, write
your SQL statements and you can access your data like this.</p>






<p><code>$get_my_employee = 'select * from "Employee"';<br/>
$emloyee = $db-&gt;query($get_my_employee).fetch();  // simplified on purpose.  you get the point<br/>
echo $employee["First Name"];<br/>
echo $employee["Last Name"];<br/>
echo $employee["Spouse"];</code></p>






<p>Not too bad, except for that first bit, but it seems harmless enough
so lets ignore it for now.&nbsp; It's just a collection of related data
points representing some information on an employee.&nbsp; But things
are rarely this simple, and that last line looks suspicious too.&nbsp;
Because we're all about normalization and proper organization of our
data, we've split all of our Spouses into a separate table and linked
them through a foreign key. So making a long story short, that first
line isn't so harmless anymore.&nbsp; You have to do your join and
specify the fields you want and put your necessary filter clauses on it
until you get all your data in one fell swoop.</p>






<pre><code>$get_my_employee = 'select e."First Name", e."Last Name", e."Phone Number", ... s."First Name" from "Employee" e, "Spouse" s where e."SpouseID" = 'schmoopie' and e."SpouseID" = s."ID"...';</code></pre>






<p>I put in ellipses in place of some details to speed things
along.&nbsp; But depending on the complexity of your database schema,
those ellipses are hiding some headaches.&nbsp; Not to mention the fact
that you have two columns with the same name that represent different
data points ("First Name").&nbsp; It's left as an exercize for you to
determine which is which by adding even more code.&nbsp; Fun times.</p>






<p>But eventually you end up with one long array with the employee
you're interested in along with all the data about their Spouse as
well.&nbsp; You completed your task but the journey was a pain, and
don't even get me started on debugging and maintaing that long SQL
string.</p>






<h2>The Problem with ORM</h2>






<p>Okay, I think I made the last section a sufficiently irritating
explanation of what we already know.&nbsp; I wanted to go through this
to drive home a point though. Problems like this are the reason that
Object-Relational Mapping (ORM) is all the rage right now.</p>






<p>ORM allows us to take those nasty details and abstract them
away.&nbsp; We can get nice simple objects to work with and get back to
the real business of making our web page do something cool.&nbsp; More
importantly, it allows us to deal with the relationships between our
data items in a sane fashion.&nbsp; No more jumping through hoops to
get all of our data points into one row. &nbsp; Let's switch to
Python/Django just because I haven't worked with any PHP ORMs yet.</p>






<p><code><br/>
employee = Employee.objects.get(id=1)<br/>
print employee.first_name<br/>
print employee.last_name <br/><br/>
spouse = employee.spouse<br/>
print spouse.first_name</code></p>






<p>Ah, that's more like it.&nbsp; Even my non-programmer friends (who's
eyes glaze over when I talk about code) can piece together what's going
on here.&nbsp; And that first line replaces the previous unpleasantness
with all the ellipses. So what's my beef with this?&nbsp; On a
theoretical level, nothing.&nbsp; I'm a fan of Django precisely for
this reason. But from a more practical perspective, this sets off that
nervous twitch I get when something is way harder than it needs to
be.&nbsp; That RDBMS is still there.&nbsp; Lurking.&nbsp; The ORM
evangelists will respond with "yeah, but you don't have to worry about
it".&nbsp; First off, I call bullshit on that.&nbsp; It never works out
that way.&nbsp; But let's say we're drinking the kool-aid today and I
believe that.&nbsp; The spirit of ORM is to literally take something
that was designed to work a certain way (RDBMS + SQL), and take lots of
time and effort to make it work a different way (Objects + simple
filter functions).&nbsp; Wrapping it in layers of abstraction until it
doesn't even look like itself.&nbsp; Let's talk about some of the
problems.</p>






<h3>It's an Abstraction.</h3>






<p>When I first started looking at ORM, I thought this was a good
idea.&nbsp; Maybe because I was already working with objects as data on
a regular basis.&nbsp; One of the platforms I started out on was <a href="http://zope.org/">Zope</a>,
which is built on a datastore that represents actual Python objects
composed together in a manner of your choosing.&nbsp; It has it's own
issues, but in terms of web programming, it felt natural.&nbsp; It took
a while before I got "comfortable" with SQL. It has always felt, for
lack of a better word <em>icky</em>.  The developers of Django's ORM understand this.  If you look at the <a href="http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships">documentation for Django Querying</a>,
the api goes through great pains to insure that you can avoid the
ickiness.&nbsp; You can represent almost any complex query without
writing SQL.</p>






<pre><code><br/>## The example assumes you have a Model representing a Blog and this has a number of Entries related to it.<br/>##  To select all blogs that contains entries with <em>"Lennon"</em> in the headline and were published in 2008, we would write:<br/>Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)</code></pre>






<p>I'm sure the last of my non-programmer friends have drifted away
after that. But if you are a programmer and you're trying to get a
handle on how this works, you run into the following bit of nastiness <em>before you even get to this example.</em></p>






<blockquote><p>To handle both of these situations, Django has a consistent way of processing <span class="pre">filter()</span> and <span class="pre">exclude()</span> calls. Everything inside a single <span class="pre">filter()</span> call is applied simultaneously to filter out items matching all those requirements. Successive <span class="pre">filter()</span>
calls further restrict the set of objects, but for multi-valued
relations, they apply to any object linked to the primary model, not
necessarily those objects that were selected by an earlier <span class="pre">filter()</span> call.</p><p>That may sound a bit confusing, so hopefully an example will clarify. (the above code example follows)</p></blockquote>






<p>Even the developers of one of the best schemes out there (in my
opinion) have to admit that they've got some crazy juju going on under
the hood.&nbsp; This is because they have to take what you're trying to
do and put the ick back into it.&nbsp; These simple filters get
translated into not so simple SQL.&nbsp; And to top things off, they
frequently try to help you along by giving you the equivalent example
in SQL.&nbsp; So you frequently end up doing double work.&nbsp;</p>






<ul>
    <li>Step 1) How would I do this with a complex SQL query?</li>
    <li>Step 2) How do I translate Step 1 to my nifty ORM api so I can get my data as objects?</li></ul>






<h3>It leaks</h3>






<p>The complexity of the ORM scheme leaves you wide open for leaky
abstraction problems.&nbsp; And often times, when you run into these,
you <a href="http://gasi.ch/blog/the-law-of-leaky-abstractions/">lose a lot of the time you saved</a> by using the abstraction in the first place.</p>






<h3>If it doesn't work, you're back where you started</h3>






<p>Is this really an acceptable trade-off to be able to work with
object-like data?&nbsp; Absolutely.&nbsp; Hence the popularity of
Django and Ruby on Rails and Symphony (or whatever php framework is
actually in style these days)&nbsp; But to boil it down to the point of
this post.&nbsp; <strong>Why are we choosing to deal with this impedance mismatch when we don't really have to?</strong></p>






<p>In part 2 to this post, I'll take a shot at talking about object
databases and making a case that they should become a more common
addition to our web framework architectures.</p>]]></description>
                <pubDate>Thu, 08 Jan 2009 07:03:13 GMT</pubDate>
	</item><item>
		<title>New Year's Resolution #1: Join the Conversation</title>
		<link>http://marcorogers.com/blog/01-02-2009/new-years-resolution-1-join-the-conversation</link>
									    <description><![CDATA[<p>I'm
knocking out my first New Year's Resolution early.&#160; After 4+ years
as a web developer, I'm finally launching my own site.&nbsp; Here's why.</p>






<p>For the past several years weve seen tremendous growth in the area
of web development.&nbsp; As we started to regroup after the bubble
burst (which I just missed), there has been a pretty dramatic shift in
the way web programming is done as well as what is possible.&nbsp;
We've seen a paradigm shift from table layouts to semantic markup with
css.&nbsp; <a href="http://www.google.com/chrome">Newer</a> and <a href="http://www.mozilla.com/firefox/">better</a> browsers have given us a more stable environment to work in as well as new and exciting <a href="http://www.techcrunch.com/2008/05/29/the-next-gen-web-browser-storage-support/">capabilties</a>.&nbsp; Someone figured out what AJAX was good for and blew everybody's mind.</p>






<p>It's an exciting time to work with the web.&nbsp; For the reasons
stated above and for one other.&nbsp; It seems to me that it's been <strong>pretty easy to follow the tide of innovation</strong>.&nbsp;
With this new renaissance has come an exponential increase in online
media as well as professional and personal blogs dedicated to our
field.&nbsp; These days the flood of information comes right to your
door.&nbsp; We work in an industry where it's possible to stay on the
cutting edge of knowledge simply by putting in a few hours of online
reading a week.&nbsp; Okay maybe <a href="http://jeremy.zawodny.com/blog/archives/006487.html">several hours of reading a week</a>, but you get my point.</p>






<p>It's become apparent that the ongoing conversation about web
development has become pretty essential to me being good at my
job.&nbsp; I followed AJAX through it's stages: from a curiosity, to a
fad, to an established technique, to a mandatory resume headline.&nbsp;
And like many, I worked at a contracting/consulting company where being
a step ahead of everyone else was critical.</p>






<p>So shortly after I had this realization, I had the thought that
eventually became my resolution for 2009.&nbsp; To put it simply, it's
important to <strong>join the conversation.</strong>&nbsp; I think if you're a
professional web developer and you're involved with anything remotely
interesting, you should share it.&nbsp; Throw up your own website and
fill in the gaps in our collective knowledge.&nbsp; There's almost
certainly something you know that others can benefit from.&nbsp; And
who knows, you might even become so popular that you can <a href="http://www.codinghorror.com/blog/archives/001074.html">quit your day job</a>.&nbsp; And isn't that what we're all striving for?</p>






<p>So I put up this blog to share my thoughts and ideas, and I noticed a few things right off the bat.</p>






<ul>
    <li>I don't know why it took so long to get around to
it.&nbsp; The hardest part was picking a name for the blog (thanks
Walter).&nbsp; If you've been procrastinating... stop it.</li>
    <li>If
you're purely a developer like me, then forget what I just said.&nbsp;
The design will be the biggest pain in the ass.&nbsp; I'm not using an <a href="http://wordpress.com/">established blogging platform</a> that has <a href="http://wordpress.org/extend/themes/">free design templates</a> available, so I cobbled this together myself.</li>
    <li><strong>When you're working on something of your own, you're more motivated to improve it</strong>.&nbsp; This one was pretty big for me so I'll elaborate.</li></ul>






<p>I mentioned that I used to work as a consultant.&nbsp; Well now I'm
part of an in-house IT shop, and there is a marked difference.&nbsp;
I'm not sure if others who work in-house have seen this.&nbsp; I found
that the things I do at work are so far removed from my current
personal interests in the field, that I wasn't finding the motivation
to work on my own projects as much.&nbsp; Perhaps it was too much of a
context switch.&nbsp; Now it makes more sense to stay abreast of new
developments in php and postgres than javascript and REST.&nbsp; So not
only did I have less time for side projects but less ideas and less
inclination to pursue them.</p>






<p>But putting together this website has rejuvenated my enthusiasm (and
evidently my vocabulary as well).&nbsp; Not only do I have a platform
to implement my own things, but I have the impetus to do so.&nbsp; In
my mind, joining the conversation doesn't just mean talking about what
you already know.&nbsp; It means talking about what you're doing.&nbsp;
It means letting us in on the things you're learning as you continue to
gain experience.&nbsp; For instance, the wysiwyg I'm using to write
this post doesn't have a tool for hyperlinking text.&nbsp; Can you
imagine!&nbsp; What is this 1999?&nbsp; Well this will be remedied in
the near future.&nbsp; And you'll be able to feel my sense of
satisfaction.&nbsp; You'll hear about other things too.&nbsp; Like what
it's like to work with a <a href="http://axiomstack.com/">real server-side javascript platform</a>.</p>






<p>Anyway, if you're interested, stick around.&nbsp; Otherwise, go get your own site started and join the conversation.</p>






<p>Oh, and let me know if anything is broken on the site.&nbsp; It's still pretty raw.</p>]]></description>
                <pubDate>Fri, 02 Jan 2009 08:18:36 GMT</pubDate>
	</item></channel>
</rss>