<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en"><title type="text">Spun</title><link rel="alternate" type="text/html" href="http://ginatrapani.org/spun" /><subtitle type="html">A web programmer's notebook.</subtitle><updated>1970-01-01T00:00:00+00:00</updated><generator>http://wordpress.org/?v=2.7</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><link rel="self" href="http://feeds.feedburner.com/Spun" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/MJLdyq-zhZ0/testing-pubsubhub-activation" /><category term="Atom" /><author><name>Gina Trapani</name></author><updated>2009-07-30T18:03:05-07:00</updated><id>http://ginatrapani.org/spun/?p=173</id><summary type="html">Just enabled PingShot on this blog&amp;#8217;s feed to see how fast it really does update in Google Reader. Nothing to see here; move it along.</summary><content type="html">&lt;p&gt;Just &lt;a href="http://adsenseforfeeds.blogspot.com/2009/07/whats-all-hubbub-about-pubsubhubbub.html"&gt;enabled PingShot&lt;/a&gt; on this blog&amp;#8217;s feed to see how fast it really does update in Google Reader. Nothing to see here; move it along.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/MJLdyq-zhZ0" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2009/07/30/testing-pubsubhub-activation/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2009/07/30/testing-pubsubhub-activation</feedburner:origLink></entry><entry><title type="text">My First Ubiquity Command</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/lWZgyv2yJRA/my-first-ubiquity-command" /><category term="Javascript" /><category term="Ubiquity" /><author><name>Gina Trapani</name></author><updated>2009-02-04T11:36:34-08:00</updated><id>http://ginatrapani.org/spun/posts/2009/02/04/developing-ubiquity-commands</id><summary type="html">Spent a few days playing with the awesome Ubiquity Firefox extension, and yesterday I dove into developing my own command.  Here&amp;#8217;s the result: a Google search of Lifehacker&amp;#8217;s archives that shows up in-panel in Ubiquity, like this:

The code itself is Javascript that uses a jQuery template for results.  It&amp;#8217;s heavily ripped off from [...]</summary><content type="html">&lt;p&gt;Spent a few days playing with the awesome &lt;a href="http://labs.mozilla.com/projects/ubiquity/"&gt;Ubiquity Firefox extension&lt;/a&gt;, and yesterday I dove into developing my own command.  Here&amp;#8217;s the result: &lt;a href="http://ginatrapani.org/workshop/ubiquity/lifehacker-search.xhtml"&gt;a Google search of Lifehacker&amp;#8217;s archives&lt;/a&gt; that shows up in-panel in Ubiquity, like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://ginatrapani.org/workshop/ubiquity/lifehacker-ubiquity-search-screenshot.png" /&gt;&lt;/p&gt;
&lt;p&gt;The code itself is Javascript that uses a jQuery template for results.  It&amp;#8217;s heavily ripped off from the existing Google search command (with the &lt;code&gt;site:lifehacker.com&lt;/code&gt; operator thrown in).  If you haven&amp;#8217;t tried out Ubiquity, here&amp;#8217;s my &lt;a href="http://lifehacker.com/5145709/make-ubiquity-your-ultimate-firefox-commander"&gt;introductory tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/lWZgyv2yJRA" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2009/02/04/my-first-ubiquity-command/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2009/02/04/my-first-ubiquity-command</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/DmUHca7PYO4/162" /><category term="Ruby on Rails" /><author><name>Gina Trapani</name></author><updated>2009-02-02T22:14:04-08:00</updated><id>http://ginatrapani.org/spun/?p=162</id><summary type="html">Thanks a million to Sean Lynch at the Fairleads blog for walking through building scaffolding in Ruby on Rails 2.0; it was a huge help in my first week of RoR programming.</summary><content type="html">&lt;p&gt;Thanks a million to Sean Lynch at the Fairleads blog for &lt;a href="http://fairleads.blogspot.com/2007/12/rails-20-and-scaffolding-step-by-step.html"&gt;walking through building scaffolding in Ruby on Rails 2.0&lt;/a&gt;; it was a huge help in my first week of RoR programming.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/DmUHca7PYO4" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2009/02/03/162/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2009/02/03/162</feedburner:origLink></entry><entry><title type="text">Less Skeezy Alternatives to GoDaddy</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/DmVtBj1ubhw/less-sexist-alternatives-to-godaddy" /><category term="Domain Registrars" /><author><name>Gina Trapani</name></author><updated>2009-02-02T16:51:30-08:00</updated><id>http://ginatrapani.org/spun/?p=155</id><summary type="html">Yes, I knew that popular, cheap domain registrar GoDaddy always used sex to sell their services, and yes, their bullying upsells always bugged me, but yesterday&amp;#8217;s Super Bowl ad shot my &amp;#8220;Stop doing business with GoDaddy&amp;#8221; to-do to the top of my list. But where to transfer to? I polled my Twitter friends on which [...]</summary><content type="html">&lt;p&gt;Yes, I knew that popular, cheap domain registrar GoDaddy always used sex to sell their services, and yes, their bullying upsells always bugged me, but yesterday&amp;#8217;s Super Bowl ad shot my &amp;#8220;Stop doing business with GoDaddy&amp;#8221; to-do to the top of my list. But where to transfer &lt;i&gt;to&lt;/i&gt;? I polled my Twitter friends on which registrars were the best alternatives.  Here&amp;#8217;s &lt;a href="http://spreadsheets.google.com/pub?key=p3O079avNqMbOeQaSMmiODQ"&gt;a spreadsheet of the full vote tally&lt;/a&gt;; turns out the least expensive, top vote-getter was &lt;a href="http://namecheap.com"&gt;Namecheap.com&lt;/a&gt;.  &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/DmVtBj1ubhw" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2009/02/02/less-sexist-alternatives-to-godaddy/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2009/02/02/less-sexist-alternatives-to-godaddy</feedburner:origLink></entry><entry><title type="text">Wake-up Call</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/8oSUEsP6s4g/wake-up-call" /><category term="Announcements" /><author><name>Gina Trapani</name></author><updated>2009-02-02T15:41:18-08:00</updated><id>http://ginatrapani.org/spun/?p=150</id><summary type="html">Now that I&amp;#8217;ve got a bit more free time on a day-to-day basis, I&amp;#8217;m doing more development, so I&amp;#8217;ve got more dev-related links that need a parking spot.  Expect more posts at this blog, which has been newly upgraded to the impressive WordPress 2.7, starting now!</summary><content type="html">&lt;p&gt;Now that I&amp;#8217;ve got &lt;a href="http://lifehacker.com/5132674/so-long-and-thanks-for-all-the-fish"&gt;a bit more free time&lt;/a&gt; on a day-to-day basis, I&amp;#8217;m doing more development, so I&amp;#8217;ve got more dev-related links that need a parking spot.  Expect more posts at this blog, which has been newly upgraded to the impressive WordPress 2.7, starting now!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/8oSUEsP6s4g" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2009/02/02/wake-up-call/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2009/02/02/wake-up-call</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/SMJJ64rtHpc/148" /><category term="Extensions" /><author><name>Gina Trapani</name></author><updated>2007-08-13T07:48:34-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/08/13/148</id><summary type="html">Great collection of Firefox extensions to set up the ultimate Firefox development profile.</summary><content type="html">&lt;p&gt;Great collection of Firefox extensions to set up the &lt;a href="http://www.howtogeek.com/howto/internet/firefox/create-the-ultimate-firefox-web-development-profile/"&gt;ultimate Firefox development profile.&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/SMJJ64rtHpc" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/08/13/148/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/08/13/148</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/KBZDxouhV3s/147" /><category term="Search Engine Optimization" /><author><name>Gina Trapani</name></author><updated>2007-06-29T16:03:48-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/06/29/147</id><summary type="html">At the request of a reader, a blast from the past - a 2003 SEO article that&amp;#8217;s way dated, but still has some good points.  Help the Googlebot understand your web site</summary><content type="html">&lt;p&gt;At the request of a reader, a blast from the past - a 2003 SEO article that&amp;#8217;s way dated, but still has some good points.  &lt;a href="http://ginatrapani.org/spun/code-snippets/help_the_googlebot_understand_your_web_site.html"&gt;Help the Googlebot understand your web site&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/KBZDxouhV3s" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/06/29/147/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/06/29/147</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/pWE1fUfk3rg/146" /><category term="Icons" /><author><name>Gina Trapani</name></author><updated>2007-04-30T08:31:14-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/30/146</id><summary type="html">Always will be a sucker for free, good-looking icons.</summary><content type="html">&lt;p&gt;Always will be a sucker for &lt;a href="http://commons.wikimedia.org/wiki/Crystal_Clear"&gt;free, good-looking icons&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/pWE1fUfk3rg" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/30/146/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/30/146</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/lnvt1NJfdWk/144" /><category term="Design" /><category term="Javascript" /><author><name>Gina Trapani</name></author><updated>2007-04-27T15:40:53-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/27/144</id><summary type="html">The first indicator that a design trend is on the way out is when there&amp;#8217;s a Javascript toolkit for it.  Here&amp;#8217;s image reflections.js. (via pb)</summary><content type="html">&lt;p&gt;The first indicator that a design trend is on the way out is when there&amp;#8217;s a Javascript toolkit for it.  &lt;a href="http://cow.neondragon.net/stuff/reflection/"&gt;Here&amp;#8217;s image reflections.js.&lt;/a&gt; (via &lt;a href="http://www.onfocus.com/"&gt;pb&lt;/a&gt;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/lnvt1NJfdWk" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/27/144/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/27/144</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/6W8W5PqLCzA/143" /><category term="AJAX" /><category term="Extensions" /><category term="Firebug" /><category term="Javascript" /><author><name>Gina Trapani</name></author><updated>2007-04-24T19:28:40-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/24/143</id><summary type="html">Firebug&amp;#8217;s creator, Joe Hewitt, demonstrates how he uses Firebug.</summary><content type="html">&lt;p&gt;Firebug&amp;#8217;s creator, Joe Hewitt, &lt;a href="http://ajaxian.com/archives/joe-hewitt-firebug-power-user-demo"&gt;demonstrates how he uses Firebug.&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/6W8W5PqLCzA" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/24/143/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/24/143</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/qj1n2f-3-kc/debugging20javascript20with20firefox" /><category term="Extensions" /><category term="Firefox" /><category term="Javascript" /><author><name>Gina Trapani</name></author><updated>2007-04-17T16:14:38-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/17/debugging20javascript20with20firefox</id><summary type="html">Note to self: get better at debugging JavaScript with Firefox.</summary><content type="html">&lt;p&gt;Note to self: get better at &lt;a href="http://www.codejacked.com/debugging-javascript-with-firefox/"&gt;debugging JavaScript with Firefox&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/qj1n2f-3-kc" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/17/debugging20javascript20with20firefox/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/17/debugging20javascript20with20firefox</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/gnlVAV7PUNg/141" /><category term="Bash scripts" /><category term="Unix" /><author><name>Gina Trapani</name></author><updated>2007-04-16T15:13:28-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/16/141</id><summary type="html">Ah-ha!  So THAT&amp;#8217;s the difference between .bash_profile and .bashrc.</summary><content type="html">&lt;p&gt;Ah-ha!  So THAT&amp;#8217;s &lt;a href="http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html"&gt;the difference between .bash_profile and .bashrc&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/gnlVAV7PUNg" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/16/141/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/16/141</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/TtnHZeISrDE/140" /><category term="Startup dot com" /><author><name>Gina Trapani</name></author><updated>2007-04-16T10:16:24-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/16/140</id><summary type="html">Paul&amp;#8217;s rumination about launching a website rings so true.</summary><content type="html">&lt;p&gt;&lt;a href="http://www.ftrain.com/SiteLaunch.html"&gt;Paul&amp;#8217;s rumination about launching a website&lt;/a&gt; rings so true.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/TtnHZeISrDE" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/16/140/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/16/140</feedburner:origLink></entry><entry><title type="text">Release: Better Gmail Firefox extension</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/j3btMOdTVug/release-better-gmail-firefox-extension-lifehacker" /><category term="Browsers" /><category term="Extensions" /><category term="Greasemonkey" /><category term="Release" /><author><name>Gina Trapani</name></author><updated>2007-04-16T10:13:23-07:00</updated><id>http://ginatrapani.org/spun/posts/2007/04/16/release-better-gmail-firefox-extension-lifehacker</id><summary type="html">Been awhile since I&amp;#8217;ve spent the entire weekend happily coding in a haze, but that&amp;#8217;s what happened yesterday and Saturday.  The result is the Better Gmail Firefox extension, which packages up my favorite Gmail Greasemonkey scripts into one, standalone extension, with the help of the awesome Greasemonkey Compiler.  Check it out.

Lifehacker Code: Better [...]</summary><content type="html">&lt;p&gt;Been awhile since I&amp;#8217;ve spent the entire weekend happily coding in a haze, but that&amp;#8217;s what happened yesterday and Saturday.  The result is the Better Gmail Firefox extension, which packages up my favorite Gmail Greasemonkey scripts into one, standalone extension, with the help of the awesome &lt;a href="http://arantius.com/misc/greasemonkey/script-compiler"&gt;Greasemonkey Compiler&lt;/a&gt;.  Check it out.&lt;/p&gt;
&lt;div class="post-link"&gt;
&lt;a href="http://lifehacker.com/software/gmail/lifehacker-code-better-gmail-firefox-extension-251923.php"&gt;Lifehacker Code: Better Gmail (Firefox extension)&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/j3btMOdTVug" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/04/16/release-better-gmail-firefox-extension-lifehacker/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/04/16/release-better-gmail-firefox-extension-lifehacker</feedburner:origLink></entry><entry><title type="text">Release:  About This Site Firefox add-on, v. 1.2</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/EzdyM6oJNqM/release-about-this-site-firefox-add-on-v-12" /><category term="Extensions" /><category term="Open source" /><category term="Release" /><category term="XUL" /><author><name>Gina Trapani</name></author><updated>2007-01-30T10:09:34-08:00</updated><id>http://ginatrapani.org/spun/posts/2007/01/30/release-about-this-site-firefox-add-on-v-12</id><summary type="html">I got all fancy-pants with XUL and Firefox preferences in the latest release of About This Site, a Firefox add-on that hooks you up with all sorts of meta-services when you&amp;#8217;re researching a web site (like Alexa graphs, del.icio.us bookmarks, a WhoIs query, etc.)
The new release is only a minor point upgrade but feature-wise it&amp;#8217;s [...]</summary><content type="html">&lt;p&gt;I got all fancy-pants with XUL and Firefox preferences in the latest release of &lt;b&gt;&lt;a href="http://lifehacker.com/software/firefox/lifehacker-code--about-this-site-addon-firefox-232375.php"&gt;About This Site&lt;/a&gt;&lt;/b&gt;, a Firefox add-on that hooks you up with all sorts of meta-services when you&amp;#8217;re researching a web site (like Alexa graphs, del.icio.us bookmarks, a WhoIs query, etc.)&lt;/p&gt;
&lt;p&gt;The new release is only a minor point upgrade but feature-wise it&amp;#8217;s major:  now you can configure whatever meta-lookups your heart desires in the menu all by yourself.  (This will also head off all that email I get from folks requesting that I add their new webapp to the menu.)&lt;/p&gt;
&lt;p&gt;Current About This Site users can upgrade just using the auto-update feature;  go to your Add-ons in Firefox, right click on About This Site and hit &amp;#8220;Find Update.&amp;#8221;&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s more, the fine folks at Lifehacker are funding some of my whimsical open source development efforts, so the extension and some more little utilities I&amp;#8217;ve got in the works will be hosted there, under the new &lt;a href="http://lifehacker.com/software/lifehacker-code/"&gt;Lifehacker Code&lt;/a&gt; tag.&lt;/p&gt;
&lt;p&gt;A girl cannot subsist on blogging alone.  Meep.&lt;/p&gt;
&lt;div class="post-link"&gt;&lt;a href="http://lifehacker.com/software/firefox/lifehacker-code--about-this-site-addon-firefox-232375.php"&gt;Lifehacker  Code: About This Site add-on (Firefox)&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/EzdyM6oJNqM" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2007/01/30/release-about-this-site-firefox-add-on-v-12/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2007/01/30/release-about-this-site-firefox-add-on-v-12</feedburner:origLink></entry><entry><title type="text">PHP foreach loops pass arrays by value</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/OuWxgYZemc0/php-foreach-loops-pass-arrays-by-value" /><category term="Code snippets" /><category term="PHP" /><author><name>Gina Trapani</name></author><updated>2006-12-17T14:22:35-08:00</updated><id>http://ginatrapani.org/spun/posts/2006/12/17/php-foreach-loops-pass-arrays-by-value</id><summary type="html">I nearly lost my mind debugging a problem with some PHP I&amp;#8217;d written awhile back that wasn&amp;#8217;t working as I&amp;#8217;d expected on one server (but fine on my own.)  
After many hours of cursing myself for not having a better debugging system, I discovered it was a PHP 4 versus PHP 5 code incompatibility. [...]</summary><content type="html">&lt;p&gt;I nearly lost my mind debugging a problem with some PHP I&amp;#8217;d written awhile back that wasn&amp;#8217;t working as I&amp;#8217;d expected on one server (but fine on my own.)  &lt;/p&gt;
&lt;p&gt;After many hours of cursing myself for not having a better debugging system, I discovered it was a PHP 4 versus PHP 5 code incompatibility.  Turns out that PHP passes arrays into foreach loops by value, which means that any changes you make to that array inside the foreach don&amp;#8217;t appear &lt;i&gt;after&lt;/i&gt; the foreach, because it&amp;#8217;s acting on a copy of the arrray instead of the original data.  &lt;/p&gt;
&lt;p&gt;So code like this:&lt;/p&gt;
&lt;p&gt;&lt;iframe src="/spun/code-snippets/show-source.php?src=foreach.php" width="500" height="200" border="0" style="border:solid #999 1px"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Doesn&amp;#8217;t print &amp;#8220;nothingnothing&amp;#8221;, which is what I&amp;#8217;d expect;  it prints &amp;#8220;rainbowspuppies.&amp;#8221;  In PHP4, apparently, there&amp;#8217;s no way to get around this.  In PHP5, you can pass the array into the foreach by reference using this notation:  &lt;code&gt;foreach ($gina-&gt;interests as &amp;#038; $interest)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For now, I to make my code both PHP4 and PHP5 compatible, I went with a:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;while ($i=0; $i &lt; sizeof($gina-&gt;interests); $i++)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Which just isn&amp;#8217;t as readable as the foreach.  Here&amp;#8217;s the &lt;a href="http://us3.php.net/foreach"&gt;PHP doc on foreach&lt;/a&gt; (which clearly states the PHP 5 caveat.)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/OuWxgYZemc0" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2006/12/17/php-foreach-loops-pass-arrays-by-value/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2006/12/17/php-foreach-loops-pass-arrays-by-value</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/eldz7FJhDn0/136" /><category term="Google Analytics" /><category term="Tutorials" /><author><name>Gina Trapani</name></author><updated>2006-12-02T23:13:07-08:00</updated><id>http://ginatrapani.org/spun/posts/2006/12/03/136</id><summary type="html">Here&amp;#8217;s a handy tip on how to track broken links or missing pages on your site with Google Analytics.  Speaking of, here&amp;#8217;s how we use Analytics at Lifehacker to figure out which posts are our top performers.</summary><content type="html">&lt;p&gt;Here&amp;#8217;s a handy tip on &lt;a href="http://analytics.blogspot.com/2006/09/tip-tracking-404-pages.html"&gt;how to track broken links or missing pages on your site&lt;/a&gt; with Google Analytics.  Speaking of, here&amp;#8217;s how &lt;a href="http://www.lifehacker.com/software/web-publishing/geek-to-live--improve-your-web-site-with-google-analytics-200935.php"&gt;we use Analytics&lt;/a&gt; at Lifehacker to figure out which posts are our top performers.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/eldz7FJhDn0" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2006/12/03/136/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2006/12/03/136</feedburner:origLink></entry><entry><title type="text">Graphing Amazon sales rank, or automated author navel-gazing</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/I7umiBDcx90/graphing-amazon-book-rank-or-automated-author-navel-gazing" /><category term="API" /><category term="PHP" /><author><name>Gina Trapani</name></author><updated>2006-12-02T19:00:34-08:00</updated><id>http://ginatrapani.org/spun/posts/2006/12/02/graphing-amazon-book-rank-or-automated-author-navel-gazing</id><summary type="html">Like most authors tasked with promoting their new book, checking Lifehacker the book&amp;#8217;s Amazon sales rank has become part of my daily routine.  But your book&amp;#8217;s sales rank is one of those things - if you obsess about it too much, you&amp;#8217;ll lose your mind.  &amp;#8220;It&amp;#8217;s total B.S.,&amp;#8221; a writer friend told me. [...]</summary><content type="html">&lt;p&gt;Like most authors tasked with promoting their new book, checking &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0470050659/ref=nosim/lifehackerboo-20"&gt;&lt;i&gt;Lifehacker&lt;/i&gt; the book&lt;/a&gt;&amp;#8217;s Amazon sales rank has become part of my daily routine.  But your book&amp;#8217;s sales rank is one of those things - if you obsess about it too much, you&amp;#8217;ll lose your mind.  &amp;#8220;It&amp;#8217;s total B.S.,&amp;#8221; a writer friend told me.  &amp;#8220;My agent told me it&amp;#8217;s a miniscule representation of your book&amp;#8217;s sales overall.&amp;#8221;  That&amp;#8217;s probably less true for tech books than fiction, but either way, I wanted a way to capture my sales rank over time without constantly checking myself like an anxious freak.  A number alone after awhile is pretty meaningless, and it literally changes by the hour.&lt;/p&gt;
&lt;p&gt;So, inspired by &lt;a href="http://www.onfocus.com/2006/10/3866"&gt;PB&amp;#8217;s graphing post&lt;/a&gt; and a curiosity about Amazon&amp;#8217;s API, I set out to write a little something that would help me visualize what&amp;#8217;s happening with the book&amp;#8217;s sales over time.  I didn&amp;#8217;t get into the hardcore tools Paul did - just the names RRDTool or SNMP scare me - so I instead opted for the very no-frills, Flash-based &lt;a href="http://www.maani.us/charts/index.php"&gt;PHP/SWF graphs.&lt;/a&gt;  After registering for a free key, I was delighted to find that the Amazon API is dead simple.  In less than 30 minutes of a little PHP/MySQL hacking, I had a sales rank capture-and-graph set of PHP scripts.  It&amp;#8217;s turned out to be a really nice way to keep an eye out without reloading the book&amp;#8217;s Amazon page 4 times a day like a total egotistical loser.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the finished &lt;a href="http://ginatrapani.org/workshop/book-rank/"&gt;&lt;i&gt;Lifehacker&lt;/i&gt; book Amazon sales rank charter&lt;/a&gt;.  Screengrab below:&lt;/p&gt;
&lt;p&gt;&lt;img id="image135" src="http://ginatrapani.org/spun/wp-content/uploads/2006/12/salesrankcharter.png" alt="Amazon sales rank charter" /&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/I7umiBDcx90" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2006/12/02/graphing-amazon-book-rank-or-automated-author-navel-gazing/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2006/12/02/graphing-amazon-book-rank-or-automated-author-navel-gazing</feedburner:origLink></entry><entry><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/LYeithhz47U/133" /><category term="Announcements" /><category term="Release" /><author><name>Gina Trapani</name></author><updated>2006-11-01T18:17:07-08:00</updated><id>http://ginatrapani.org/spun/posts/2006/11/01/133</id><summary type="html">Oh, and this is the reason I&amp;#8217;ve been so woefully absent around these parts the last few months.</summary><content type="html">&lt;p&gt;Oh, and &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0470050659/ref=nosim/lifehackerboo-20"&gt;this&lt;/a&gt; is the reason I&amp;#8217;ve been so woefully absent around these parts the last few months.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/LYeithhz47U" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2006/11/01/133/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2006/11/01/133</feedburner:origLink></entry><entry><title type="text">Firefox 2.0 extension development</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spun/~3/a1oBiPN-Aco/firefox-20-extension-development" /><category term="Extensions" /><category term="Firefox" /><category term="Release" /><author><name>Gina Trapani</name></author><updated>2006-11-01T17:55:31-08:00</updated><id>http://ginatrapani.org/spun/posts/2006/11/01/firefox-20-extension-development</id><summary type="html">I wrote my first Firefox extension for version 0.9 in September of 2004.  The development process was a huge pain in the ass, but I pressed on, powered by sheer delight that I could develop an interface within the Firefox chrome.
Two years and one point one version later, I&amp;#8217;ve revisited Mozilla&amp;#8217;s extension development docs, [...]</summary><content type="html">&lt;p&gt;I wrote my first Firefox extension for version 0.9 in September of 2004.  The development process was a huge pain in the ass, but I pressed on, powered by sheer delight that I could develop an interface within the Firefox chrome.&lt;/p&gt;
&lt;p&gt;Two years and one point one version later, I&amp;#8217;ve revisited Mozilla&amp;#8217;s extension development docs, processes and community.  What an improvement!  You can actually make changes to your extension and see them without repackaging, uninstalling, restarting, reinstalling and restarting again!  There&amp;#8217;s a fabulous Extension Maker wizard that produces an extension skeleton starter file set, and batch scripts to do the packaging for you.  It&amp;#8217;s all very exciting.  Here are some tools and reference links I used to update my extensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The aformentioned &lt;a href="http://ted.mielczarek.org/code/mozilla/extensionwiz/"&gt;Extension Wizard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kb.mozillazine.org/Setting_up_extension_development_environment"&gt;Setting up the extension development environment&lt;/a&gt; [Mozillazine]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kb.mozillazine.org/Getting_started_with_extension_development"&gt;Getting started with extension development&lt;/a&gt; [Mozillazine]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I was done updating all my extensions, I got all uppity and submitted one to the Mozilla Add-ons directory.  To my surprise and dismay/happiness, an editor tested it and rejected the submission because the extension threw a Javascript error!  (An error that didn&amp;#8217;t keep it from working, mind you, just cluttered up the Error Console.)  I was pretty impressed with their vigilance (and sheepish about my shitty code), so I fixed it and re-submitted.  It just got accepted.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a final list of my completed (and very simple) extensions, now compatible with Firefox 2.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ginatrapani.org/workshop/firefox/aboutsite/"&gt;About This Site&lt;/a&gt; (here it is &lt;a href="https://addons.mozilla.org/developers/itemoverview.php?id=3673"&gt;on Mozilla Update&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ginatrapani.org/workshop/firefox/showscreencap/"&gt;Show Screen Captures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ginatrapani.org/workshop/firefox/textareawordcounter/"&gt;Text Area Word Counter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;ve got a few more extension ideas in the works, especially for web writers.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Notes on Mozilla Update:&lt;/i&gt;  The great thing about hosting your extension there is that they take care of the auto-update on new versions, count your downloads for you, have per-extension comments enabled and are generally considered a trusted source for extensions (because they, you  know, actually test them, as I found out).  The bad part is that to host on Mozilla Update, you have to remove your custom auto-update URL from the install.rdf file.  So, if you want to host your own extension (like say, to run ads on the page or include them in your custom portfolio) in addition to making it available on Mozilla Update, you have to build TWO separate versions - one, without an updateUrl set for Mozilla Update and one WITH an updateUrl for your own hosted version.  That part kinda sucks.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/Spun/~4/a1oBiPN-Aco" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ginatrapani.org/spun/posts/2006/11/01/firefox-20-extension-development/feed</wfw:commentRss><feedburner:origLink>http://ginatrapani.org/spun/posts/2006/11/01/firefox-20-extension-development</feedburner:origLink></entry></feed>
