<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>firsttube.com &#187; Programming</title>
	<atom:link href="http://firsttube.com/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://firsttube.com</link>
	<description>crunchy nuggets, served semi-daily</description>
	<lastBuildDate>Wed, 10 Mar 2010 03:38:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<atom:link rel='hub' href='http://firsttube.com/?pushpress=hub'/>
		<item>
		<title>Gotta Love Unsanitized Inputs</title>
		<link>http://firsttube.com/read/gotta-love-unsanitized-inputs/</link>
		<comments>http://firsttube.com/read/gotta-love-unsanitized-inputs/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 14:49:52 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Funny]]></category>
		<category><![CDATA[Phish]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttube.com/?p=1590</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img src="http://firsttube.com/uploads/2010/03/phish-injection-500x258.jpg" alt="" title="phish-injection" width="600"  class="alignright size-medium wp-image-1591" /></p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/gotta-love-unsanitized-inputs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript Ninja!</title>
		<link>http://firsttube.com/read/javascript-ninja/</link>
		<comments>http://firsttube.com/read/javascript-ninja/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 18:48:56 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttube.com/?p=1531</guid>
		<description><![CDATA[Thank you, John Resig. Because of you, I&#8217;m learning about Javascript the way Andy Gadiel taught me HTML. In the days before server-side scripting, I learned my first bits of HTML largely by viewing the source of Andy Gadiel&#8217;s Phish page (which, for some reason, remains largely unchanged since ~1997).  By reading Gadiel&#8217;s HTML, I [...]]]></description>
			<content:encoded><![CDATA[<p>Thank you, <a href="http://ejohn.org">John Resig</a>. Because of you, I&#8217;m learning about Javascript the way <a href="http://gadiel.com">Andy Gadiel</a> taught me HTML. In the days before server-side scripting, I learned my first bits of HTML largely by viewing the source of <a href="http://gadiel.com/phish">Andy Gadiel&#8217;s Phish page</a> (which, for some reason, remains largely unchanged since ~1997).  By reading Gadiel&#8217;s HTML, I slowly pieced together my own understanding of HTML.  It was <a href="http://www.amazon.com/gp/product/0789720248?ie=UTF8&amp;tag=firsttubecom-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0789720248">Joe Burns&#8217; fantastic Javascript Goodies</a> that first had me dipping my n00b fingers into client side active scripting.  I picked up CSS all over the web.</p>
<p>Resig&#8217;s jQuery is so powerful and so easy that even with basic knowledge of CSS and Javascript, anyone can be a virtual scripting master.  It&#8217;s so easy, that I&#8217;ve slacked on learning about javascript objects, inheritance, closures, anonymous functions, prototypes, and scores of  other Javascript staples that I should&#8217;ve long since mastered.   I just discovered John&#8217;s new web app, cleverly titled &#8220;<a href="http://ejohn.org/apps/learn/">Learning Advanced Javascript</a>&#8220;, and so far, so good!</p>
<p>I wrote this myself and understand why it works, which is much more than I could say yesterday.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> ninja <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	walk<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>steps<span style="color: #339933;">,</span>turn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		toDo <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Walking '</span><span style="color: #339933;">+</span>steps<span style="color: #339933;">+</span><span style="color: #3366CC;">' steps forward, then turning '</span><span style="color: #339933;">+</span>turn<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	star<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>action<span style="color: #339933;">,</span>distance<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		toDo <span style="color: #339933;">=</span> toDo<span style="color: #339933;">+</span><span style="color: #3366CC;">' '</span><span style="color: #339933;">+</span>action<span style="color: #339933;">+</span><span style="color: #3366CC;">'ing star '</span><span style="color: #339933;">+</span>distance<span style="color: #339933;">+</span><span style="color: #3366CC;">' feet'</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	then<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		toDo <span style="color: #339933;">=</span> toDo<span style="color: #339933;">+</span><span style="color: #3366CC;">', then '</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	doIt<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		log<span style="color: #009900;">&#40;</span>toDo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
ninja.<span style="color: #660066;">walk</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'7'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'south'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">star</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'throw'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'50'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">doIt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Output:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&gt; Walking 7 steps forward, then turning south, then throwing star 50 feet</pre></div></div>

<p>It&#8217;s clear to me &#8211; and has been for some time &#8211; that the future of the web, for better or for worse, rests heavily on the mighty shoulders of client side scripting.   Building on powerful, extensible frameworks like <a href="http://jquery.com">jQuery</a> and <a href="http://mootools.net">MooTools</a>, the next generation of web apps is sure to compete with the desktop.  The ability to understand how to utilize the frameworks when necessary and hack together powerful scriptlets for other purposes seems essential to success in the future web. I know I&#8217;ll be investing in &#8220;<a href="http://www.amazon.com/gp/product/193398869X?ie=UTF8&amp;tag=firsttubecom-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=193398869X" target="_blank">Secrets of a Javascript Ninja</a>&#8221; just as a result of this tutorial.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/javascript-ninja/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Offline: The Silly Script Disaster</title>
		<link>http://firsttube.com/read/Offline-The-Silly-Script-Disaster/</link>
		<comments>http://firsttube.com/read/Offline-The-Silly-Script-Disaster/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 12:33:59 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/Offline-The-Silly-Script-Disaster</guid>
		<description><![CDATA[I have several websites.  The way my web host has them set up, like many hosts who use cPanel, is that one site is a &#8220;master&#8221; and the others essentially exist as directories within that site.  My master site is smallaxesolutions.com, which is the &#8220;company&#8221; under which I sometimes do my web design [...]]]></description>
			<content:encoded><![CDATA[<p>I have several websites.  The way my web host has them set up, like many hosts who use cPanel, is that one site is a &#8220;master&#8221; and the others essentially exist as directories within that site.  My master site is <a href="http://smallaxesolutions.com">smallaxesolutions.com</a>, which is the &#8220;company&#8221; under which I sometimes do my web design and network support business.  </p>
<p>One of the things I (used to) do as Small Axe Solutions was publish the core code of the engine that powers firsttube.com, <a href="http://firsttube.com/tag/small_axe">Small Axe</a>.  Small Axe code was built up as 0.1, then 0.2, then 0.3.  At that point, I had added several features to <a href='http://firsttube.com'>firsttube.com</a> that I had yet to merge upstream into Small Axe. So, I created a build system so I could slowly integrate the changes.  In short, it worked like this: I had a directory called &#8220;build_source&#8221; which contained my current code.  Of course, it had all kinds of problems out of the box, like the config files which pointed to nonsensical location like <i>/path/to/your/blog/</i>.  It had no valid database connection info. The flatfiles were unwritable.  So, in short, the code was (usually) solid, but PHP couldn&#8217;t compile it.  </p>
<p>Meanwhile, another directory called &#8220;demo&#8221; was waiting silently.  </p>
<p>Lastly, a third directory, outside the web root, called &#8220;static&#8221; was sitting with pre-built config files, db connection files, and some other stuff.  </p>
<p>Then it was just a matter of a simple shell script.  The script did the following: it deleted everything in the &#8220;demo&#8221; directory.  Then it copied all of the files in the &#8220;build_source&#8221; directory into the demo directory.  It deleted the config file and overwrote it with a copy from the &#8220;static&#8221; directory.  Same for the db connection and a few other files.  It left the demo directory as a live, fully functional build of the current code.  Then it zipped everything in the &#8220;build_source&#8221; directory and put it into my downloads section.  It ran this script every 30 minutes for probably 2 years now.  I only chose 30 minutes because it made sense from a development standpoint to see the updates quickly.  I stopped working on that version some time ago, but never got around to updating or changing the script.  </p>
<p>Fast forward to a few weeks ago, I was cleaning out a bunch of old directories.  Within 5 minutes, EVERYTHING was gone: my mail, *all* of my sites, my temp files, everything in my home directory that wasn&#8217;t a hidden file preceded with a dot.  I didn&#8217;t realize this for several hours, but I then I restored from a backup and within 45 minutes, everything was gone again! Oh noes! </p>
<p>I immediately begin researching security and disabling all of my upload scripts.  Something is wrong, I thought.  I searched high and low.  But, as you guessed, I didn&#8217;t find anything wrong, because there was nothing wrong.  In my cleanup, as you may have gussed by now, I decided to delete the &#8220;demo&#8221; folder.  The first line of my shell script is &#8220;<i>cd /home/adam/public_html/build_source</i>.&#8221;  Then second, scary line, is &#8220;<i>rm -rf *</i>&#8220;.  Since there was no &#8220;build_source&#8221; folder, the first line flat out failed, leaving the script in <i>/home/adam</i>.  Then, unfortunately, it ran <i>rm -rf *</i> in the root of my home directory.  Killer! </p>
<p>It took my some time to swallow my own stupidity.  All I had to do was comment out the cron job to prevent this disaster.  But alas, I dropped the ball.  We&#8217;re back online now, and a little smarter.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/Offline-The-Silly-Script-Disaster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blinking Images With Javascript</title>
		<link>http://firsttube.com/read/blinking-images-with-javascript/</link>
		<comments>http://firsttube.com/read/blinking-images-with-javascript/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 13:22:34 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/Blinking-Images-With-Javascript</guid>
		<description><![CDATA[I needed to have an image blink in one of our intranet applications today, so I wrote this quick javascript to accomodate.  There aren&#8217;t many good image blinker scripts online, so I&#8217;m adding mine to the mix:
Start by adding this to your javascript file:

function blinkId&#40;id&#41; &#123;
	var i = document.getElementById&#40;id&#41;;
	if&#40;i.style.visibility=='hidden'&#41; &#123;
		i.style.visibility='visible';
	&#125; else &#123;
		i.style.visibility='hidden';
	&#125;
   [...]]]></description>
			<content:encoded><![CDATA[<p>I needed to have an image blink in one of our intranet applications today, so I wrote this quick javascript to accomodate.  There aren&#8217;t many good image blinker scripts online, so I&#8217;m adding mine to the mix:</p>
<p>Start by adding this to your javascript file:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> blinkId<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>i.<span style="color: #660066;">style</span>.<span style="color: #660066;">visibility</span><span style="color: #339933;">==</span><span style="color: #3366CC;">'hidden'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		i.<span style="color: #660066;">style</span>.<span style="color: #660066;">visibility</span><span style="color: #339933;">=</span><span style="color: #3366CC;">'visible'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
		i.<span style="color: #660066;">style</span>.<span style="color: #660066;">visibility</span><span style="color: #339933;">=</span><span style="color: #3366CC;">'hidden'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
    setTimeout<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;blinkId('&quot;</span><span style="color: #339933;">+</span>id<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;')&quot;</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>And this right before you end your &lt;html&gt; tag:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>blinkId<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'YOUR_ELEMENT_ID'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>This will work for images, divs, spans, pretty much any block level element with an id.</p>
<p><strong>Updated 8/19/2008</strong>: Fixed a copy/paste bug in this post.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/blinking-images-with-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>An Argument for PHP</title>
		<link>http://firsttube.com/read/An-Argument-for-PHP/</link>
		<comments>http://firsttube.com/read/An-Argument-for-PHP/#comments</comments>
		<pubDate>Sun, 11 May 2008 19:46:11 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/An-Argument-for-PHP</guid>
		<description><![CDATA[Currently, over on Slashdot, there is an article on forthcoming features in PHP version 6.  And, like most PHP articles, the comments section is flooded with jackasses arguing that PHP sucks as a language.  I get frustrated by the entire &#8220;PHP sucks&#8221; campaign, largely because it&#8217;s like the HTML e-mail argument &#8211; mostly [...]]]></description>
			<content:encoded><![CDATA[<p>Currently, over on <a href="http://slashdot.org">Slashdot</a>, there is an article on <a href="http://tech.slashdot.org/article.pl?sid=08/05/11/1939240">forthcoming features in PHP version 6</a>.  And, like most PHP articles, the comments section is flooded with jackasses arguing that PHP sucks as a language.  I get frustrated by the entire &#8220;PHP sucks&#8221; campaign, largely because it&#8217;s like the HTML e-mail argument &#8211; mostly driven by the fact that it&#8217;s stylish to hate them &#8211; but I&#8217;m going to go further.  I argue than <i>everyone</i> posting about how PHP is a <i>bad language as a whole</i> is <strike>an idiot. Every single one.  Each is a foolish, arrogant, nerd <b>sheep</b> who can&#8217;t think for themselves</strike>. <span style="color:#777;"><b>Update 5/14/08 20:39 UTC</b>: Okay, this piece was linked by several sources, and the truth is, I had just read some George Carlin, so I was probably more aggressive than I intended to be.  What I really mean is that people posting about how PHP is a <i>bad language as a whole</i> without citing any reasons are generally following a trend, trying to look cool, or too narrow-minded to be considered credible.  And the responses I&#8217;ve seen across the net have, thus far, supported this argument. </span></p>
<p>Why?  Let&#8217;s argue for a second that everything people say about PHP is true, as many of the complaints are sound.  </p>
<p>It&#8217;s true the primary namespace has way too many functions &#8211; over three thousand, I&#8217;m told.  It&#8217;s true that the function names are inconsistent, some have underscores, some don&#8217;t.  It&#8217;s true that the function names are often verbose.  It&#8217;s true that OOP was weak until recently, it&#8217;s true that <i>register_globals</i> was a security nightmare.  All those things are potential issues, and all languages have them.  As the &#8220;real programmers&#8221; who write Perl would never admit, reading other people&#8217;s terse Perl is often a f&#8217;ing disaster, even for seasoned Perl-ites.  And when using compiled ASP.net &#8211; for best performance, natch &#8211; you must update your entire site (well, all the concerned ASPX pages and DLLs) to make elementary changes.  </p>
<p>That said, PHP is easy.  Really easy.  And it&#8217;s a trivial task to get a website up and running fairly quickly.  And you can serve enormous amounts of traffic as proven not only by <a href='http://osnews.com'>OSNews</a> (who have been dugg and Slashdotted concurrently), but by Yahoo!, Wikipedia, Flickr, Facebook, and many, many others.   And why are there <i>so many</i> open source PHP frameworks, apps, CMSes, etc? Because PHP is installable virtually everywhere, it&#8217;s very portable, and it&#8217;s really simple to hack up.  Try installing something dependent on mod_perl (e.g. <a href="http://slashcode.com">Slash</a> or <a href="http://scoop.kuro5hin.org">Scoop</a>) and get back to me on the ease of the install.  </p>
<p>The fact is, even if everyone&#8217;s fears about writing insecure code is true, the ability to make mistakes does not mean everyone does, and those who would forsake &#8220;<b>the right tool for the job at hand</b>&#8221; shouldn&#8217;t be trusted even to water your plants, because they are obviously nitwits.  If you can&#8217;t concede that PHP can be the right tool <i>some</i> of the time for <i>some</i> situations, you shouldn&#8217;t be trusted to code or make adult decisions.  No, I argue that the reason they dislike PHP is because many start with PHP and thus, admitting to liking it would make them appear to be a &#8220;noob.&#8221; It&#8217;s because they must appear to be seasoned pros.  It&#8217;s the bragging rights on the 21st century.  </p>
<p>Nobody has ever claimed PHP is the solution to everything, but it is a remarkably easy tool for scripting dynamically generated HTML.  And, in my opinion and experience, it does so better than Perl, better than Ruby, and a hell of a lot better than both ASP.net and JSP.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/An-Argument-for-PHP/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Dope Wars for the iPhone</title>
		<link>http://firsttube.com/read/Dope-Wars-for-the-iPhone/</link>
		<comments>http://firsttube.com/read/Dope-Wars-for-the-iPhone/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 10:40:15 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/Dope-Wars-for-the-iPhone</guid>
		<description><![CDATA[I love my jailbroken iPhone, and I am always looking for a new &#8220;game of the week.&#8221;  I&#8217;ve been through several, at first, it was LightsOff, but that ends at 225 levels or so.  Then it was Five Dice.  Then 4 Balls, Domino, and finally PuzzleManiak.  I was so happy recently [...]]]></description>
			<content:encoded><![CDATA[<p>I love my jailbroken iPhone, and I am always looking for a new &#8220;game of the week.&#8221;  I&#8217;ve been through several, at first, it was LightsOff, but that ends at 225 levels or so.  Then it was Five Dice.  Then 4 Balls, Domino, and finally PuzzleManiak.  I was so happy recently when someone decided to port <a href="http://en.wikipedia.org/wiki/Dope_Wars">Dope Wars</a> to the iPhone in the form of &#8220;<a href="http://www.modmyifone.com/forums/showthread.php?t=112711">iDope</a>.&#8221;</p>
<p><img src="http://firsttube.com/uploads/iDope.jpg" alt="iDope" align="right" /> iDope currently has a lot of bugs.  Mainly, your jacket storage is irrelevant, you can actually store unlimited items, you just can&#8217;t buy unlimited items unless you hit &#8220;buy all.&#8221;  You can&#8217;t store money in a bank.  It never ends until you die.  You are mugged or fight the cops maybe 80% of the time you travel.  But most importantly, this: </p>
<p>Notice my dollars? That&#8217;s right, I have $2,147,483,647. Two billion, one hundred forty seven million, four hundred eighty three thousand, six hundred forty seven dollars.  Recognize that number? If you read my blog regularly, you might.  After all, it&#8217;s the <a href="http://firsttube.com/read/Integers-on-the-Intertubes">upper limit of signed integers</a>. The game is officially boring &#8211; no matter what I do, I&#8217;m always capped at that number, I can never get more money.  I wonder if the iPhone can support BIGINT.  </p>
<p>Anyway, I really hope to see iDope get some love and attention, because Dope Wars is a fabulous and addictive game, but as is, I eventually get to the upper limit and have to start over&#8230; and over&#8230; and over.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/Dope-Wars-for-the-iPhone/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Integers on the Intertubes</title>
		<link>http://firsttube.com/read/integers-on-the-intertubes/</link>
		<comments>http://firsttube.com/read/integers-on-the-intertubes/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 16:22:44 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/Integers-on-the-Intertubes</guid>
		<description><![CDATA[Some time ago, I wrote an application for my company.  Like most weblets I&#8217;ve written, this used PHP and either MySQL or MSSQL for the backend.  This particular application logged all phone calls. As part of the record, it would record the caller&#8217;s account number, which is a 5 or 6 digit integer.
So, [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago, I wrote an application for my company.  Like most weblets I&#8217;ve written, this used PHP and either MySQL or MSSQL for the backend.  This particular application logged all phone calls. As part of the record, it would record the caller&#8217;s account number, which is a 5 or 6 digit integer.</p>
<p>So, I got a phone call from the director of our customer contact department this week.  He was concerned about the reports.  He made a decision last week that when a call came in that was a lead &#8211; in other words, a non-customer, that his people would fill the phone number from the caller ID into the account number field.  But when he ran his export reports, he found that hisn techs had entered this phone number for ALL of the calls: 429-496-7295.  That&#8217;s weird, he said.  So he called me and asked why that was.  I checked all the calls and most were from one woman, so my first instinct was &#8220;Check if her browser has autocomplete turned on&#8221;.  But he swore that he tried it too and gotten the same result.</p>
<p>I checked the database and sure enough, it was right there: 429-496-7295, in all of the fields.  So I went back to the code.  In short, I took the input from the form, and declared it like this:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$accountnum</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'accountnum'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pretty straightforward: explicitly declare the type.  So, I started my debugging by attempting to manually enter the data into the database.  Sure enough: the account key field showed this: 4294967295.</p>
<p>So, I went back to the PHP and started by dumping out the raw SQL query:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">INSERT INTO calls <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'4294967295'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>What? So the database automatically converts it to this weird phone number and PHP does too?  Suddenly it occured to me. One of the benefits of 64-bit computing is the ability to address more memory.  There are limits to what can be done in 32-bit computing, and one is that <a href="http://en.wikipedia.org/wiki/Integer_(computer_science)">integers have a limit</a>!  In this case, a database field called &#8220;integer&#8221; is limited to numbers between -2,147,483,648 and +2,147,483,647.  It just so happens that the number is the same length as a US phone number &#8211; 10 digits.  Changing the db field to &#8220;BIGINT&#8221; allowed me to manually run the SQL query and it worked.  But the app still didn&#8217;t.</p>
<p>PHP&#8217;s int() and (int) $var syntaxes both conform to the integer limit.  So I devised a work around:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$ac</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'accountnum'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ac</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$ac</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$ac</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<p>It&#8217;s not gorgeous, but it will more than suffice for an internal app.  We web programmers don&#8217;t usually have to deal with big integers, so it&#8217;s totally possible that web developers would never have had occasion to handle a situation like this.  Here&#8217;s looking forward to native 64-bit for our next server, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/integers-on-the-intertubes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OSNews 4, Yet Again</title>
		<link>http://firsttube.com/read/OSNews-4-Yet-Again/</link>
		<comments>http://firsttube.com/read/OSNews-4-Yet-Again/#comments</comments>
		<pubDate>Thu, 25 Jan 2007 19:08:40 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[OSNews]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/OSNews-4-Yet-Again</guid>
		<description><![CDATA[I have carried on more than I probably should about OSNews 4 recently, but it&#8217;s because I&#8217;ve been doing so much work on it. The site is mostly functional &#8211; nearly all the heaviest lifting is done, large parts are implemented and working.  
As of today, we have AJAX moderation, super improved comment reply [...]]]></description>
			<content:encoded><![CDATA[<p>I have carried on more than I probably should about <a href='http://osnews.com'>OSNews</a> 4 recently, but it&#8217;s because I&#8217;ve been doing so much work on it. The site is mostly functional &#8211; nearly all the heaviest lifting is done, large parts are implemented and working.  </p>
<p>As of today, we have AJAX moderation, super improved comment reply mechanism that allows you to quote an author, and a new, experimental system called &#8220;starring,&#8221; not stolen from Google but awfully like it.  You can &#8220;star&#8221; stories much like a story bookmark, you can bookmark comments to later refer to, and you can &#8220;recommend&#8221; stories, which are stories you think other <a href='http://osnews.com'>OSNews</a> readers should check out.  </p>
<p>I also added a nice touch feature &#8211; user avatars.  I think avatars help users to recognize each other, and they add some &#8220;spice&#8221; to an otherwise simple look.  I&#8217;m pretty excited about it, but obviously will not be building the upload form until my image resize scripts are ready.  I generated my own avatar, now I need to find a nice way to resize in a secure fashion.  It&#8217;s all very cool. To do what sites like Flickr do, I think I&#8217;d need Flash, so it&#8217;s pretty simple: you upload and I resize to avatar dimensions.  </p>
<p>So moderation is all AJAX based now, which is really super cool, and works just like you&#8217;d expect &#8211; you can vote up or down, the score updates, the comment collapses when voting down&#8230; it&#8217;s exactly what I wanted when I envisioned it.  Soon it will throw useful error messages instead of v3 error &#8220;codes.&#8221;  </p>
<p>I hope to have the comment and submission forms working soon.  If all goes well, we&#8217;ll do a public beta in February or March and rollout this spring.  Promises to be very exciting.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/OSNews-4-Yet-Again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OSNews 4 Outline</title>
		<link>http://firsttube.com/read/osnews-4-outline/</link>
		<comments>http://firsttube.com/read/osnews-4-outline/#comments</comments>
		<pubDate>Wed, 17 Jan 2007 19:11:12 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[OSNews]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/OSNews-4-Outline</guid>
		<description><![CDATA[At the request of some of my readers, I am going to continue to discuss some OSNews development.  If you are not interested in the technical bits, this piece is not for you, however, if you are, read on for an account of how OSNews 4 will work.

Although I never really made this public, [...]]]></description>
			<content:encoded><![CDATA[<p>At the request of some of my readers, I am going to continue to discuss some <a href='http://osnews.com'>OSNews</a> development.  If you are not interested in the technical bits, this piece is not for you, however, if you are, read on for an account of how <a href='http://osnews.com'>OSNews</a> 4 will work.<br />
<span id="more-229"></span><br />
Although I never really made this public, the <a href="http://jobs.osnews.com">Jobs.OSNews</a> site was really a prototype for how I see <a href='http://osnews.com'>OSNews</a> looking and feeling.  In the sense that the screen is not too crowded but has plenty of control, the basic colors are still a smooth green, there is plenty of white space and liberal use of Javascript where necessary.  </p>
<p>I&#8217;ve also discarded the concept of &#8220;collapsed threading&#8221; vs. &#8220;expanded threading.&#8221;  All threads will be expanded, because it&#8217;s less code and it&#8217;s easier to maintain.  Building on that, comments below your &#8220;threshold&#8221; will not require a reload, but rather just an &#8220;expand&#8221; to be viewed.  Lots of things, like viewing below-threshold comments, moderation, etc will not require a page load.  Only some of this requires actual AJAX, the rest is just Javascript. </p>
<p>I&#8217;ve also cleaned up the URIs quite a bit.  First off, pages no longer have a file extension.  If we one day rewrite the site in Python, or Ruby on Rails, or whatever, we&#8217;ll be future compatible.  I will be redircting all working pages to the proper page in the new site, so links will still work.  It will be nice to reference my comments at www.osnews.com/user/ascheinberg/comments, my bookmarks at www.osnews.com/user/ascheinberg/bookmarks, my &#8220;starred stories&#8221; (more on that below) at www.osnews.com/user/ascheinberg/starred, my friends and fans at www.osnews.com/user/ascheinberg/relationships, and my public profile at just www.osnews.com/user/ascheinberg.  </p>
<p>That said, several of the pages that exist now will go bye-bye in favor of better organized pages.  Besides just the user info pages, you&#8217;ll find that thread.php, subthread.php, permalink.php, read_thread.php all pretty much capture the same information.  Also, reply.php will be blended with the regular comment posting section.  So a code cleanup is in order.   </p>
<p>I&#8217;m rewriting in XHTML, although I&#8217;m not worrying about validation just yet.  That said, it&#8217;s almost entirely styled with CSS, and thus far, there are no tables. That&#8217;s not to say there will not be several tables, but for now, layout is solely CSS.  </p>
<p>I came up with the concept of &#8220;starred stories&#8221; because I want to make &#8220;recommendations&#8221; more of a suggestion for other readers.  I will be expanding on this point in future posts, but trust me, it will make sense or it will be left out. </p>
<p>I also am currently supporting something I&#8217;ve not decided on: avatars.  It&#8217;s not necessary, but since I wrote an image resizing script for the admin backend for automatic thumbnailing of screenshots, I can easily support an automatic resize for avatars, and honestly, they look nice.   </p>
<p>The threading implementation, believe it or not, is actually faster than the current implementation because it&#8217;s much sleeker code.  I&#8217;s very cool to quickly switch between thresholds and view modes without setting cookies or updating profiles.  </p>
<p>One of the very cool features I&#8217;ve already got working is pretty much a tagging system, except instead of liberal use of tags, it will be used to &#8220;group&#8221; stories.  Let&#8217;s say it&#8217;s time for WinHEC &#8211; we can group all stories from there as &#8220;WinHEC 2007&#8243; or something.  Or &#8220;CES.&#8221;  Or &#8220;Macworld,&#8221; &#8220;LinuxExpo,&#8221; or even &#8220;Fedora Core 7.&#8221;  It remains to be seen HOW we will use this system, but it&#8217;s already in the actual live database.  Note that it will NOT show up in the current version of <a href='http://osnews.com'>OSNews</a> (v3).</p>
<p>Lastly, for today&#8217;s OSN4 details, I have one more fun feature I&#8217;ve toyed with for some time: user defined conversations.  Essentially, it allows users to create their own <a href='http://osnews.com'>OSNews</a> article, or even just a blurb for discussion.  I don&#8217;t know the specifics, this isn&#8217;t coded yet, but I think this could be really neat &#8211; let&#8217;s say you start a conversation: &#8220;Predict the specs for the next macbooks&#8221; or &#8220;Your experiences with Windows Vista.&#8221;  Could be fun, right?   We&#8217;ll see whether or not this turns out to make the cut.  </p>
<p>Lastly, I want to share one more thing: RSS everywhere.  Every relevant page will have an RSS feed.  I&#8217;m excited about this.  </p>
<p>So far, I have a working site that displays the main pages (the index, the story page, and the comment pages, with a working working threading implementation).  More as it comes. </p>
<p>As always, all of this OSN4 stuff is subject to change.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/osnews-4-outline/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>To Thread Or Not To Thread</title>
		<link>http://firsttube.com/read/to-thread-or-not-to-thread/</link>
		<comments>http://firsttube.com/read/to-thread-or-not-to-thread/#comments</comments>
		<pubDate>Tue, 28 Nov 2006 12:30:49 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[OSNews]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Threading]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/To-Thread-Or-Not-To-Thread</guid>
		<description><![CDATA[I saw an article today called Flat or Threaded? which examines the practice of &#8220;threading&#8221; a web forum.  This has lead me to do some serious thinking about threading.  Read on for more&#8230;

Some time ago, it became apparent to me that certain implementations of threading were way too confusing for the general population. [...]]]></description>
			<content:encoded><![CDATA[<p>I saw an article today called <a href="http://www.codinghorror.com/blog/archives/000733.html">Flat or Threaded?</a> which examines the practice of &#8220;threading&#8221; a web forum.  This has lead me to do some serious thinking about threading.  Read on for more&#8230;<br />
<span id="more-267"></span><br />
Some time ago, it became apparent to me that certain implementations of threading were <strong>way</strong> too confusing for the general population.  My example was always <a href="http://slashdot.org">Slashdot</a>.  If you aren&#8217;t web savvy, you can easily get lost in the site, particularly when they have all the experimental stuff on.</p>
<p>So when I wrote OSNews, I respected Eugenia&#8217;s original decision to go flat.  But the 15 comments per page is obviously driving by one thing and one thing only &#8211; increasing page views.   Believe it or not, it&#8217;s much easier on the database to present all comments at once.  For <a href='http://osnews.com'>OSNews</a> version 4, if you choose flat mode, it will be all comments at once on one page, period.</p>
<p>I added threading for two reasons: first and foremost, we had SO MANY users asking for it.  I have the emails archived to prove it.  It was the #1 most requested feature (along with comment editing, which I also implemented).</p>
<p>The second reason, to be honest, was because *I* wanted it.  You see, readers tend to view things in the order they are presented, and they often respond without quoting a comment, so you tend to get comments like &#8220;Yes&#8221; or &#8220;I agree&#8221; or &#8220;Because the&#8230;&#8221;  With threading, you can easily following multiple conversations.  To me, threading makes much more sense than a flat view, because often times there are several sub-discussions in any given discussion.</p>
<p>So, I just completed a new section of OSNews, and for this section, I was completely unfettered.  So I did some things:</p>
<ul>
<li>All comments are displayed in one page, period.</li>
<li>Threading is mandatory</li>
<li>However, threading can only be one level deep.  In other words, you can reply to a new comment, but not to replies.  To reply to a reply, you must reply to the original comment and discussion are tracked that way.</li>
</ul>
<p>A lot of the crazy code that threading generates comes from supporting infinite replies.  This will change in OSN4; not the structure of the database, just in the presentation (or lack thereof) of the reply/quote functions.</p>
<p>Also, for this new <a href='http://osnews.com'>OSNews</a> section, there is no registration.  Any personal setting are done via cookies, nothing is kept on the server.  This makes it easier to partake without deciding to pass it over because of registration.  Of course, the issue here is that anyone can use any name and therefore impersonate someone else, but this is a small issue for a low traffic site.  What I&#8217;m getting at is that this is a standard setting and not customizable like the views on OSNews.</p>
<p>So I remain mixed on threading.  I understand that a flat view is generally easier to follow for the average Joe, but I simply don&#8217;t think that you should always cater to the dumbest possible user and build from there.  There are <a href="http://www.firsttube.com/read/A-Final-Word-on-the-Firefox-Fiasco">those who do cater to the least technical user</a>, there are those  <a href="http://www.drizzle.com/~lettvin/2006/11/windows-shutdown-crapfest.html">whose work suffers because they end up with a bland compromise</a>, and there are those who simply man up and make the decision.  Threading makes things easier to follow for *most* people with web experience, and that&#8217;s why I endorse it.  Because the heaviest participation on websites is from those who are comfortable online, and therefore, will probably appreciate the threads.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/to-thread-or-not-to-thread/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MobileQuo</title>
		<link>http://firsttube.com/read/mobilequo/</link>
		<comments>http://firsttube.com/read/mobilequo/#comments</comments>
		<pubDate>Mon, 14 Aug 2006 15:44:02 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Eugenia]]></category>
		<category><![CDATA[MobileQuo]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/MobileQuo</guid>
		<description><![CDATA[Eugenia released a little web-let called &#8220;MobileQuo&#8221; the other day, and it caught my eye.  I downloaded it and hacked it up and made some changes.  
1. This version is more secure &#8211; it won&#8217;t let the content of the feed break your HTML.  Update: Apparently, the desired behavior is to render [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://eugenia.blogsome.com">Eugenia</a> released <a href="http://eugenia.gnomefiles.org/2006/08/11/tuxtops-mobile/">a little web-let called &#8220;MobileQuo&#8221;</a> the other day, and it caught my eye.  I downloaded it and hacked it up and made some changes.  </p>
<p>1. This version is more secure &#8211; it won&#8217;t let the content of the feed break your HTML.  <b>Update</b>: Apparently, the desired behavior is to render the HTML, not to preserve the markup as markup, so the new version Eugenia has released reflects that change.  So code will be rendered, including javascript, so beware!!      <br />
2. This version outputs friendly errors.  The 1.0 version can fail if your php.ini isn&#8217;t set up right, or output a blank page if there are certain errors. <br />
3. This version is more portable and doesn&#8217;t rely on a particular PHP configuration.  <br />
4. Most differently, this version can cache the results.  This way, each reload won&#8217;t hammer an RSS feed.  Rather, the results can be cached for a perdiod and fed from cache, and then when the cache expires, it reloads the cache.  </p>
<p>The source code is here: <a href="http://dev.firsttube.com/mq/mobile.phps">MobileQuo</a>.   Note that you will need to upload a blank WRITABLE file in your MobileQuo directory.  Then just use the rest of the code from Eugenia <a href="http://eugenia.gnomefiles.org/2006/08/11/tuxtops-mobile/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/mobilequo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gnomefiles Gets Pretty URLs</title>
		<link>http://firsttube.com/read/Gnomefiles-Gets-Pretty-URLs/</link>
		<comments>http://firsttube.com/read/Gnomefiles-Gets-Pretty-URLs/#comments</comments>
		<pubDate>Mon, 07 Aug 2006 13:33:06 +0000</pubDate>
		<dc:creator>Adam S</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Eugenia]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[Gnomefiles]]></category>
		<category><![CDATA[OSNews]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://firsttubecom/read/Gnomefiles-Gets-Pretty-URLs</guid>
		<description><![CDATA[So Eugenia IM&#8217;ed me and told me that GNOME was pretty insistent about the fact that they wanted to see Gnomefiles clean up the URLs to make them more friendly.  She asked me how hard the move would be.  Having already dug pretty deep into GF code, I knew that it wouldn&#8217;t take [...]]]></description>
			<content:encoded><![CDATA[<p>So <a href="http://eugenia.blogsome.com">Eugenia</a> IM&#8217;ed me and told me that GNOME was pretty insistent about the fact that they wanted to see Gnomefiles clean up the URLs to make them more friendly.  She asked me how hard the move would be.  Having already dug pretty deep into GF code, I knew that it wouldn&#8217;t take too much effort to clean things up.  So, just a few days later, I&#8217;m pretty sure we&#8217;ve gotten all the bugs ironed out.  Apps are now accessed like this: http://gnomefiles.org/app.php/[appname] where [appname] is, obviously, the name of the application.  </p>
<p>There were a few challenges.  For one, the plus character has significance in the URL, so apps like, say, GTK+, are inaccessible.  So now we dynamically convert those titles to something like GTK_Plus.  Also, spaces are switched to underscores.  The one thing that burned me was that some apps have names that include strings like Sunbird/Calendar, which is not only URL significant, but it also breaks the code.  So unfortunately, we have convert those to pipes right now, so an app such as the previously mentioned Mozilla Sunbird/Calendar is now available at <a href="http://gnomefiles.org/app.php/Mozilla_Sunbird|Calendar">http://gnomefiles.org/app.php/Mozilla_Sunbird|Calendar</a>.  Until I have a better way to pull this off, / becomes a pipe.  </p>
<p>However, for nearly all other apps, you&#8217;ve now got a very pretty URL.  Fear not, your old URLs still work, but you&#8217;ll probably want to update your incoming links to point to the new style URL.</p>
]]></content:encoded>
			<wfw:commentRss>http://firsttube.com/read/Gnomefiles-Gets-Pretty-URLs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
