<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>Planet Browser Dev</title>
  <subtitle>News and views on browser development, from browser developers</subtitle>
  <updated>2008-11-18T23:22:14Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>Michael(tm) Smith</name>
    <email>mike@w3.org</email>
  </author>
  <id>http://people.w3.org/mike/planet/browser-dev/atom.xml</id>
  <link href="http://people.w3.org/mike/planet/browser-dev/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://people.w3.org/mike/planet/browser-dev/" rel="alternate"/>

  <entry>
    <id>http://my.opera.com/kilsmo/blog/2712926</id>
    <link href="http://my.opera.com/kilsmo/blog/show.dml/2712926" rel="alternate" type="text/html"/>
    <title type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">New MacBook, wow</div>
    </title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><hr/>3 days ago, I got my new MacBook. During the summer, I tried Leopard on my PowerBook, and it was a real improvement to Tiger. So, I knew I would like the software. The hardware looked really good, so I decided to buy one. I was hoping to buy a MacBook Air earlier, but I never dared due to the heating problems.<br/>I got the 2.4GHz version, since I wanted an illuminated keyboard, a feature from the PowerBook that I did not want to be without. On the MacBook, it is even better, since the keyboard has a lot of space between the keys. The keyboard is fantastic, and I can write very fast on it. (well, as fast as I can, it is not that impressive) I agree with the people that were complaining about the black keyboard, it looks strange in combination with aluminium, not ugly, just like that some other color could be better. However, when you turn on the machine, the illumination makes it look really nice.<br/>I selected 4GB, I do not want to have to think about upgrading this machine later. I also included the 128GB SSD, SSD is really important to me.<br/>The reason for not going MacBook Pro, is that I wanted something lighter. It is still not light enough, but it is a good compromise, I get enough power. I plan to use the MacBook with a real screen anyway most of the time.<br/>The big multi-touch trackpad is perfect!<br/>This is a fantastic machine. It looks good, it is robust, it is functional, it has good battery time, it is rather quiet, and it feels fast.<br/>My plan is to use this MacBook as my only computer at home, I will no longer need my desktop computer. This is a MacBook with MacBook Pro quality.<br/>Buy it if you can afford it.<br/><br/></div>
    </content>
    <updated>2008-11-08T11:00:10Z</updated>
    <author>
      <name>Nicklas Larsson</name>
    </author>
    <source>
      <id>http://my.opera.com/kilsmo/blog/</id>
      <author>
        <name>Nicklas Larsson</name>
      </author>
      <link href="http://my.opera.com/kilsmo/" rel="alternate" type="text/html"/>
      <link href="http://my.opera.com/kilsmo/xml/atom/blog" rel="self" type="application/atom+xml"/>
      <title type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Kilsmo's log</div>
      </title>
      <updated>2008-11-08T11:00:10Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://my.opera.com/yngve/blog/2707449</id>
    <link href="http://my.opera.com/yngve/blog/show.dml/2707449" rel="alternate" type="text/html"/>
    <title type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Refreshed Internet Drafts</div>
    </title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><hr/>I've once again refreshed my HTTP Cookie and Cache related Internet Drafts. The drafts have been discussed here a couple of times <a href="http://my.opera.com/yngve/blog/2007/07/09/new-cookie-and-cache-internet-drafts" target="_blank">before</a>, but to summarize:<br/><br/><a href="http://www.ietf.org/internet-drafts/draft-pettersen-dns-cookie-validate-04.txt" target="_blank">draft-pettersen-dns-cookie-validate-04.txt</a> (<a href="http://files.myopera.com/yngve/blog/draft-pettersen-dns-cookie-validate-04.txt" target="_blank">archive</a>)<br/><br/>This Draft describes Opera's current heuristical approach to avoid sending cookies to registry-like domains like co.uk (The "Cookie Monster Bug"). First discussed <a href="http://my.opera.com/yngve/blog/show.dml/267415" target="_blank">here</a>.<br/><br/><a href="http://www.ietf.org/internet-drafts/draft-pettersen-subtld-structure-04.txt" target="_blank">draft-pettersen-subtld-structure-04.txt</a> (<a href="http://files.myopera.com/yngve/blog/draft-pettersen-subtld-structure-04.txt" target="_blank">archive</a>)<br/><br/>This Draft describes an improved approach to handling the "Cookie Monster Bug", using an online black list of registry-like domains. Also first discussed <a href="http://my.opera.com/yngve/blog/show.dml/267415" target="_blank">here</a>.<br/><br/>The Mozilla team's work on <a href="http://wiki.mozilla.org/Gecko:Effective_TLD_Service" target="_blank">"Effective TLDs"</a> is based on an early version of this suggestion. The result of this work is now available from <a href="http://PublicSuffix.org" target="_blank">PublicSuffix.org</a>, and is AFAIK currently used for one or more features by Chrome Beta, FF3, and IE8 Beta.<br/><br/>To reduce the complexity of the specification, and to avoid excluding possible solutions, I have now removed the previous suggestions for how the repository should be generated, and just shortly mention some possibilies in the Appendixes.<br/><br/><a href="http://www.ietf.org/internet-drafts/draft-pettersen-cookie-v2-03.txt" target="_blank">draft-pettersen-cookie-v2-03.txt</a> (<a href="http://files.myopera.com/yngve/blog/draft-pettersen-cookie-v2-03.txt" target="_blank">archive</a>)<br/><br/>This Draft describes the ideal solution to the "Cookie Monster Bug", that everybody starts using a new format for cookies that completely remove the problem. First discussed <a href="http://my.opera.com/yngve/blog/show.dml/388840" target="_blank">here</a>.<br/><br/><a href="http://www.ietf.org/internet-drafts/draft-pettersen-cache-context-03.txt" target="_blank">draft-pettersen-cache-context-03.txt</a> (<a href="http://files.myopera.com/yngve/blog/draft-pettersen-cache-context-03.txt" target="_blank">archive</a>)<br/><br/>This Draft describes a method for giving sites a method to tell the client that a group of webpages are related, which can be used to better organize logouts. First discussed <a href="http://my.opera.com/yngve/blog/2007/02/27/introducing-cache-contexts-or-why-the" target="_blank">here</a>.<br/><br/><a class="attach" href="http://files.myopera.com/yngve/blog/draft-pettersen-dns-cookie-validate-04.txt" target="_blank">draft-pettersen-dns-cookie-validate-04.txt</a><br/><a class="attach" href="http://files.myopera.com/yngve/blog/draft-pettersen-subtld-structure-04.txt" target="_blank">draft-pettersen-subtld-structure-04.txt</a><br/><a class="attach" href="http://files.myopera.com/yngve/blog/draft-pettersen-cookie-v2-03.txt" target="_blank">draft-pettersen-cookie-v2-03.txt</a><br/><a class="attach" href="http://files.myopera.com/yngve/blog/draft-pettersen-cache-context-03.txt" target="_blank">draft-pettersen-cache-context-03.txt</a><br/><br/><br/></div>
    </content>
    <updated>2008-11-06T10:00:56Z</updated>
    <author>
      <name>Yngve Nysæter Pettersen</name>
    </author>
    <source>
      <id>http://my.opera.com/yngve/blog/</id>
      <author>
        <name>Yngve Nysæter Pettersen</name>
      </author>
      <link href="http://my.opera.com/yngve/" rel="alternate" type="text/html"/>
      <link href="http://my.opera.com/yngve/xml/atom/blog" rel="self" type="application/atom+xml"/>
      <subtitle type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">What might get caught in the gears under the hood?</div>
      </subtitle>
      <title type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Implementer's notes</div>
      </title>
      <updated>2008-11-06T10:00:56Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://ianloic.com/?p=76</id>
    <link href="http://feeds.feedburner.com/~r/ianloic/~3/439495630/" rel="alternate" type="text/html"/>
    <link href="http://ianloic.com/2008/11/01/free-technical-books-online/#comments" rel="replies" type="text/html"/>
    <link href="http://ianloic.com/2008/11/01/free-technical-books-online/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Free Technical Books, Online</title>
    <summary xml:lang="en">(Inspired by James Tauber, I’m going to try to write a blog post every day for November. Some of them will be here but others will be over on my personal blog.)
When Oreilly originally launched their Safari Books Online service in 2001 I was really excited. I love technical books but they’re expensive to buy [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>(Inspired by <a href="http://jtauber.com/blog/2008/11/01/how_i_view_blogging/">James Tauber</a>, I’m going to try to write a blog post every day for November. Some of them will be here but others will be over on my <a href="http://loic.livejournal.com/">personal blog</a>.)</p>
<p>When <a href="http://www.oreilly.com/">Oreilly</a> originally launched their <a href="http://www.safaribooksonline.com/">Safari Books Online</a> service in 2001 I was really excited. I love technical books but they’re expensive to buy and heavy to carry around. It turned out that they were <a href="https://ssl.safaribooksonline.com/subscribe">expensive</a> to read online too. Full access to Safari costs almost $500/year and a limited ten-books-a-month plan costs over $250/year. I don’t spend nearly that much money on technical books as it is, and while I’d save some time over just Googling for information that’s available freely online I’m basically a cheapskate.</p>
<p>Today I noticed that <a href="http://www.sfpl.org/">San Francisco Public Library</a> offers <a href="http://sfpl.lib.ca.us/sfplonline/ebooks.htm">access to SBO</a>. A bit of digging showed me that the <a href="http://www.oaklandlibrary.org/">Oakland Public Library</a> (where my <a href="http://dearanxiety.livejournal.com/">lovely wife</a> works) also have a <a href="http://oaklandlibrary.org/databaselist.htm#ebooks">Safari subscription</a>. With my library card number I can about a third of the books on the main site - but that seems to be a broad and deep collection. There’s no downloading and the lynda.com videos aren’t available. But the price is great.</p>
<img height="1" src="http://feeds.feedburner.com/~r/ianloic/~4/439495630" width="1"/></div>
    </content>
    <updated>2008-11-01T23:56:39Z</updated>
    <published>2008-11-01T23:56:39Z</published>
    <category scheme="http://ianloic.com" term="Default"/>
    <category scheme="http://ianloic.com" term="books"/>
    <category scheme="http://ianloic.com" term="sanfrancisco"/><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://ianloic.com/2008/11/01/free-technical-books-online/</feedburner:origlink>
    <author>
      <name>Ian McKellar</name>
      <uri>http://ian.mckellar.org/</uri>
    </author>
    <source>
      <id>http://ianloic.com/feed/atom/</id>
      <link href="http://ianloic.com" rel="alternate" type="text/html"/>
      <link href="http://ianloic.com/feed/atom" rel="self" type="application/atom+xml"/>
      <link href="http://creativecommons.org/licenses/by-sa/3.0/" rel="license" type="text/html"/>
      <subtitle xml:lang="en">from Ian McKellar</subtitle>
      <title xml:lang="en">Software and Opinions</title>
      <updated>2008-11-01T23:56:39Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.mozilla.com/rob-sayre/?p=179</id>
    <link href="http://blog.mozilla.com/rob-sayre/2008/10/31/security-happenings/" rel="alternate" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/10/31/security-happenings/#comments" rel="replies" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/10/31/security-happenings/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Security happenings</title>
    <summary xml:lang="en">I saw Ben Laurie’s post on J-PAKE, and I’m intrigued now that I’ve looked into it. I’m not a cryptographer, so I would be interested to hear a comparison of J-PAKE against SRP. The goals look similar, and I’m not attached to any particular solution. 
Unfortunately, I read Ben’s post at the Denver airport. They [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I saw Ben Laurie’s post on <a href="http://www.links.org/?p=410">J-PAKE</a>, and I’m intrigued now that I’ve looked into it. I’m not a cryptographer, so I would be interested to hear a comparison of J-PAKE against SRP. The goals look similar, and I’m not attached to any particular solution. </p>
<p>Unfortunately, I read Ben’s post at the Denver airport. They use a proxy that inserts ads into the page:</p>
<div class="wp-caption alignnone" id="attachment_180" style="width: 310px;"><a href="http://blog.mozilla.com/rob-sayre/files/2008/10/picture-26.png"><img alt="MAC anyone?" class="size-medium wp-image-180" height="208" src="http://blog.mozilla.com/rob-sayre/files/2008/10/picture-26-300x208.png" title="links with ads" width="300"/></a><p class="wp-caption-text">MAC anyone?</p></div>
<p>I wonder if HTTP traffic in the clear with some sort of signature or MAC could ever work. I tend to think it would be hopelessly mangled by intermediaries, and lead to a new species of <a href="http://whateverbutton.com/blog/index.php/the-whatever-button/&quot;">Whatever Button</a>.</p>
<p><a href="http://blog.mozilla.com/rob-sayre/2008/10/14/draft-hammer-oauth-00/#comment-8530">Eran Hammer-Lahav</a> left a comment chiding me for my undoubtably unoriginal point that OAuth seems to encourage phishing. I’m a little disturbed by the thinking behind the objection. Sometimes, proposals have flaws that make them unworkable, and it seems to me that OAuth might have just such a flaw with regard to phishing, at least as it is presented today. Preventing legitimate sites from needing write access to user data on other sites is a noble goal, but it might not matter much if there’s no way for the user to tell that’s what’s going on.</p></div>
    </content>
    <updated>2008-10-31T22:01:42Z</updated>
    <published>2008-10-31T21:47:45Z</published>
    <category scheme="http://blog.mozilla.com/rob-sayre" term="Uncategorized"/>
    <author>
      <name>rsayre</name>
      <uri>http://blog.mozilla.com/rsayre/</uri>
    </author>
    <source>
      <id>http://blog.mozilla.com/rob-sayre/feed/atom/</id>
      <link href="http://blog.mozilla.com/rob-sayre" rel="alternate" type="text/html"/>
      <link href="http://blog.mozilla.com/rob-sayre/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">icuh8n</subtitle>
      <title xml:lang="en">Rob Sayre's Mozilla Blog</title>
      <updated>2008-10-31T22:01:42Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=279</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-28/paginate-the-web/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-28/paginate-the-web/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Paginate the Web?</title>
    <summary xml:lang="en">Web pages scroll, usually vertically. Is this a good thing?
I was reading an article that Deb pointed out from The Atlantic: “Is Google Making Us Stupid?” and I noticed something: I could easily keep attention on the page when I wasn’t scrolling. But as soon as I got to the bottom of the page, it [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Web pages scroll, usually vertically. Is this a good thing?</p>
<p>I was reading an article that Deb pointed out from <cite>The Atlantic</cite>: <a href="http://www.theatlantic.com/doc/200807/google">“Is Google Making Us Stupid?”</a> and I noticed something: I could easily keep attention on the page when I wasn’t scrolling. But as soon as I got to the bottom of the page, it was much harder to stay focused.</p>
<p>What if web browsers paginated articles by default, instead of laying them out in a vertical scroll view by default? Would that improve reader attention span, or just cause users to stop reading after the first page?</p>
<p>Is it possible to write a Firefox extension to render websites as paginated entities instead of scrolling entities? I suspect not, and that would require assistance from the core Gecko layout engine, but I think it would be a very interesting UI experiment!</p></div>
    </content>
    <updated>2008-10-28T21:58:20Z</updated>
    <published>2008-10-28T21:58:20Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="pagination"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://webkit.org/blog/?p=300</id>
    <link href="http://webkit.org/blog/300/tor-arne-vestb%c3%b8-is-a-webkit-reviewer/" rel="alternate" type="text/html"/>
    <title>Tor Arne Vestbø is a WebKit Reviewer</title>
    <summary>Tor Arne Vestbø is now a qualified WebKit Reviewer. Tor Arne has done a huge amount of work on the Qt port of WebKit, including advanced work such as a Phonon port of the media back end for the &lt;video&gt; element. He’s also helped to enhance our cross-platform abstraction layer. Please join me in congratulating [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Tor Arne Vestbø is now a qualified WebKit Reviewer. Tor Arne has done a huge amount of work on the Qt port of WebKit, including advanced work such as a Phonon port of the media back end for the <code>&lt;video&gt;</code> element. He’s also helped to enhance our cross-platform abstraction layer. Please join me in congratulating Tor Arne on his reviewer status and thanking him for all of his contributions to WebKit.</p></div>
    </content>
    <updated>2008-10-23T12:41:37Z</updated>
    <category term="Uncategorized"/>
    <author>
      <name>Maciej Stachowiak</name>
    </author>
    <source>
      <id>http://webkit.org/blog</id>
      <link href="http://webkit.org/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://webkit.org/blog" rel="alternate" type="text/html"/>
      <subtitle>All about WebKit development</subtitle>
      <title>Surfin' Safari</title>
      <updated>2008-10-23T12:42:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://weblogs.mozillazine.org/bz/archives/019651.html</id>
    <link href="http://weblogs.mozillazine.org/bz/archives/019651.html" rel="alternate" type="text/html"/>
    <title>Loadgroup callbacks</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>One interesting change we made with SVG external document references is that the notificationCallbacks of a loadgroup are no longer necessarily something you can get a docshell from.  I think this was already the case for images, but it will now generally be true for all external SVG resources and everything loaded from such documents.  The reason for setting it up this way was to make sure people don't by accident treat an external resource load as being a load in the display document.  That said, the load is of course associated with the display document...</p>

<p>So the question is whether there are extensions that rely on getting a docshell or some such from the notification callbacks, and if so what they need it for and what they'd expect to get for the external resource documents.  I have no idea how to find this information, unfortunately, so I welcome any pointers.</p></div>
    </summary>
    <updated>2008-10-22T15:29:40Z</updated>
    <category term="Mozilla"/>
    <author>
      <name>bzbarsky</name>
    </author>
    <source>
      <id>http://weblogs.mozillazine.org/bz/</id>
      <link href="http://weblogs.mozillazine.org/bz/" rel="alternate" type="text/html"/>
      <link href="http://weblogs.mozillazine.org/bz/index.rdf" rel="self" type="application/rdf+xml"/>
      <title>Three Monkeys, Three Typewriters, Two Days</title>
      <updated>2008-10-22T15:29:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=276</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-21/unusual-town-names-in-pennsylvania/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-21/unusual-town-names-in-pennsylvania/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Unusual Town Names in Pennsylvania</title>
    <summary xml:lang="en">Moving to Pennsylvania a few years ago, I discovered that, unlike Virginia, not all places are named after English nobility or geographic features. I have collected some of the more amusing/unusual place names I discovered in Pennsylvania into a Google map.
View Larger Map
I love how the triangle of Paradise, Intercourse, and Fertility are so far [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Moving to Pennsylvania a few years ago, I discovered that, unlike Virginia, not all places are named after English nobility or geographic features. I have collected some of the more amusing/unusual place names I discovered in Pennsylvania into a Google map.</p>
<p><br/><small><a href="http://maps.google.com/maps/ms?ie=UTF8&amp;hl=en&amp;msa=0&amp;msid=117500442804721762146.000459c7a58737cce32ec&amp;ll=40.27598,-77.605877&amp;spn=0.537222,3.017464&amp;source=embed" style="color: #0000FF; text-align: left;">View Larger Map</a></small></p>
<p>I love how the triangle of Paradise, Intercourse, and Fertility are so far removed from Climax.</p>
<p>Many coal towns in Western PA were named by the mining companies. Uninventive names like “Mine 71″ are common. But I think the best is “Revloc”. This is the next town over from Colver, and whoever named it just decided to spell Colver backwards.</p>
<p>Cambria county doesn’t allow outdoor advertising of pornography; so immediately outside of the county on U.S. route 22 (near Climax PA) there are a group of video stores and strip clubs. One sign in particular has a rather amusing mis-use of quotation marks:</p>
<blockquote><p>“Live” girls!!!</p></blockquote></div>
    </content>
    <updated>2008-10-21T19:19:11Z</updated>
    <published>2008-10-21T19:19:11Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="humor"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="towns"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=274</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-21/putting-and-deleteing-in-python-urllib2/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-21/putting-and-deleteing-in-python-urllib2/" rel="alternate" type="text/html"/>
    <title xml:lang="en">PUTting and DELETEing in python urllib2</title>
    <summary xml:lang="en">The urllib2 Python module makes it pretty simple to GET and POST data using HTTP (and other protocols). But there isn’t a good built-in way to issue HTTP PUT or DELETE requests. I ran into this limitation while working on a project to upload automatically generated documentation to the Mozilla Developer Center. The DekiWiki API [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The urllib2 Python module makes it pretty simple to GET and POST data using HTTP (and other protocols). But there isn’t a good built-in way to issue HTTP PUT or DELETE requests. I ran into this limitation while working on a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=460999">project</a> to upload automatically generated documentation to the Mozilla Developer Center. The DekiWiki API for uploading an file attachment uses the HTTP PUT method.</p>
<p>It turns out there is an easy workaround. You can subclass the urllib2.Request class and explicitly override the method:</p>
<pre class="code">import urllib2

class RequestWithMethod(urllib2.Request):
  def __init__(self, method, *args, **kwargs):
    self._method = method
    urllib2.Request.__init__(*args, **kwargs)

  def get_method(self):
    return self._method</pre>
<p>Preview for Thursday’s post: the generated documentation is <a href="http://developer.mozilla.org/en/nsAString_internal">already online</a>.</p></div>
    </content>
    <updated>2008-10-21T18:22:53Z</updated>
    <published>2008-10-21T19:00:44Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="documentation"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="http"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="python"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="urllib2"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://weblogs.mozillazine.org/bz/archives/019649.html</id>
    <link href="http://weblogs.mozillazine.org/bz/archives/019649.html" rel="alternate" type="text/html"/>
    <title>Fixing scroll restoration on no-store pages</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>If someone wants to take a brief dive into Gecko code, I'd love to see a patch for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=215405">bug 215405</a> as described in <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=215405#c131">comment 131</a>.  I can promise speedy reviews!</p></div>
    </summary>
    <updated>2008-10-21T17:57:09Z</updated>
    <author>
      <name>bzbarsky</name>
    </author>
    <source>
      <id>http://weblogs.mozillazine.org/bz/</id>
      <link href="http://weblogs.mozillazine.org/bz/" rel="alternate" type="text/html"/>
      <link href="http://weblogs.mozillazine.org/bz/index.rdf" rel="self" type="application/rdf+xml"/>
      <title>Three Monkeys, Three Typewriters, Two Days</title>
      <updated>2008-10-22T15:29:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.mozilla.com/rob-sayre/?p=177</id>
    <link href="http://blog.mozilla.com/rob-sayre/2008/10/14/draft-hammer-oauth-00/" rel="alternate" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/10/14/draft-hammer-oauth-00/#comments" rel="replies" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/10/14/draft-hammer-oauth-00/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">draft-hammer-oauth-00</title>
    <summary xml:lang="en">OAuth is an IETF ID now. Hmm. 
   Wide deployment of OAuth and similar protocols may cause Users to
   become inured to the practice of being redirected to websites where
   they are asked to enter their passwords.  If Users are not careful to
   verify the authenticity [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>OAuth is an IETF ID now. <a href="http://www.ietf.org/internet-drafts/draft-hammer-oauth-00.txt">Hmm</a>. </p>
<blockquote><p>   Wide deployment of OAuth and similar protocols may cause Users to<br/>
   become inured to the practice of being redirected to websites where<br/>
   they are asked to enter their passwords.  If Users are not careful to<br/>
   verify the authenticity of these websites before entering their<br/>
   credentials, it will be possible for attackers to exploit this<br/>
   practice to steal Users’ passwords.</p></blockquote>
<blockquote><p>Service Providers should attempt to educate Users about the risks<br/>
   phishing attacks pose, and should provide mechanisms that make it<br/>
   easy for Users to confirm the authenticity of their sites.</p></blockquote>
<p>Let the phishing begin.</p></div>
    </content>
    <updated>2008-10-15T01:21:07Z</updated>
    <published>2008-10-15T01:21:07Z</published>
    <category scheme="http://blog.mozilla.com/rob-sayre" term="Uncategorized"/>
    <author>
      <name>rsayre</name>
      <uri>http://blog.mozilla.com/rsayre/</uri>
    </author>
    <source>
      <id>http://blog.mozilla.com/rob-sayre/feed/atom/</id>
      <link href="http://blog.mozilla.com/rob-sayre" rel="alternate" type="text/html"/>
      <link href="http://blog.mozilla.com/rob-sayre/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">icuh8n</subtitle>
      <title xml:lang="en">Rob Sayre's Mozilla Blog</title>
      <updated>2008-10-31T22:01:42Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://weblogs.mozillazine.org/bz/archives/019631.html</id>
    <link href="http://weblogs.mozillazine.org/bz/archives/019631.html" rel="alternate" type="text/html"/>
    <title>HTML (and a bit of Python) help needed</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The hgweb annotation output on hg.mozilla.org is painfully slow.  On large files it's two orders of magnitude slower than our old Bonsai output.</p>

<p>I've filed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=459823">bug 459823</a> on getting this fixed.  There is a corresponding <a href="http://www.selenic.com/mercurial/bts/issue1310">bug on mercurial</a> which has lots of analysis and some comments about what needs fixing and how to start.</p>

<p>The upshot is that the template for the annotation output needs to be changed (HTML coding plus a bit of Python, I assume) to output HTML that doesn't require O(N^2) behavior to render.  Sadly, I'm a bit swamped for time to work on this right now, but if someone wants a way to seriously help out Gecko development without touching C++ code, this is it!</p></div>
    </summary>
    <updated>2008-10-14T15:04:40Z</updated>
    <author>
      <name>bzbarsky</name>
    </author>
    <source>
      <id>http://weblogs.mozillazine.org/bz/</id>
      <link href="http://weblogs.mozillazine.org/bz/" rel="alternate" type="text/html"/>
      <link href="http://weblogs.mozillazine.org/bz/index.rdf" rel="self" type="application/rdf+xml"/>
      <title>Three Monkeys, Three Typewriters, Two Days</title>
      <updated>2008-10-22T15:29:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=266</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-09/what-do-people-do-all-day/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-09/what-do-people-do-all-day/" rel="alternate" type="text/html"/>
    <title xml:lang="en">What Do People Do All Day?</title>
    <summary xml:lang="en">There are very few picture books which talk about money, and even fewer do it well. Richard Scarry’s What Do People Do All Day? is a notable and wonderful exception.

Throughout the book, characters are creating value by farming, tailoring, or baking. They sell their goods for money, use it to pay for raw materials, buy [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>There are very few picture books which talk about money, and even fewer do it well. Richard Scarry’s <cite><a href="http://www.amazon.com/Richard-Scarrys-What-People-All/dp/0394818237">What Do People Do All Day?</a></cite> is a notable and wonderful exception.</p>
<p style="text-align: center;"><img alt="Scan from &quot;What Do People Do All Day?&quot;: Farmer Alfalfa selling produce" class="size-full wp-image-267" height="400" src="http://benjamin.smedbergs.us/blog/wp-content/uploads/2008/10/people-money-scarry.png" style="border: 2px solid black;" width="500"/></p>
<p>Throughout the book, characters are creating value by farming, tailoring, or baking. They sell their goods for money, use it to pay for raw materials, buy gifts for their wives, and put the extra in the bank. When the tailor decides to build a new house, he hands a large sack of money to the builders. When the mayors of two towns decide to pave a road between them, they have several huge sacks of money for the road builders.</p>
<p>I recommend pretty much anything by Richard Scarry, but this is my personal favorite. If you have children under the age of ten, or just love picture books, look for it in your local library or bookstore.</p></div>
    </content>
    <updated>2008-10-09T16:22:30Z</updated>
    <published>2008-10-09T16:30:12Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="book"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="economics"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=261</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-09/release-branches-in-mozilla-central/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-09/release-branches-in-mozilla-central/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Release branches in mozilla-central</title>
    <summary xml:lang="en">On the Firefox development branches, the version number is always “pre”: for example, 3.1b1pre. This makes it easy to distinguish between nightly builds and release builds. To produce a release, the release team creates a “minibranch”. This minibranch exists for the following reasons:

To allow bumping the version numbers to the release version, for example: 3.1b1.
To [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>On the Firefox development branches, the version number is always “pre”: for example, 3.1b1pre. This makes it easy to distinguish between nightly builds and release builds. To produce a release, the release team creates a “minibranch”. This minibranch exists for the following reasons:</p>
<ul>
<li>To allow bumping the version numbers to the release version, for example: 3.1b1.
</li><li>To isolate the release process and allow the main development tree to re-open as quickly as possible.
</li></ul>
<p>This is a long-standing tradition in CVS, but we haven’t really done it before 3.1b1 in Mercurial. This week, mozilla-central grew a new branch: the <a href="http://hg.mozilla.org/mozilla-central/rev/GECKO191b1_20081007_RELBRANCH"><tt>GECKO191b1_20081007_RELBRANCH</tt></a>. Pushing this branch to mozilla-central caused some unexpected side effects for developers:</p>
<ol>
<li>Developers who issued a normal <tt>hg pull -u</tt> got the following message:
<pre>adding 171 changesets with 234 changes to 110 files (+1 heads)
not updating, since new heads added
(run 'hg heads' to see heads, 'hg merge' to merge)</pre>
<p>Yes, a new head was added; but this head is on a named branch and shouldn’t affect developers who aren’t on that branch. This is a bug in Mercurial that will be fixed in future versions. To work around the problem, just run <tt>hg up</tt>, which will update you to the latest revision of the default branch.</p>
</li><li><tt>hg heads</tt> shows branch heads. Normally, developers working on the default branch don’t care about heads on other branches, and don’t want release branch heads showing up when they issue the <tt>hg heads</tt> command. The Mercurial developers are aware of this issue and will fix it in a future version. In the meantime, use the following command to see only the heads of the default branch: <tt>hg heads default</tt>.
</li></ol>
<p><em>Note: even with the above bugs fixed, <tt>hg pull -u</tt> isn’t the exact equivalent of <tt>hg pull; hg up</tt>: in the case where no new changes are available on the remote server, no update will be performed. This only affects trees where the working directory is not at the tip revision. This slightly unintuitive behavior is considered a feature by the Mercurial developers, not a bug.</em></p></div>
    </content>
    <updated>2008-10-09T16:22:19Z</updated>
    <published>2008-10-09T16:29:22Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="mercurial"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="mozilla-central"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="release"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=252</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-07/a-good-bookstore/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-07/a-good-bookstore/" rel="alternate" type="text/html"/>
    <title xml:lang="en">A Good Bookstore</title>
    <summary xml:lang="en">I was sad to read about the closing of Olsson’s Books and Records in Washington D.C.  When I lived in D.C., I worked two blocks from the Olsson’s downtown; I would drop in frequently during lunch, and spent an impressive fraction of my salary there.
While the prices and selection at Olsson’s were both competitive, [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I was sad to read about the <a href="http://www.washingtonpost.com/wp-dyn/content/article/2008/10/03/AR2008100303397.html?nav=rss_print/outlook">closing</a> of Olsson’s Books and Records in Washington D.C.  When I lived in D.C., I worked two blocks from the Olsson’s downtown; I would drop in frequently during lunch, and spent an impressive fraction of my salary there.</p>
<p>While the prices and selection at Olsson’s were both competitive, most impressive and enjoyable was the staff: it was clear that everyone in the store loved books. They were able to provide relevant recommendations to me, after I became a “regular”, remembered my tastes and interests and were really good salesmen.</p>
<p>I’m sure that the “new” Barnes and Noble on 12th street had something to do with Olsson’s decline. Olsson’s probably couldn’t compete with the extended hours and the café. I don’t want to malign the huge chains: I enjoy spending a couple hours in a mega-super-duper Barnes and Noble. I’ve noticed that when a new store opens, the staff is really helpful and knowledgeable. But after a year or so, the quality of staff at the information desk starts dropping, sometimes dramatically. How can you be a really helpful bookseller if you’ve never heard of St. Augustine <em>or</em> Orson Scott Card? Why can’t the mega-chains keep book-loving sales staff?</p></div>
    </content>
    <updated>2008-10-07T20:25:39Z</updated>
    <published>2008-10-07T17:30:09Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="books"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="sales"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=255</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-07/parsing-idl-in-python/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-07/parsing-idl-in-python/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Parsing IDL in Python</title>
    <summary xml:lang="en">One of the current pain points in our build system is the xpidl compiler. This is a binary tool which is used to generate C++ headers and XPT files from XPIDL input files. The code depends on libIDL, which in turn depends on glib. Because this tool is a build-time requirement, we have to build [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>One of the current pain points in our build system is the <a href="http://developer.mozilla.org/En/XPIDL:xpidl">xpidl</a> compiler. This is a binary tool which is used to generate C++ headers and XPT files from XPIDL input files. The code depends on libIDL, which in turn depends on glib. Because this tool is a build-time requirement, we have to build a host version, and in most cases we also build a target version to put in the SDK package.</p>
<p>Getting glib and libidl on linux systems is not very difficult: all the major distros have developer packages for them. But getting libidl and glib on Windows and mac can be quite painful. On Windows, we have had to create our own custom static library versions of this code which are compatible with all the different versions of Microsoft Visual C++. On Mac you can get them from macports, but as far as I know they are not available in universal binaries, which means that you can’t cross-compile a target xpidl.</p>
<p>Parsing IDL, while not trivial, is not so complicated that it requires huge binary code libraries. So a while back I <a href="http://hg.mozilla.org/users/bsmedberg_mozilla.com/idl-parser/">reimplemented</a> the XPIDL parser using python and the <a href="http://www.dabeaz.com/ply/">PLY</a> (python lex-yacc) parsing library. The core parsing grammar and object model is only <a href="http://hg.mozilla.org/users/bsmedberg_mozilla.com/idl-parser/file/f51708e7f0d9/xpidl.py">1200 lines of code</a>.</p>
<p>Because we don’t have any unit tests for xpidl, I chose to use A-B testing against the output of the binary xpidl: the header output of the python xpidl should match byte-for-byte the header output of the binary xpidl. I <a href="http://hg.mozilla.org/users/bsmedberg_mozilla.com/idl-parser/file/f51708e7f0d9/testheaderrules.mk">wrote</a> a <a href="http://developer.mozilla.org/en/myrules.mk">myrules.mk</a> file which would automatically build and compare both versions during a buld. This turned out to be a royal pain, because the libIDL parser is not very consistent and has bugs:</p>
<ul>
<li><em>Some</em>, but not all attributes are re-ordered so that they are no longer in original order, but are ordered according to an internal glib hash function.
</li><li>The code which associates doc-comments with IDL items is buggy: in many cases the comment is associated with a later item.
</li></ul>
<p>I had to add some temporary <a href="http://hg.mozilla.org/users/bsmedberg_mozilla.com/idl-parser/file/f51708e7f0d9/xpidl.py#l43">nasty</a> <a href="http://hg.mozilla.org/users/bsmedberg_mozilla.com/idl-parser/file/f51708e7f0d9/xpidl.py#l437">hacks</a> in order to work around these issues. And finally, reproducing the wacky whitespace of the binary tool wasn’t worthwhile, so I starting comparing the results using diff -w -B. But with these hacks and changes, both xpidl compilers produce identical C++ headers.</p>
<p>I completed the code to produce C++ headers during a couple of not-quite-vacation days, but I didn’t write any code to produce XPT files. I shelved the project as an attractive waste of time, until jorendorff needed an IDL parser to produce <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=407216">quick stub C++ code</a>. Jason managed to take my existing code and hook up a quick-stub generator to it. The <a href="http://mxr.mozilla.org/mozilla-central/source/xpcom/idl-parser/xpidl.py">python xpidl parser</a> and <a href="http://mxr.mozilla.org/mozilla-central/source/js/src/xpconnect/src/qsgen.py">quick-stub generator</a> are both used in the codebase.</p>
<p>Currently, we’re still using the old binary xpidl to produce C++ headers and XPT files. If somebody is interested, I’d really like help adding code to produce XPT files from the new parser, so that we can ditch the old binary code completely.</p>
<p>If you ever need to use python to parse some interesting grammar, I highly recommend PLY. If you turn on optimization it performs very well, and it has very good support for detailed error reporting.</p></div>
    </content>
    <updated>2008-10-07T20:24:06Z</updated>
    <published>2008-10-07T17:29:08Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="lex"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="ply"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="python"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="xpidl"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="yacc"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://weblogs.mozillazine.org/bz/archives/019625.html</id>
    <link href="http://weblogs.mozillazine.org/bz/archives/019625.html" rel="alternate" type="text/html"/>
    <title>Regexps and writing tests</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>David Mandelin's blog post <a href="http://blog.mozilla.com/dmandelin/2008/10/06/squirrelfishing-in-regexp-dnajs/#comment-821">about one of the sunspider subtests</a> is chock-full of fun information on regexps.  It also highlights some more perils of writing performance tests, especially when there are optional features involved, or when the tests don't do a good job of testing whether the behavior is correct in addition to being fast.</p></div>
    </summary>
    <updated>2008-10-07T13:07:00Z</updated>
    <author>
      <name>bzbarsky</name>
    </author>
    <source>
      <id>http://weblogs.mozillazine.org/bz/</id>
      <link href="http://weblogs.mozillazine.org/bz/" rel="alternate" type="text/html"/>
      <link href="http://weblogs.mozillazine.org/bz/index.rdf" rel="self" type="application/rdf+xml"/>
      <title>Three Monkeys, Three Typewriters, Two Days</title>
      <updated>2008-10-22T15:29:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=249</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-01/a-parents-most-important-job/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-10-01/a-parents-most-important-job/" rel="alternate" type="text/html"/>
    <title xml:lang="en">A Parent’s Most Important Job</title>
    <summary xml:lang="en">I remember clearly the when I first read The Tipping Point. The book was a good read and thought-provoking, but I remember the book most clearly because of a small section near the end:
This [study] is, if you think about it, a rather extraordinary finding. Most of us believe that we are like our parents [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I remember clearly the when I first read <cite><a href="http://www.gladwell.com/tippingpoint/index.html">The Tipping Point</a></cite>. The book was a good read and thought-provoking, but I remember the book most clearly because of a small section near the end:</p>
<blockquote><p>This [study] is, if you think about it, a rather extraordinary finding. Most of us believe that we are like our parents because of some combination of genes and, more important, of nurture — that parents, to a large extent, raise us in their own image. But if that is the case, if nurture matters so much, then why did the adopted kids not resemble their adoptive parents <em>at all?</em> The Colorado study isn’t saying that genes explain everything and that environment doesn’t matter. On the contrary, all of the results strongly suggest that our environment plays as big — if not bigger — a role as heredity in shaping personality and intelligence. What it is saying is that whatever that environmental influence is, it doesn’t have a lot to do with parents. It’s something else, and what Judith Harris argues is that that something else is the influence of peers.</p>
<p>Why, Harris asks, do the children of recent immigrants almost never retain the accent of their parents? How is it the children of deaf parents manage to learn how to speak as well and as quickly as children whose parents speak to them from the day they were born? The answer has always been that language is a skill acquired laterally — that what children pick up from other children is as, or more, important in the acquisition of language as what they pick up at home. What Harris argues is that this is also true more generally, that the environmental influence that helps children become who they are ‒that shapes their character and personality — is their peer group.</p></blockquote>
<p>Expressed this way, I think it’s easy to come to the wrong conclusion: that parents have little influence over their children. A more useful inference would be:</p>
<p><em style="text-align: center; display: block;">A parent’s most important duty is to find the best possible peers for their children.</em></p></div>
    </content>
    <updated>2008-10-01T13:26:56Z</updated>
    <published>2008-10-01T13:21:55Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="parents"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="peers"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-28T21:58:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=247</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-30/generating-documentation-with-dehydra/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-30/generating-documentation-with-dehydra/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Generating Documentation With Dehydra</title>
    <summary xml:lang="en">One of the common complaints about the Mozilla string code is that it’s very difficult to know what methods are available on a given class. Reading the code is very difficult because it’s hidden behind a complex set of #defines, it’s parameterized for both narrow and wide strings, and because we have a deep and [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>One of the common complaints about the Mozilla string code is that it’s very difficult to know what methods are available on a given class. Reading the code is very difficult because it’s hidden behind a complex set of #defines, it’s parameterized for both narrow and wide strings, and because we have a deep and complex string hierarchy. The Mozilla Developer Center has a string guide, but not any useful reference documentation.</p>
<p>With a little hand-holding, static analysis tools can produce very useful reference documentation, which other tools simply cannot make. For example, because a static analysis tool knows the accessibility of methods, you can create a reference document that contains only the public API of a class. I spent parts of yesterday and today tweaking a <a href="http://developer.mozilla.org/En/Dehydra">Dehydra</a> script to produce a string reference. I’m working with Eric Shepherd to figure out the best way to automatically upload the data to the Mozilla Developer Center, but I wanted to post a sample for comment. This is the public API of nsACString:</p>
<p><a href="http://benjamin.smedbergs.us/blog/wp-content/uploads/2008/09/nsacstring_internal-fixed.html">Reference for nsACString (internal version)</a></p>
<p>I am trying to keep the format of this document similar to the <a href="http://developer.mozilla.org/Project:En/Sample_interface_document">format we use for interfaces</a> on MDC. It’s a bit challenging, because C++ classes have overloaded method names and frequently have many methods. In the method summary, I have grouped together all the methods with the same name.</p>
<p>Once the output and format are tweaked, I can actually hook the entire generation and upload process to a makefile target, and either run it on my local machine or hook it up to a buildbot. I used E4X to do the actual XML generation. It was a learning experience… I don’t think I’m a fan. I want Genshi for JavaScript. Making conditional constructs in E4X is slightly ugly, and making looping constructs is really painful: my kingdom for an XML generator so that I don’t have to loop and append to an XMLList.</p></div>
    </content>
    <updated>2008-10-01T00:28:00Z</updated>
    <published>2008-09-30T21:52:49Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="dehydra"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="doxygen"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="reference"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="xpcom"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-21T19:19:11Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://webkit.org/blog/?p=197</id>
    <link href="http://webkit.org/blog/197/web-inspector-redesign/" rel="alternate" type="text/html"/>
    <title>Web Inspector Redesign</title>
    <summary>It has been nine months since our last Web Inspector update and we have a lot of cool things to talk about. If you diligently use the Web Inspector in nightly builds, you might have seen some of these improvements, while other subtle changes might have gone unnoticed.
Some of the Web Inspector improvements were contributed [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>It has been nine months since our <a href="http://webkit.org/blog/148/web-inspector-update">last Web Inspector update</a> and we have a lot of cool things to talk about. If you diligently use the Web Inspector in nightly builds, you might have seen some of these improvements, while other subtle changes might have gone unnoticed.</p>
<p>Some of the Web Inspector improvements were contributed by members of the WebKit community. We really want to get the whole community involved with making this the best web development tool available. Remember, most of the Web Inspector is written in <a href="http://trac.webkit.org/browser/trunk/WebCore/inspector/front-end/">HTML, JavaScript, and CSS</a>, so it’s easy to get started making changes and improvements.</p>
<h3>Redesigned Interface</h3>
<p>First and foremost, the Web Inspector is now sporting a new design that organizes information into task-oriented groups — represented by icons in the toolbar. The toolbar items (Elements, Resources, Scripts, Profiles and Databases) are named after the fundamental items you will work with inside the respective panels.</p>
<p style="text-align: center;"><img src="http://webkit.org/blog-files/inspector-toolbar.png"/></p>
<h3>Console</h3>
<p>The Console is now accessible from any panel. Unlike the other panels, the Console is not just used for one task — it might be used while inspecting the DOM, debugging JavaScript or analyzing HTML parse errors. The Console toggle button is found in the status bar, causing it to animate in and out from the bottom of the Web Inspector. The Console can also be toggled by the Escape key.</p>
<p>Error and warning counts are now shown in the bottom right corner of the status bar. Clicking on these will also open the Console.</p>
<p style="text-align: center;"><img src="http://webkit.org/blog-files/inspector-status-bar-with-errors.png"/></p>
<p>In addition to the visual changes to the Console, we have also greatly improved usability by adding auto-completion and tab-completion. As you type expressions, property names will automatically be suggested. If there are multiple properties with the same prefix, pressing the Tab key will cycle through them. Pressing the Right arrow key will accept the current suggestion. The current suggestion will also be accepted when pressing the Tab key if there is only one matched property.</p>
<p style="text-align: center;"><img src="http://webkit.org/blog-files/inspector-console-autocomplete.png"/></p>
<p>Our compatibility with <a href="http://getfirebug.com/commandline.html">Firebug’s command line</a> and <a href="http://getfirebug.com/console.html">window.console APIs</a> has also been greatly improved by Keishi Hattori (服部慶士), a student at The University of Tokyo (東京大学) who tackled this area as a summer project.</p>
<h3>Elements Panel</h3>
<p>The Elements panel is largely the same as the previous DOM view — at least visually. Under the hood we have made number of changes and unified everything into one DOM tree.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-elements-panel.png" target="_new"><img src="http://webkit.org/blog-files/inspector-elements-panel.png"/></a></p>
<ul>
<li><strong>Descend into sub-documents</strong> — expanding a frame or object element will show you the DOM tree for the document inside that element.</li>
<li><strong>Automatic updates</strong> — the DOM tree will update when nodes are added to or removed from the inspected page.</li>
<li><strong>Inspect clicked elements</strong> — enabling the new inspect mode lets you hover around the page to find a node to inspect. Clicking on a node in the page will focus it in the Elements panel and turn off the inspect mode. This was contributed by Matt Lilek.</li>
<li><strong>Temporarily disable style properties</strong> — hovering over an editable style rule will show checkboxes that let you disable individual properties.
<p style="text-align: center;"><img src="http://webkit.org/blog-files/inspector-disabling-properties.png"/></p>
</li>
<li><strong>Style property editing</strong> — double click to edit a style property. Deleting all the text will delete the property. Typing or pasting in multiple properties will add the new properties.</li>
<li><strong>Stepping for numeric style values</strong> — while editing a style property value with a number, you can use the Up or Down keys to increment or decrement the number. Holding the Alt/Option key will step by 0.1, while holding the Shift key will step by 10.
<p style="text-align: center;"><img src="http://webkit.org/blog-files/inspector-numeric-style-stepping.gif"/></p>
</li>
<li><strong>DOM attribute editing</strong> — double click to edit a DOM element attribute. Typing or pasting in multiple attributes will add the new attributes. Deleting all the text will delete the attribute.</li>
<li><strong>DOM property editing</strong> — double click to edit a DOM property  in the Properties pane. Deleting all the text will delete the property, if allowed.</li>
<li><strong>Metrics editing</strong> — double click to edit a any of the CSS box model metrics.</li>
<li><strong>Position metrics</strong> — the Metrics pane now includes position info for absolute, relative and fixed positioned elements.</li>
</ul>
<h3>Resources Panel</h3>
<p>The Resources panel is a supercharged version of the previous Network panel. It has a similar looking timeline waterfall, but a lot has been done to make it even more useful.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-resources-panel.png" target="_new"><img src="http://webkit.org/blog-files/inspector-resources-panel.png"/></a></p>
<ul>
<li><strong>Graph by size</strong> — click Size in the sidebar to quickly see the largest resources downloaded.</li>
<li><strong>Multiple sorting options</strong> — there are many sorting methods available for the Time graph, including latency and duration.</li>
<li><strong>Latency bars</strong> — the Time graph now shows latency in the bar with a lighter shade. This is the time between making the request and the server’s first response.</li>
<li><strong>Unified resource views</strong> — clicking a resource in the sidebar will show you the data pulled from the network (not downloaded again), including the request and response headers.</li>
<li><strong>View XHRs</strong> — the time and size graphs also show XMLHttpRequests. Selecting an XHR resource in the sidebar will show the XHR data and headers.</li>
</ul>
<h3>Scripts Panel</h3>
<p>The previous standalone <a href="http://webkit.org/blog/61/introducing-drosera">Drosera JavaScript debugger</a> has been replaced with a new JavaScript debugger integrated into the Web Inspector. The new integrated JavaScript debugger is much faster than Drosera, and should be much more convenient.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-scripts-panel.png" target="_new"><img src="http://webkit.org/blog-files/inspector-scripts-panel.png"/></a></p>
<p>From the Scripts panel you can see all the script resources that are part of the inspected page. Clicking in the line gutter of the script will set a breakpoint for that line of code. There are the standard controls to pause, resume and step through the code. While paused you will see the current call stack and in-scope variables in the right-hand sidebar.</p>
<p>The Web inspector has a unique feature regarding in-scope variables: it shows closures, “with” statements, and event-related scope objects separately. This gives you a clearer picture of where your variables are coming from and why things might be breaking (or even working correctly by accident).</p>
<p style="text-align: center;"><img src="http://webkit.org/blog-files/inspector-closure-scope.png"/> <img src="http://webkit.org/blog-files/inspector-with-scope.png"/></p>
<h3>Profiles Panel</h3>
<p>The brand new JavaScript Profiler in the Profiles panel helps you identify where execution time is spent in your page’s JavaScript functions. The sidebar on the left lists all the recorded profiles and a tree view on the right shows the information gathered for the selected profile. Profiles that have the same name are grouped as sequential runs under a collapsible item in the sidebar.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-profiles-panel.png" target="_new"><img src="http://webkit.org/blog-files/inspector-profiles-panel.png"/></a></p>
<p>There are two ways to view a profile: bottom up (heavy) or top down (tree). Each view has its own advantages. The heavy view allows you to understand which functions have the most performance impact and the calling paths to those functions. The tree view gives you an overall picture of the script’s calling structure, starting at the top of the call-stack.</p>
<p>Below the profile are a couple of data mining controls to facilitate the dissection of profile information. The focus button (Eye symbol) will filter the profile to only show the selected function and its callers. The exclude button (X symbol) will remove the selected function from the entire profile and charge its callers with the excluded function’s total time. While any of these data mining features are active, a reload button is available that will restore the profile to its original state.</p>
<p>WebKit’s JavaScript profiler is fully compatible with <a href="http://getfirebug.com/console.html">Firebug’s console.profile() and console.profileEnd() APIs</a>, but you can also specify a title in <code>console.profileEnd()</code> to stop a specific profile if multiple profiles are being recorded. You can also record a profile using the Start/Stop Profiling button in the Profiles panel.</p>
<h3>Databases Panel</h3>
<p>The Databases panel lets you interact with <a href="http://www.w3.org/html/wg/html5/#sql">HTML 5 Database storage</a>. You can examine the contents of all of the page’s open databases and execute SQL queries against them. Each database is shown in the sidebar. Expanding a database’s disclosure triangle will show the database’s tables. Selecting a database table will show you a data grid containing all the columns and rows for that table.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-databases-panel.png" target="_new"><img src="http://webkit.org/blog-files/inspector-databases-panel.png"/></a></p>
<p>Selecting a database in the sidebar will show an interactive console for evaluating SQL queries. The input in this console has auto-completion and tab-completion for common SQL words and phrases along with table names for the database.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-databases-panel-query-view.png" target="_new"><img src="http://webkit.org/blog-files/inspector-databases-panel-query-view.png"/></a></p>
<h3>Search</h3>
<p>Accompanying the task-oriented reorganization, the search field in the toolbar now searches the current panel with results being highlighted in the context of the panel. Targeting the search to the current panel allows each panel to support specialized queries that are suited for the type of information being shown. The panels that support specialized queries are Elements and Profiles.</p>
<p>The Elements panel supports XPath and CSS selectors as queries in addition to plain text. Any search you perform will be attempted as a plain text search, a XPath query using <code>document.evaluate()</code> and a CSS selector using <code>document.querySelectorAll()</code>. All the search results will be highlighted in the DOM tree, with the first match being revealed and selected.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-searching-elements.png" target="_new"><img src="http://webkit.org/blog-files/inspector-searching-elements.png"/></a></p>
<p>The Profiles panel supports plain text searches of the function names and resource URLs. Numeric searches are also supported that match rows in the profile’s Self, Total and Calls columns. To facilitate powerful numeric searching, there are a few operators and units that work to extend or limit your results. For example you can search for “&gt; 2.5ms” to find all the functions that took longer than 2.5 milliseconds to execute. In addition to “ms”, the other supported units are: “s” for time in seconds and “%” for percentage of time. The other supported operators are “&lt; ”, “&lt;=”, “&gt;=” and “=”. When no units are specified the Calls column is searched.</p>
<p style="text-align: center;"><a href="http://webkit.org/blog-files/inspector-searching-profiles.png" target="_new"><img src="http://webkit.org/blog-files/inspector-searching-profiles.png"/></a></p>
<p>In all the panels pressing Enter in the search field or ⌘G (Ctrl+G on Windows and Linux) will reveal the next result. Pressing ⇧⌘G (Ctrl+Shift+G on Windows and Linux) will reveal the previous result. In the Resources, Scripts and Profiles panels the search will be performed on the visible view first and will automatically jump to the first result only if the visible view has a match.</p>
<h3>Availability and Contributing</h3>
<p>All of these things are available now in the <a href="http://nightly.webkit.org">Mac and Windows nightly builds</a>. Give them a try today, and <a href="http://bugs.webkit.decenturl.com/new-web-inspector-bug">let us know</a> what you like (or don’t like).</p>
<p>If you would like to contribute, there are some really interesting tasks in the list of <a href="http://bugs.webkit.decenturl.com/web-inspector-bugs-enhancements">Web Inspector bugs and enhancements</a>, and other contributors in the <a href="irc://chat.freenode.net/#webkit">#webkit chat room</a> are pretty much always available to provide help and advice.</p></div>
    </content>
    <updated>2008-10-01T00:06:36Z</updated>
    <category term="Uncategorized"/>
    <category term="debugger"/>
    <category term="inspector"/>
    <category term="profile"/>
    <category term="profiler"/>
    <category term="web inspector"/>
    <author>
      <name>Timothy Hatcher</name>
    </author>
    <source>
      <id>http://webkit.org/blog</id>
      <link href="http://webkit.org/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://webkit.org/blog" rel="alternate" type="text/html"/>
      <subtitle>All about WebKit development</subtitle>
      <title>Surfin' Safari</title>
      <updated>2008-10-23T12:42:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=244</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-26/salmon-cakes/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-26/salmon-cakes/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Salmon Cakes</title>
    <summary xml:lang="en">I love crab cakes. But at least here in Johnstown, refrigerated crab meat is expensive enough that making crab cakes on a regular basis is impractical. But there is an affordable alternative that tastes almost as good: Salmon cakes. Canned salmon is inexpensive and is a great substitute; you can find it near the canned [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I love crab cakes. But at least here in Johnstown, refrigerated crab meat is expensive enough that making crab cakes on a regular basis is impractical. But there is an affordable alternative that tastes almost as good: Salmon cakes. Canned salmon is inexpensive and is a great substitute; you can find it near the canned tuna at pretty much any decent supermarket.</p>
<h3>Ingredients</h3>
<ul>
<li>2 cans salmon (15.75oz each)
</li><li>1 cup breadcrumbs
</li><li>lots of pepper
</li><li>Spices:
<ul>
<li>1 teaspoon ground mustard
</li><li>1 teaspoon paprika
</li><li>1/2 teaspoon cumin
</li><li>1/2 teaspoon red pepper flakes
</li><li>Or whatever else strikes your fancy
 </li></ul>
</li><li>1 large onion, diced fine
</li><li>2 eggs, lightly beaten
</li><li>bacon fat or frying oil (peanut, canola, sunflower, or soy oil)
</li></ul>
<h3>Hardware</h3>
<ul>
<li>mixing bowl
</li><li>can opener
</li><li>fine strainer
</li><li>griddle or large skillet (cast iron is best, but any heavy pan will do)
</li><li>Metal spatula-like device: an offset spatula is best
</li><li>Wire rack for draining: for best results, turn the rack upside-down in contact with newspaper.
</li></ul>
<h3>Preparation</h3>
<ol>
<li>Drain the salmon into a strainer. Pick through the fish and remove any backbone or other large bones, if present
</li><li>In a mixing bowl, combine the breadcrumbs and spices and toss
</li><li>Add the salmon, eggs, and onion to the bowl. Combine the ingredients with your hands. The mixture should be somewhat sticky. If it is dry, add another egg.
</li><li>Form the cakes with your hands:
<ul>
<li>The cakes can be any size from half-fist to fist sized. The cake should be a disc about twice as wide as it is thick… I can typically make 10 large-ish cakes from this recipe.
</li><li>Squeeze in both hands to compact into roughly the correct shape.
</li><li>While holding in the palm of one hand, cup your other hand around the outside of the cake to form it into a round.
 </li></ul>
</li><li>Heat the griddle on medium heat and add the frying fat.
</li><li>When water gently sizzles in the fat (3-4 minutes), add the cakes. It’s ok to place them close together.
</li><li>Turn when the first side is brown… I prefer a dark mahogany (~7 minutes), but many people prefer a more golden color (~5 minutes)
</li><li>When the second side is done, remove to the wire rack for draining and cover with foil. Serve immediately.
</li></ol>
<h3>Service Suggestions</h3>
<ul>
<li>For a dipping sauce prepare sour cream with chives, or tartar sauce if you’re feeling very traditional.
</li><li>Salmon cakes work well as a main dish, but you could also make smaller ones as hors d’œuvre or in a surf-n-turf combo.
</li><li>On a cold day, pair with a warm vegetable soup.
</li><li>On a warm day, pair with a cucumber salad.
</li><li>Serve with Sauvignon Blanc or Corona.
</li></ul>
<h3>Notes</h3>
<p>Canned Salmon typically has a lot of added salt. You don’t need to add any salt, and I’d avoid salted seasoning blends (Old Bay) as well. Because the salmon is fully cooked, feel free to check for seasoning before frying.</p>
<p>I’ve seen recipes where the cakes are breaded before frying, typically with crushed saltine crackers. I can’t for the life of me figure out why.</p>
<p>If you are like me and instinctively add garlic to any dish calling for diced onions, please resist the temptation.</p></div>
    </content>
    <updated>2008-09-26T17:21:59Z</updated>
    <published>2008-09-26T17:00:03Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="recipe"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="salmon"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-09T16:30:12Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=245</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-26/allocated-memory-and-shared-library-boundaries/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-26/allocated-memory-and-shared-library-boundaries/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Allocated Memory and Shared Library Boundaries</title>
    <summary xml:lang="en">When people get started with XPCOM, one of the most confusing rules is how to pass data across XPCOM boundaries. Take the following method:
IDL markup
string getFoo();
C++ generated method signature
nsresult GetFoo(char **aResult);

C++ Implementation
The aResult parameter is called an “out parameter”. The implementation of this method is responsible for allocating memory and setting *aResult:
nsresult
Object::GetFoo(char **aResult)
{
  // [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>When people get started with XPCOM, one of the most confusing rules is how to pass data across XPCOM boundaries. Take the following method:</p>
<h4>IDL markup</h4>
<pre>string getFoo();</pre>
<h4>C++ generated method signature</h4>
<pre>nsresult GetFoo(char **aResult);</pre>
<p><img align="right" alt="Diagram showing transfer of allocation 'ownerhip' from the implementation method to the calling method" class="alignright size-full wp-image-246" height="291" src="http://benjamin.smedbergs.us/blog/wp-content/uploads/2008/09/xpcom-allocator-diagram.png" width="380"/></p>
<h4>C++ Implementation</h4>
<p>The <code>aResult</code> parameter is called an “out parameter”. The implementation of this method is responsible for allocating memory and setting *aResult:</p>
<pre>nsresult
Object::GetFoo(char **aResult)
{
  // Allocate a string to pass back
  *aResult = NS_Alloc(4);

  // In real life, check for out-of-memory!
  strcpy(*aResult, “foo”);

  return NS_OK;
}</pre>
<h4>C++ Caller</h4>
<p>The caller, after it is finished with the data, is responsible for freeing the data.</p>
<pre>char *foo;
myIFace-&gt;GetFoo(&amp;foo);
// do something with foo
NS_Free(foo);</pre>
<p>The important thing to note is that the code doesn’t allocate memory with <code>malloc</code>, and doesn’t free it with <code>free</code>. All memory that is passed across XPCOM boundaries must be allocated with <a href="http://developer.mozilla.org/en/NS_Alloc"><code>NS_Alloc</code></a> and freed with <a href="http://developer.mozilla.org/en/NS_Free"><code>NS_Free</code></a>.</p>
<p>We have this rule because of <em>mismatched allocators</em>. Depending on your operating system and the position of the moon, each shared library may have its own malloc heap. If you <code>malloc</code> memory in one shared library and <code>free</code> it in a different library, the heap of each library may get corrupted and cause mysterious crashes. By forcing everyone to use the NS_Alloc/Free functions, we know that all code is using the same malloc heap.</p>
<h2>Helper Functions</h2>
<p>In most cases, there are helper functions which make following the rules much easier. On the implementation side, the ToNewUnicode and ToNewCString functions convert an existing <a href="http://developer.mozilla.org/En/NsAString">nsAString/nsACString</a> to an allocated raw buffer.</p>
<p>On the caller side, you should almost always use helper classes such as nsXPIDLString to automatically handle these memory issues:</p>
<h4>Better C++ Caller</h4>
<pre>nsXPIDLCString foo;
myIFace-&gt;GetFoo(getter_Copies(foo));
// do something with foo</pre>
<h2>Impact on Extension Authors</h2>
<p>It is especially important for extension authors to follow this advice on Windows. The Windows version of Firefox uses custom version of the Windows C runtime which we’ve patched to include the high-performance jemalloc allocator. Extension authors should <a href="http://developer.mozilla.org/en/USE_STATIC_LIBS">link the C runtime statically</a>, which guarantees that they will have a mismatched malloc/free heap.</p>
<h2>Notes</h2>
<ul>
<li>New code shouldn’t use “string” or “wstring” IDL types; use “AString” or “ACString” instead.
</li><li>See <a href="http://developer.mozilla.org/En/Choosing_the_right_memory_allocator">Choosing the right memory allocator</a> on MDC.
</li><li>See <a href="http://developer.mozilla.org/en/XPCOM_string_guide">the XPCOM string guide</a>.
</li></ul></div>
    </content>
    <updated>2008-09-26T16:04:34Z</updated>
    <published>2008-09-26T16:59:21Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="allocator"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="memory"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="xpcom"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-09T16:30:12Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://webkit.org/blog/?p=280</id>
    <link href="http://webkit.org/blog/280/full-pass-of-acid-3/" rel="alternate" type="text/html"/>
    <title>Full Pass of Acid3</title>
    <summary>Today we would like to announce that WebKit is the first browser engine to fully pass Acid3. A while back, we posted that we scored 100/100 and matched the reference rendering. Now, thanks to recent speedups in JavaScript, DOM and rendering, we have passed the third condition, smooth animation on reference hardware. 
Here is a [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Today we would like to announce that WebKit is the first browser engine to fully pass <a href="http://acid3.acidtests.org/">Acid3</a>. A while back, <a href="http://webkit.org/blog/173/webkit-achieves-acid3-100100-in-public-build/">we posted</a> that we scored 100/100 and matched the reference rendering. Now, thanks to recent speedups in JavaScript, DOM and rendering, we have passed the third condition, <a href="http://ln.hixie.ch/?start=1207096078&amp;count=1">smooth animation on reference hardware</a>. </p>
<p>Here is a screenshot of a successful run:</p>
<p><img src="http://webkit.org/blog-files/acid3-screenshot.png"/></p>
<p>Here is the timing reference dialog you get by clicking on the “A” in Acid3 that confirms we pass the smooth animation condition on a 2.4GHz MacBook Pro:</p>
<p><img src="http://webkit.org/blog-files/acid3-timing-screenshot.png"/></p>
<p>To try it for yourself, <a href="http://nightly.webkit.org/">grab a nightly</a>. Keep in mind that on slower machines, the timing may not be perfect, and you need to do a cached run of the test (load it once, close window, open new window, load it again) to avoid delays from the network.</p></div>
    </content>
    <updated>2008-09-26T01:29:57Z</updated>
    <category term="Uncategorized"/>
    <author>
      <name>Maciej Stachowiak</name>
    </author>
    <source>
      <id>http://webkit.org/blog</id>
      <link href="http://webkit.org/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://webkit.org/blog" rel="alternate" type="text/html"/>
      <subtitle>All about WebKit development</subtitle>
      <title>Surfin' Safari</title>
      <updated>2008-10-23T12:42:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=243</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-24/whats-so-bad-about-a-liquidity-crisis/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-24/whats-so-bad-about-a-liquidity-crisis/" rel="alternate" type="text/html"/>
    <title xml:lang="en">What’s so bad about a liquidity crisis?</title>
    <summary xml:lang="en">I’ve been trying to follow the news and commentary about the “bailout” and financial markets in some detail; but there must be some obvious background knowledge I’m missing. From watching bits of the congressional hearing yesterday, and reading the newspapers, it seems that the major purpose of the bailout is “restore liquidity to the markets”, [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’ve been trying to follow the news and commentary about the “bailout” and financial markets in some detail; but there must be some obvious background knowledge I’m missing. From watching bits of the congressional hearing yesterday, and reading the newspapers, it seems that the major purpose of the bailout is “restore liquidity to the markets”, which seems to be an economist’s synonym for “make sure the markets can still loan people money”.</p>
<p>What would happen if the markets stopped loaning people money? For consumers at least, there would be some short-term pain: people have been expecting to be able to use easy credit, so they haven’t saved money for a new car, Christmas presents, and so forth. The housing market would certainly change, and housing prices would drop even further because of a lack of buyers. But would that actually significantly disrupt the economy? Wouldn’t the population save their money for a few years, limp along with their old car, and then buy a new one with saved cash?</p>
<p>Presumably after all the existing bad securities are untangled, some banks will start to be able to loan money again, and these lenders will set stricter requirements on collateral and verified ability to repay loans.</p>
<p>Perhaps the consequences are more serious if business credit disappeared: capitalizing a new business or making capital improvements to an existing business pretty much requires credit. If we want to preserve this essential use of credit to keep the real economy strong (not the speculative market economy), isn’t there a way the U.S. government could guarantee this kind of credit for business capital loans much more cheaply than $700B, and let the chips fall where they might everywhere else?</p>
<p>I invite the blogosphere to link me up to classic economic treatises and modern articles which could help me understand how a liquidity crisis would cause the economy to simply collapse.</p></div>
    </content>
    <updated>2008-09-24T17:49:58Z</updated>
    <published>2008-09-24T17:49:58Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="credit"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="economics"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="liquidity"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="loans"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-07T20:25:39Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=242</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-24/call-for-help-boehmjemalloc/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-24/call-for-help-boehmjemalloc/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Call for Help: Boehm+jemalloc</title>
    <summary xml:lang="en">At the Firefox summit we decided to change tack on XPCOMGC and try to use Boehm instead of MMgc. Overall I think this was a really good decision. With help from Graydon, I even have some Linux builds that use Boehm under the hood (most memory is not considered collectable, only string buffers are collected [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>At the Firefox summit we decided to change tack on XPCOMGC and try to use <a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm</a> instead of MMgc. Overall I think this was a really good decision. With help from Graydon, I even have some <a href="https://build.mozilla.org/tryserver-builds/2008-09-22_13:43-bsmedberg@mozilla.com-try-8a69bc11f94/">Linux builds</a> that use Boehm under the hood (most memory is not considered collectable, only string buffers are collected objects at this point).</p>
<p>Unfortunately, while Boehm is a pretty good collector, it doesn’t do so well at memory allocation and fragmentation. Heap usage is between 1.5x and 2x that of standard Firefox using jemalloc. What I really want is a combination of jemalloc and Boehm, taking the best features from each:</p>
<h4>Boehm Features:</h4>
<ul>
<li>Fast and threadsafe conservative collector
</li><li>Smart rooting of all thread stacks and static data
</li><li>Incremental marking with hardware write barriers<sup><a href="http://benjamin.smedbergs.us/blog/2008-09-24/call-for-help-boehmjemalloc/#f1">1</a></sup>
</li><li>Option for parallel collection<sup><a href="http://benjamin.smedbergs.us/blog/2008-09-24/call-for-help-boehmjemalloc/#f2">2</a></sup>
</li><li>Ability to intermingle collected and non-collected memory
</li></ul>
<h4>jemalloc features:</h4>
<ul>
<li>Better overall memory usage, primarily due to <a href="http://blog.pavlov.net/tag/jemalloc/">lower fragmentation</a>
</li><li>Very tight and well-performing allocator
</li></ul>
<h2>Help Wanted</h2>
<p>I’m looking for somebody who’s willing to painstakingly combine the best of these two allocators: either port the jemalloc low-fragmentation design to Boehm, or port the Boehm collection mechanism to the jemalloc allocator. If you’re interested, please contact me. Getting a solution to this problem really blocks any serious plans for further work on XPCOMGC.</p>
<h2>Notes</h2>
<ol>
<li><a name="f1"/>The key word is <em>hardware</em>. The MMgc solution failed because altering our codebase to have correct programmatic write barriers was going to involve boiling the ocean. And even with smart pointers, a standard MMgc write barrier involves a lot of overhead.
</li><li><a name="f2"/>In Boehm, parallel collection doesn’t work with most incremental collection, and so we may not actually decide to use it; avoiding large pauses with incremental collection is more important.
</li></ol></div>
    </content>
    <updated>2008-09-24T17:49:49Z</updated>
    <published>2008-09-24T17:49:49Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="boehm"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="jemalloc"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="xpcomgc"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-07T20:25:39Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=240</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-22/are-you-going-to-start-plating-soon/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-22/are-you-going-to-start-plating-soon/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Are you going to start plating soon?</title>
    <summary xml:lang="en">I’m hoping to start blogging more regularly, and model my blog after The Old New Thing. So I’m planning on posting in pairs: one technical post related to my work or Mozilla, and one non-technical post relating to personal posts about my family, music, or other things I find interesting.
I think I am raising Food [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p><small>I’m hoping to start blogging more regularly, and model my blog after <a href="http://blogs.msdn.com/oldnewthing/"><cite>The Old New Thing</cite></a>. So I’m planning on posting in pairs: one technical post related to my work or Mozilla, and one non-technical post relating to personal posts about my family, music, or other things I find interesting.</small></p>
<p>I think I am raising Food Network junkies. I was making BLT sandwiches for lunch the other day, and my three-year-old daughter Claire was hungry. She asked me “are you going to start plating soon?”</p>
<p>She adores <a href="http://en.wikipedia.org/wiki/Michael_Symon">Michael Symon</a>, and often when we turn on <a href="http://www.foodnetwork.com/food/show_ie"><cite>Dinner: Impossible</cite></a> she says “I love Michael Symon, he’s beeeaautiful.” Claire wants to be an Iron Chef when she grows up. Ellie really enjoys when <a href="http://en.wikipedia.org/wiki/Cat_Cora">Cat Cora</a> is the Iron Chef, or when there’s a female challenger in general. And they all watch <a href="http://www.foodnetwork.com/food/show_ea">Good Eats</a> with rapt attention.</p>
<p>It’s amazing to me how much and how quickly they learn. We play a “how do we cook it” game: I pick an ingredient, and they tell me how you’d cook it. Ellie, who is four years old, recently said to me, “Daddy, if you don’t heat the carrot pieces in a pan with oil, they won’t be soft in your carrot stew.” In their play-kitchen, they are always concocting soups and baked goods, and arguing about ingredients.</p></div>
    </content>
    <updated>2008-09-22T21:40:55Z</updated>
    <published>2008-09-22T21:21:57Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="claire"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="ellie"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="iron chef"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-01T13:26:56Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://benjamin.smedbergs.us/blog/?p=241</id>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-22/when-linking-the-order-of-your-command-line-can-be-important/feed/" rel="replies" type="application/atom+xml"/>
    <link href="http://benjamin.smedbergs.us/blog/2008-09-22/when-linking-the-order-of-your-command-line-can-be-important/" rel="alternate" type="text/html"/>
    <title xml:lang="en">When linking, the order of your command-line can be important</title>
    <summary xml:lang="en">Occasionally, people will come on the #xulrunner or #extdev channel with a question about compiling XPCOM components. The question often goes something like this:
&lt;IRCGuy&gt; I’m following a tutorial on making XPCOM components, but I can’t seem to get them to compile. Can anyone tell me what my problem is?
Hint for asking a good question: IRCGuy [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Occasionally, people will come on the #xulrunner or #extdev channel with a question about compiling XPCOM components. The question often goes something like this:</p>
<blockquote><p>&lt;IRCGuy&gt; I’m following a tutorial on making XPCOM components, but I can’t seem to get them to compile. Can anyone tell me what my problem is?</p></blockquote>
<p>Hint for asking a good question: IRCGuy needs to tell us some combination of 1) what tutorial he’s following, 2) what the failing command is or 3) what the error message is.</p>
<p>This time, IRCGuy’s compile command and error message are:</p>
<blockquote><pre>IRCGuy@IRCGuy-france:/mnt/data/IRCGuy/public/project/xpcom-test$ make
g++  -I/usr/local/include/xulrunner-1.9/unstable -I/usr/local/include/xulrunner-1.9/stable -L/usr/local/lib/xulrunner-devel-1.9/lib -Wl,-rpath-link,/usr/local/bin  -lxpcomglue_s -lxpcom -lnspr4 -fno-rtti -fno-exceptions -shared -Wl,-z,defs  france2.cpp -o france2.so
/tmp/cceFg2dD.o: In function `NSGetModule':
france2.cpp:(.text+0x38c): undefined reference to `NS_NewGenericModule2(nsModuleInfo const*, nsIModule**)'</pre>
</blockquote>
<p>IRCGuy’s problem is a problem of <em>link ordering</em>: with most unix-like linkers, it is very important to list object files and libraries in the correct order. The general order you want to follow is as follows:</p>
<ol>
<li>Object files
</li><li>Static libraries - specific to general
</li><li>Dynamic libraries
</li></ol>
<p>If an object file needs a symbol, the linker will only resolve that symbol in static libraries that are <em>later</em> in the link line.</p>
<p>The corrected command:</p>
<pre>g++  -I/usr/local/include/xulrunner-1.9/unstable -I/usr/local/include/xulrunner-1.9/stable -fno-rtti -fno-exceptions -shared -Wl,-z,defs  france2.cpp -L/usr/local/lib/xulrunner-devel-1.9/lib -Wl,-rpath-link,/usr/local/bin  -lxpcomglue_s -lxpcom -lnspr4 -o france2.so</pre>
<p><em>Bonus tip:</em> correct linker flags for linking XPCOM components can be found on the Mozilla Developer Center article on the <a href="http://developer.mozilla.org/en/docs/XPCOM_Glue">XPCOM Glue</a>. As noted in the article, xpcom components want to use the “Dependent Glue” linker strategy.</p></div>
    </content>
    <updated>2008-09-22T21:39:46Z</updated>
    <published>2008-09-22T21:39:46Z</published>
    <category scheme="http://benjamin.smedbergs.us/blog" term="build-system"/>
    <category scheme="http://benjamin.smedbergs.us/blog" term="xpcom"/>
    <author>
      <name>Benjamin Smedberg</name>
      <email>benjamin@smedbergs.us</email>
    </author>
    <source>
      <id>http://benjamin.smedbergs.us/blog/feed/atom/</id>
      <link href="http://benjamin.smedbergs.us/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://benjamin.smedbergs.us/blog" rel="alternate" type="text/html"/>
      <rights xml:lang="en">Copyright 2008</rights>
      <subtitle xml:lang="en">Benjamin Smedberg's Thoughts</subtitle>
      <title xml:lang="en">BSBlog</title>
      <updated>2008-10-01T13:26:56Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>http://weblogs.mozillazine.org/bz/archives/019600.html</id>
    <link href="http://weblogs.mozillazine.org/bz/archives/019600.html" rel="alternate" type="text/html"/>
    <title>Poor test writing, part 1: Celtic Kane JavaScript speed test</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is the first in what will probably be a series of posts about poorly-written tests.  Writing good tests is hard, especially without having some idea of how browsers work on the inside; these posts are meant to point out some of the pitfalls, not to criticize.</p>

<p>I often see <a href="http://www.celtickane.com/webdesign/jsspeed.php">the Celtic Kane JavaScript speed test</a> cited as a performance test people care about. This test has several sub-tests, some of which I would like to examine in more detail.</p>

<h3>Layer movement.</h3><p>This test is simply not testing what it thinks it's testing.  Here's the entire test:</p>
<pre>  var layer1 = document.getElementById('layer1');
  for( var i = 0; i &lt;= 8000; i++ )  {
    layer1.style.x = i + 'px';
    layer1.style.y = i + 'px';
  }
</pre>
<p>First, and most obviously, the test is simply testing the speed of setting "expando" properties on a CSSStyleDeclaration object, since there are in fact no CSS properties named "x" and "y".  I'm not sure why this is an interesting thing to test, or what it has to do with "layer movement".  Even if the test were setting "left" and "top", it wouldn't be testing "layer movement", since all UAs I'm aware of do most of their layout and such asynchronously and this test is not leaving time for that.  All the test would measure in that case is the amount of time it takes for the UA to record the information needed to do a layout some time later.  Again, I'm not sure why this is an interesting thing to test.</p>

<h3>Random number engine.</h3>
<p>No attempt is made to check whether the numbers are actually random, or even non-constant.  A UA that simply returns 0, or returns poor random numbers (using a poor random-number generator) would automatically do better on this test, though it's not clear that you'd want to use the return value of random() for anything serious in such a UA.</p>

<h3>DOM speed.</h3>
<p>This test tests setting a single DOM property: <code>innerHTML</code>.  It sets it to a string with no actual HTML in it.  I'm not sure whether this is a common performance bottleneck in the real world, but results on this test change radically in various UAs once there is an actual tag name in the string (a situation that I suspect is more common than the plaintext one).  Once again, the test doesn't actually measure the time needed to lay out or render the newly-created DOM nodes, but this is probably fine for a test that claims to be about "DOM speed".  It would be a much more useful test if it tested a wider variety of methods and properties, and in more realistic ways.</p>

<h3>Array functions.</h3>
<p>In pratice, this test basically tests the performance of reversing an array and sorting an array that is in exactly reversed order.  There is an Array.push() call, but the time it takes is overwhelmed by the sort() and reverse() calls.  This seems like a very uncommon and quite synthetic workload.  In particular, there are plenty of array-sorting algorithms that would perform quite well on this workload and poorly on more random arrays, and vice versa.</p>

<h3>String functions.</h3>
<p>This test tests string concatenation and String.slice().  There are two lines in this test that are no-ops:</p>
<pre>  str.toLowerCase;
  str.toUpperCase;
</pre>
<p>I'm not sure whether the test author thinks he's testing toUpperCase() and toLowerCase() performance here; I hope he doesn't.</p>

<h3>Ajax declaration.</h3>
<p>This test tests the performance of creating an XMLHttpRequest object and doing absolutely nothing with it.  I'm not sure why this is a useful test, since it can be easily gamed by deferring all initialization work until the open() call.  That would make the time from creation start to open() complete longer, but speed up creation time.</p>

<p>Before someone suggests it, I did try contacting the test author several weeks ago.  There has been no response of any sort.</p></div>
    </summary>
    <updated>2008-09-21T17:52:05Z</updated>
    <category term="Grab Bag"/>
    <author>
      <name>bzbarsky</name>
    </author>
    <source>
      <id>http://weblogs.mozillazine.org/bz/</id>
      <link href="http://weblogs.mozillazine.org/bz/" rel="alternate" type="text/html"/>
      <link href="http://weblogs.mozillazine.org/bz/index.rdf" rel="self" type="application/rdf+xml"/>
      <title>Three Monkeys, Three Typewriters, Two Days</title>
      <updated>2008-10-22T15:29:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://webkit.org/blog/?p=214</id>
    <link href="http://webkit.org/blog/214/introducing-squirrelfish-extreme/" rel="alternate" type="text/html"/>
    <title>Introducing SquirrelFish Extreme</title>
    <summary>Just three months ago, the WebKit team announced SquirrelFish, a major revamp of our JavaScript engine featuring a high-performance bytecode interpreter. Today we’d like to announce the next generation of our JavaScript engine - SquirrelFish Extreme (or SFX for short). SquirrelFish Extreme uses more advanced techniques, including fast native code generation, to deliver even more [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Just three months ago, <a href="http://webkit.org/blog/189/announcing-squirrelfish/">the WebKit team announced SquirrelFish</a>, a major revamp of our JavaScript engine featuring a high-performance bytecode interpreter. Today we’d like to announce the next generation of our JavaScript engine - SquirrelFish Extreme (or SFX for short). SquirrelFish Extreme uses more advanced techniques, including fast native code generation, to deliver even more JavaScript performance.</p>
<p>For those of you who follow WebKit development and are interested in contributing, we’d like to report our results and what we did to achieve them.</p>
<h4>How Fast is It?</h4>
<p>This chart shows WebKit’s JavaScript performance in different versions - bigger bars are better.</p>
<p><img alt="bar graph showing WebKit 3.0: 5.4; WebKit 3.1: 18.8; SquirrelFish: 29.9; SquirrelFish Extreme: 63.6" src="http://webkit.org/blog-files/sfx-perf.png"/></p>
<p>The metric is SunSpider runs per minute. We present charts this way because “bigger is better” is easier to follow when you have a wide range of performance results. As you can see, SquirrelFish Extreme as of today is more than twice as fast as the original SquirrelFish, and over 10 times the speed you saw in Safari 3.0, less than a year ago. We are pretty pleased with this improvement, but we believe there is more performance still to come.</p>
<p>Quite a few people contributed to these results. I will mention a few who worked on some key tasks, but I’d also like to thank all of the many WebKit contributors who have helped with JavaScript and performance.</p>
<h4>What makes it so fast?</h4>
<p>SquirrelFish Extreme uses four different technologies to deliver much better performance than the original SquirrelFish: bytecode optimizations, polymorphic inline caching, a lightweight “context threaded” JIT compiler, and a new regular expression engine that uses our JIT infrastructure.</p>
<h4>1. Bytecode Optimizations</h4>
<p>When we first announced SquirrelFish, we mentioned that we thought that the basic design had lots of room for improvement from optimizations at the bytecode level. Thanks to hard work by Oliver Hunt, Geoff Garen, Cameron Zwarich, myself and others, we implemented lots of effective optimizations at the bytecode level.</p>
<p>One of the things we did was to optimize within opcodes. Many JavaScript operations are highly polymorphic - they have different behavior in lots of different cases. Just by checking for the most common and fastest cases first, you can speed up JavaScript programs quite a bit.</p>
<p>In addition, we’ve improved the bytecode instruction set, and built optimizations that take advantage of these improvements. We’ve added combo instructions, peephole optimizations, faster handling of constants and some specialized opcodes for common cases of general operations.</p>
<h4>2. Polymorphic Inline Cache</h4>
<p>One of our most exciting new optimizations in SquirrelFish Extreme is a polymorphic inline cache. This is an old technique originally developed for the Self language, which other JavaScript engines have used to good effect.</p>
<p>Here is the basic idea: JavaScript is an incredibly dynamic language by design. But in most programs, many objects are actually used in a way that resembles more structured object-oriented classes. For example, many JavaScript libraries are designed to use objects with “x” and “y” properties, and only those properties, to represent points. We can use this knowledge to optimize the case where many objects have the same underlying structure - as people in the dynamic language community say, “you can cheat as long as you don’t get caught”.</p>
<p>So how exactly do we cheat? We detect when objects actually have the same underlying structure — the same properties in the same order — and associate them with a structure identifier, or StructureID. Whenever a property access is performed, we do the usual hash lookup (using our highly optimized hashtables) the first time, and record the StructureID and the offset where the property was found. Subsequent times, we check for a match on the StructureID - usually the same piece of code will be working on objects of the same structure. If we get a hit, we can use the cached offset to perform the lookup in only a few machine instructions, which is much faster than hashing.</p>
<p>Here is the <a href="http://research.sun.com/self/papers/pics.html">classic Self paper that describes the original technique</a>. You can look at Geoff’s implementation of <a href="http://trac.webkit.org/browser/trunk/JavaScriptCore/kjs/StructureID.h">the StructureID class</a> in Subversion to see more details of how we did it.</p>
<p>We’ve only taken the first steps on polymorphic inline caching. We have lots of ideas on how to improve the technique to get even more speed. But already, you’ll see a huge difference on performance tests where the bottleneck is object property access.</p>
<h4>3. Context Threaded JIT</h4>
<p>Another major change we’ve made with SFX is to introduce native code generation. Our starting point is a technique called a “context threaded interpreter”, which is a bit of a misnomer, because this is actually a simple but effective form of JIT compiler. In the original SquirrelFish announcement, we described our use of direct threading, which is about the fastest form of bytecode intepretation short of generating native code. Context threading takes the next step and introduces some native code generation.</p>
<p>The basic idea of context threading is to convert bytecode to native code, one opcode at a time. Complex opcodes are converted to function calls into the language runtime. Simple opcodes, or in some cases the common fast paths of otherwise complex opcodes, are inlined directly into the native code stream. This has two major advantages. First, the control flow between opcodes is directly exposed to the CPU as straight line code, so much dispatch overhead is removed. Second, many branches that were formerly inside opcode implmentations are now inline, and made visible and highly predictable to the CPU’s branch predictor.</p>
<p>Here is a <a href="http://www.cs.toronto.edu/syslab/pubs/demkea_context.ps">paper describing the basic idea of context threading</a>. Our initial prototype of context threading was created by Gavin Barraclough. Several of us helped him polish it and tune the performance over the past few weeks.</p>
<p>One of the great things about our lightweight JIT is that there’s only about 4,000 lines of code involved in native code generation. All the other code remains cross platform. It’s also surprisingly hackable. If you thought compiling to native code is rocket science, think again. Besides Gavin, most of us have little prior experience with native codegen, but we were able to jump right in.</p>
<p>Currently the code is limited to x86 32-bit, but we plan to refactor and add support for more CPU architectures. CPUs that are not yet supported by the JIT can still use the interpreter. We also think we can get a lot more speedups out of the JIT through techniques such as type specialization, better register allocation and liveness analysis. The SquirrelFish bytecode is a good representation for making many of these kinds of transforms.</p>
<h4>4. Regular Expression JIT</h4>
<p>As we built the basic JIT infrastructure for the main JavaScript language, we found that we could easily apply it to regular expressions as well, and get up to a 5x speedup on regular expression matching. So we went ahead and did that. Not all code spends a bunch of time in regexps, but with the speed of our new regular expression engine, WREC (the WebKit Regular Expression Compiler), you can write the kind of text processing code you’d want to do in Perl or Python or Ruby, and do it in JavaScript instead. In fact we believe that in many cases our regular expression engine will beat the highly tuned regexp processing in those other languages.</p>
<p>Since the SunSpider JavaScript benchmark has a fair amount of regexp content, some may feel that developing a regexp JIT is an “unfair” advantage. A year ago, regexp processing was a fairly small part of the test, but JS engines have improved in other areas a lot more than on regexps. For example, most of the individual tests on SunSpider have gotten 5-10x faster in JavaScriptCore — in some cases over 70x faster than the Safari 3.0 version of WebKit. But until recently, regexp performance hadn’t improved much at all.</p>
<p>We thought that making regular expressions fast was a better thing to do than changing the benchmark. A lot of real tasks on the web involve a lot of regexp processing. After all, fundamental tasks on the web, like JSON validation and parsing, depend on regular expressions. And emerging technologies — like <a href="http://ejohn.org/blog/processingjs/">John Resig’s processing.js library</a> — extend that dependency ever further.</p>
<h4>A Word About Benchmarks</h4>
<p>We have included some performance results, but don’t take our word for it. You can get WebKit nightlies for <a href="http://nightly.webkit.org/builds/trunk/mac/1">Mac</a> and <a href="http://nightly.webkit.org/builds/trunk/win/1">Windows</a> and try for yourself.</p>
<p>The primary benchmark we use to track JavaScript performance is <a href="http://www2.webkit.org/perf/sunspider-0.9/sunspider.html">SunSpider</a>. Although, like all benchmarks, it has its flaws, we think it is a balanced test that covers many dimensions of the JavaScript language and many types of code. If you look at test by test results, you will see that different JavaScript implementations have their own strengths and weaknesses. Browser vendors and independent testers have been tracking this benchmark.</p>
<h4>Next Steps and How You Can Contribute</h4>
<p>We believe the SquirrelFish Extreme architecture has room for lots more optimization, and we’d love to see more developers and testers pitch in. Currently, we are looking at how to use the bytecode infrastructure to perform more information gathering at runtime and then using it to drive better code generation, and we are studying ways to make JS function calls faster. There is also a lot of basic tuning work to do to take more advantage of the basic architectural advances in SFX. In addition, we’re interested in having JIT back ends for other CPU architectures.</p>
<p>If you’d like to follow the development of WebKit’s JavaScript engine more closely, we have created the <code>squirrelfish-dev@lists.webkit.org</code> mailing list (<a href="http://lists.webkit.org/mailman/listinfo.cgi/squirrelfish-dev">subscribe here</a>) and the <a href="irc://irc.freenode.net/#squirrelfish">#squirrelfish IRC channel</a> on the FreeNode IRC network. Stop on by and you can learn more about our plans, and how you can help.</p>
<h4>Try it Out</h4>
<p>Try it, test it, browse with it. It’s <a href="http://nightly.webkit.org/">now available in nightlies</a>. We hope the changes we’ve made help improve your experience of the web.</p>
<p><b>UPDATE:</b> For the curious, here are some <a href="http://summerofjsc.blogspot.com/2008/09/squirrelfish-extreme-has-landed.html">comparisons of SFX to other leading JavaScript engines</a>. Charles Ying has <a href="http://www.satine.org/archives/2008/09/19/squirrelfish-extreme-fastest-javascript-engine-yet/">comparisons on a few more benchmarks</a>.</p>
<p><b>UPDATE 2:</b> For those of you who just can’t get enough of our little mascot, click the SquirrelFish below in a recent WebKit nightly for a demo of SVG animation support.</p>
<p><a href="http://webkit.org/blog-files/animation-demo.svg"><img alt="the SquirrelFish mascot" src="http://webkit.org/blog-files/squirrelfish.png"/></a></p></div>
    </content>
    <updated>2008-09-19T05:00:37Z</updated>
    <category term="Uncategorized"/>
    <author>
      <name>Maciej Stachowiak</name>
    </author>
    <source>
      <id>http://webkit.org/blog</id>
      <link href="http://webkit.org/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://webkit.org/blog" rel="alternate" type="text/html"/>
      <subtitle>All about WebKit development</subtitle>
      <title>Surfin' Safari</title>
      <updated>2008-10-23T12:42:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.mozilla.com/rob-sayre/?p=175</id>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/just-so-were-all-on-the-same-page-as-it-were/" rel="alternate" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/just-so-were-all-on-the-same-page-as-it-were/#comments" rel="replies" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/just-so-were-all-on-the-same-page-as-it-were/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Just So We’re All On The Same Page, As It Were</title>
    <summary xml:lang="en">All combinations of clear text HTTP traffic, cross domain JavaScript, DNS, and SSL present a security problem, in all browsers.</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>All combinations of clear text HTTP traffic, cross domain JavaScript, DNS, and SSL present a security problem, in all browsers.</p></div>
    </content>
    <updated>2008-09-17T23:35:21Z</updated>
    <published>2008-09-17T23:35:21Z</published>
    <category scheme="http://blog.mozilla.com/rob-sayre" term="Uncategorized"/>
    <author>
      <name>rsayre</name>
      <uri>http://blog.mozilla.com/rsayre/</uri>
    </author>
    <source>
      <id>http://blog.mozilla.com/rob-sayre/feed/atom/</id>
      <link href="http://blog.mozilla.com/rob-sayre" rel="alternate" type="text/html"/>
      <link href="http://blog.mozilla.com/rob-sayre/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">icuh8n</subtitle>
      <title xml:lang="en">Rob Sayre's Mozilla Blog</title>
      <updated>2008-10-31T22:01:42Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.mozilla.com/rob-sayre/?p=167</id>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/mozilla-is-linux/" rel="alternate" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/mozilla-is-linux/#comments" rel="replies" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/mozilla-is-linux/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Mozilla is Linux</title>
    <summary xml:lang="en">I think there’s been great progress on the Firefox first run experience. One thing that disturbed me about the initial response was the us vs. them mentality present in the feedback. It’s as though Linux users feel that Mozilla is a giant evil entity of some kind. The fact of the matter is that Mozilla [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I think there’s been <a href="http://blog.lizardwrangler.com/2008/09/16/firefox-without-eulas-update/">great</a> <a href="http://lockshot.wordpress.com/2008/09/17/licensing-proposal/">progress</a> on the Firefox first run experience. One thing that disturbed me about the initial response was the us vs. them mentality present in the feedback. It’s as though Linux users feel that Mozilla is a giant evil entity of some kind. The fact of the matter is that Mozilla is a tiny company that operates almost completely in the open, which means we make mistakes in public, and lots of us use Linux! We might have to run it on a macbook, because we need to fix bugs on three platforms minimum, but we do it. We’re also really small. Smaller than <a href="http://www.opera.com">Opera</a>, let alone Microsoft, Apple, and Google. We do employ a few lawyers. They believe in free software too.</p>
<p>Linux folks, please remember, we are you. As both users and developers. Here’s some Mozilla involvement you might not know about:</p>
<ul>
<li>Mozilla SpiderMonkey is used by many JavaScript embeddings, and distributed as a <a href="http://packages.debian.org/sid/spidermonkey-bin">separate package</a> on Debian.
</li><li>Mozilla developers actively contribute to <a href="http://gitweb.freedesktop.org/?p=cairo;a=shortlog">Cairo</a>, and Firefox 3 ships Cairo on all supported platforms. This was not practical or performant when Mozilla developers began contributing to Cairo.
</li><li>Mozilla developers have contibuted to libbpng, libjpeg, littlecms, pango, pixman, and other graphics libraries.
</li><li>Mozilla developers have actively contributed to <a href="http://www.valgrind.org">valgrind</a>, and built some amazing software on top of it.
</li><li>Mozilla developers now maintain both GNOME and Qt UI code, and contribute patches upstream.
</li><li>Mozilla helps to fund the <a href="http://www.sqlite.org/pressrelease-20071212.html">SQLite Consortium</a>.
</li><li>Many Linux projects use bugzilla.
</li><li>In 2007 alone, the Mozilla Foundation <a href="http://blog.hecker.org/2007/11/19/mozilla-foundation-grants-and-related-expenditures-for-2007/">gave grants</a> to the Perl Foundation, Creative Commons, the GNOME foundation, and the FSF, among others. It awarded contracts for work concerning OpenSSL, Accerciser, Orca, GNOME accessibility, and lots more open source accessibility work.
</li><li>Mozilla code and tests are used by WebKit and Chrome, so if you use one of those, Mozilla has helped make it real. It’s not Internet Explorer, and that’s what’s most important. <img alt=":)" class="wp-smiley" src="http://blog.mozilla.com/rob-sayre/wp-includes/images/smilies/icon_smile.gif"/>
</li></ul></div>
    </content>
    <updated>2008-09-17T20:26:14Z</updated>
    <published>2008-09-17T20:09:19Z</published>
    <category scheme="http://blog.mozilla.com/rob-sayre" term="Uncategorized"/>
    <author>
      <name>rsayre</name>
      <uri>http://blog.mozilla.com/rsayre/</uri>
    </author>
    <source>
      <id>http://blog.mozilla.com/rob-sayre/feed/atom/</id>
      <link href="http://blog.mozilla.com/rob-sayre" rel="alternate" type="text/html"/>
      <link href="http://blog.mozilla.com/rob-sayre/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">icuh8n</subtitle>
      <title xml:lang="en">Rob Sayre's Mozilla Blog</title>
      <updated>2008-10-31T22:01:42Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.mozilla.com/rob-sayre/?p=164</id>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/shapes/" rel="alternate" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/shapes/#comments" rel="replies" type="text/html"/>
    <link href="http://blog.mozilla.com/rob-sayre/2008/09/17/shapes/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Shapes</title>
    <summary xml:lang="en">Everyone’s doing it.
Brendan added shapes to SpiderMonkey for Firefox 3 earlier this year. These exploit the latent types present in most JavaScript code. This gave the non-JIT bytecode VM in Firefox 3 quite a speedup. In fact, it’s still the fastest non-beta JS implementation. But, wow, there sure has been progress. In development versions, I [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Everyone’s doing it.</p>
<p>Brendan added <a href="http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/js/src/jscntxt.h&amp;rev=3.205&amp;mark=404#404">shapes</a> to SpiderMonkey for Firefox 3 earlier this year. These exploit the latent types present in most JavaScript code. This gave the non-JIT bytecode VM in Firefox 3 quite a speedup. In fact, it’s still the fastest non-beta JS implementation. But, wow, there sure has been progress. In development versions, I think everyone other than IE is faster than Firefox 3 at this point.</p>
<p>In v8, I guess they call it a <a href="http://ajaxian.com/archives/v8-internals">hidden class system</a>. In SquirrelFish, I gather they call it StructureID.</p></div>
    </content>
    <updated>2008-09-17T18:42:34Z</updated>
    <published>2008-09-17T18:23:11Z</published>
    <category scheme="http://blog.mozilla.com/rob-sayre" term="Uncategorized"/>
    <author>
      <name>rsayre</name>
      <uri>http://blog.mozilla.com/rsayre/</uri>
    </author>
    <source>
      <id>http://blog.mozilla.com/rob-sayre/feed/atom/</id>
      <link href="http://blog.mozilla.com/rob-sayre" rel="alternate" type="text/html"/>
      <link href="http://blog.mozilla.com/rob-sayre/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">icuh8n</subtitle>
      <title xml:lang="en">Rob Sayre's Mozilla Blog</title>
      <updated>2008-10-31T22:01:42Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://ianloic.com/?p=67</id>
    <link href="http://feeds.feedburner.com/~r/ianloic/~3/391071942/" rel="alternate" type="text/html"/>
    <link href="http://ianloic.com/2008/09/12/meanwhile-in-the-day-job/#comments" rel="replies" type="text/html"/>
    <link href="http://ianloic.com/2008/09/12/meanwhile-in-the-day-job/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Meanwhile, in the day job</title>
    <summary xml:lang="en">A couple of months ago my role at Songbird shifted a little. Up till then I was working on the core product, fixing bugs and adding features across the whole product as part of the bird engineering team. Since we started working on 0.7 (aka Fugazi) I moved into a group initially called strategic development [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>A couple of months ago my role at <a href="http://www.songbirdnest.com/">Songbird</a> shifted a little. Up till then I was working on the core product, fixing bugs and adding features across the whole product as part of the bird engineering team. Since we started working on 0.7 (aka Fugazi) I moved into a group initially called <em>strategic development</em> which then split and merged with the design and product group.</p>
<p>We’ve been looking through feedback from our users, primarily through surveys to determine what features we can add that will address most users’ feature requests. Doing this outside engineering has been great since they can focus on improving the core product, keeping a clear vision of what the product we want should be, while we’re working directly from end-user feedback.</p>
<p>My first project was a new <a href="http://last.fm/">Last.fm</a> addon using our new playback history API. It was installed by default for all Songbird 0.7 users so it’s had <a href="http://addons.songbirdnest.com/addon/106">quite a bit of use</a>, <a href="http://getsatisfaction.com/songbird/tags/lastfm" title="Get Satisfaction threads tagged 'lastfm'">some good feedback</a>, <a href="http://bugzilla.songbirdnest.com/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=Add-Ons&amp;component=Last.fm&amp;long_desc_type=substring&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=a