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

<channel>
	<title>All Night Diner &#187; Mozilla</title>
	<atom:link href="http://micropipes.com/blog/tag/mozilla/feed/" rel="self" type="application/rss+xml" />
	<link>http://micropipes.com/blog</link>
	<description>because at 3am anything sounds good</description>
	<lastBuildDate>Fri, 20 May 2011 16:16:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>AMO 2011 Development Visualized</title>
		<link>http://micropipes.com/blog/2011/05/15/amo-2011-development-visualized/</link>
		<comments>http://micropipes.com/blog/2011/05/15/amo-2011-development-visualized/#comments</comments>
		<pubDate>Sun, 15 May 2011 23:48:36 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=233</guid>
		<description><![CDATA[I was playing around with gource this weekend while watching the TSL 3 Finals and pointed it at addons.mozilla.org&#8217;s source repository. I sped it up to display 1 day of commits per second and piped it all to ffmpeg to make a video. It turned out pretty well so here is addons.mozilla.org development so far [...]]]></description>
			<content:encoded><![CDATA[<p>I was playing around with <a href="http://code.google.com/p/gource/">gource</a> this weekend while watching the <a href="http://www.pokerstrategytsl3.com/">TSL 3 Finals</a> and pointed it at <a href="https://github.com/jbalogh/zamboni">addons.mozilla.org&#8217;s source repository</a>.  I sped it up to display 1 day of commits per second and piped it all to ffmpeg to make a video.  </p>
<p>It turned out pretty well so here is addons.mozilla.org development so far for 2011 (in HD!):</p>
<p><video width="1280" height="720" controls preload="none"><br />
    <source src="http://people.mozilla.org/~clouserw/public/blog/amo-2011-development.ogv" type='video/ogg; codecs="theora"'><br />
</video><br />
(Warning: prefetching is off but if you click play you&#8217;re in for an 80MB video.)</p>
<p>The gource docs are easy to read if you want to do this for your project, but for the record this is what I ran:<br />
<code><br />
gource --viewport 1280x720 \<br />
       --user-image-dir ~/sandbox/zamboni/.git/avatar/ \<br />
       --title "addons.mozilla.org" \<br />
       --auto-skip-seconds 1 \<br />
       --seconds-per-day 1 \<br />
       --start-position .715 \<br />
       --max-file-lag 0.5 \<br />
       --max-files 5000 \<br />
       --camera-mode track \<br />
       -o -<br />
</code></p>
<p>Piped to:<br />
<code><br />
ffmpeg -y \<br />
       -r 60 \<br />
       -f image2pipe \<br />
       -vcodec ppm \<br />
       -i - \<br />
       -vcodec libtheora \<br />
       -b 10000K \<br />
       ~/out.ogv<br />
</code></p>
<p>That gave me a 180MB uncompressed ogv.  The uncompressed version looks far nicer, but that&#8217;s a lot of bandwidth for a random video so I cut it down with ffmpeg2thoerea (anyone know the switch to do this directly in the ffmpeg command?):<br />
<code><br />
ffmpeg2theora -v 4<br />
              ~/out.ogv<br />
              --optimize<br />
              --noaudio<br />
              -o amo-2011-development.ogv<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2011/05/15/amo-2011-development-visualized/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://people.mozilla.org/~clouserw/public/blog/amo-2011-development.ogv" length="82392684" type="video/ogg" />
		</item>
		<item>
		<title>getpersonas.com: where it&#8217;s from, where it&#8217;s going</title>
		<link>http://micropipes.com/blog/2011/04/12/getpersonas-com-where-its-from-where-its-going/</link>
		<comments>http://micropipes.com/blog/2011/04/12/getpersonas-com-where-its-from-where-its-going/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 17:15:07 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[personas]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=224</guid>
		<description><![CDATA[getpersonas.com was started as a labs project in 2008. The plan was to get a website up and running to show off what lightweight themes were and see if they got any traction. If the site became popular, we&#8217;d merge it in to AMO in six or ten months and everyone would go back to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.getpersonas.com/">getpersonas.com</a> was started as a labs project in 2008.  The plan was to get a website up and running to show off what lightweight themes were and see if they got any traction.  If the site became popular, we&#8217;d merge it in to <a href="https://addons.mozilla.org/">AMO</a> in six or ten months and everyone would go back to working on other things.  Ha.  </p>
<p>As is all too common, way leads on to way, and now here we are three years later.  getpersonas.com has become a juggernaut of 3000x200px free expression on the web.  There are over 1.25 million registered users on the site, 400,000 personas, and a half million hits a day.  The site was built with scaling in mind and, honestly, has needed relatively little attention.</p>
<p>On the other hand, the site lost its owners and maintainers last year.  <a href="http://www.dria.org/wordpress/">Deb</a> stepped up with some awesome volunteers and contractors to fix minor issues but there are no dedicated developers to keep the site fresh.  The web security bounty program late last year wasn&#8217;t kind to the old code, and any time devoted to the site turned in to trudging through old PHP code to solve overlooked problems from long ago.</p>
<p>We&#8217;ve decided that this is the year to finally replace the precarious cron job synchronizing the getpersonas.com and AMO databases for the past 18 months and finally migrate the site to AMO completely.  This is no small undertaking, but we&#8217;ve had a lot of time to think about it. <img src='http://micropipes.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>I wrote a <a href="http://micropipes.com/greaterpercona/">migration plan</a> a few weeks ago as a general guide.  The searching and listing pages are already at parity with getpersonas.com.  The reviewer and author functionality will be added shortly &#8211; and if you read the bugs and look at the mockups you&#8217;ll see it&#8217;s <a href="http://people.mozilla.com/~chowse/drop/amo/personas/review/">greatly improved</a>.  This is a mutually beneficial migration; the personas will be able to leverage AMO features like statistics reporting and collections, and AMO will get a fresh look at reviewing user submitted content and an influx of creative designers.</p>
<p>I snuck in to a personas planning meeting last week and I saw a lot of fun stuff in the pipeline for personas.  I&#8217;m happy to say migrating them onto AMO will give everyone the server and developer resources to get that new stuff out the door.  This will get underway in Q3 of this year.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2011/04/12/getpersonas-com-where-its-from-where-its-going/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Welcome to the Landfill</title>
		<link>http://micropipes.com/blog/2011/03/29/welcome-to-the-landfill/</link>
		<comments>http://micropipes.com/blog/2011/03/29/welcome-to-the-landfill/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 21:26:31 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[L10n]]></category>
		<category><![CDATA[open web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=196</guid>
		<description><![CDATA[Anyone who has tried to set up AMO knows it&#8217;s no walk in the park even with the respectable amount of documentation. There are two big stumbling blocks: the database is large and complex, and a portion of the site functionality is still in PHP. Django&#8217;s syncdb can make a database, but the relationships in [...]]]></description>
			<content:encoded><![CDATA[<p>Anyone who has tried to set up <abbr title="addons.mozilla.org">AMO</abbr> knows it&#8217;s no walk in the park even with the <a href="http://jbalogh.github.com/zamboni/topics/installation/">respectable amount of documentation</a>.  There are two big stumbling blocks:  the database is large and complex, and a portion of the site functionality is still in PHP.  Django&#8217;s <em>syncdb</em> can make a database, but the relationships in the data is what&#8217;s hard and trying to load fixtures from the test cases is an exercise in frustration since they may or may not all combine into a useful set of data.</p>
<p>With the launch of <a href="https://landfill.addons.allizom.org/">landfill.amo</a>[1] we bypass the entire headache.  The site started with a clean database and I uploaded an add-on to show it worked, but otherwise it&#8217;s empty.  It&#8217;s compact, fast, and simple to use.  The beauty of the site for volunteers and casual developers is that the database and the filesystem are <a href="https://landfill.addons.allizom.org/db/">available in their entirety to download</a>.  This means you can check out the code, fill in the configuration, import the landfill database and have the site 90% running.[2]</p>
<p>Perhaps a testament to the obscene number of open bugs for AMO right now, but this also solves a second <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=510430">long standing problem</a> where localizers couldn&#8217;t see the entire site.  On landfill, anyone can be an administrator, an editor, or any other permission level they&#8217;d like; and they&#8217;ll be able to see the entire site.</p>
<p>If you&#8217;ve been overwhelmed or frustrated trying to set up AMO in the past, now is a good time to give it another shot.  The landfill should just get better with age and use &#8211; if a few people register and add some data the available database dumps will get richer.</p>
<p>If there is a part of the site that isn&#8217;t working and you need it to be, let me know.  Keep in mind this is only the new Python code, so the few parts that are still on PHP (like the admin panel) won&#8217;t be available until they are ported.  Code is updated near-instantly on commit, localization changes are updated every 5 minutes.</p>
<p>[1] Forgive the fake certificate.  This is a sandbox for developers, y&#8217;all know what you&#8217;re doing. <img src='http://micropipes.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>[2] Honestly, 90% is really all you need.  We do a lot of stuff for scalability, statistics, etc. and unless you&#8217;re actually working on that part of the site, you don&#8217;t need those elements running.  Of course, you&#8217;re more than welcome to turn them on, I&#8217;m just trying to make it easy.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2011/03/29/welcome-to-the-landfill/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>High level perspective on the switch from PHP to Python</title>
		<link>http://micropipes.com/blog/2011/03/27/high-level-perspective-on-the-switch-from-php-to-python/</link>
		<comments>http://micropipes.com/blog/2011/03/27/high-level-perspective-on-the-switch-from-php-to-python/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 22:39:03 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[hindsight]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=206</guid>
		<description><![CDATA[It may be fatuous to write this post before we&#8217;ve actually finished the transition from PHP to Python, but I started writing a different post and this is what came out. Sometimes that happens. In January of 2010 we started migrating addons.mozilla.org from CakePHP to Django. It was a controversial decision. Developers were ambivalent to [...]]]></description>
			<content:encoded><![CDATA[<p><em>It may be fatuous to write this post before we&#8217;ve actually finished the transition from PHP to Python, but I started writing a different post and this is what came out.  Sometimes that happens.</em></p>
<p>In January of 2010 we started migrating <a href="https://addons.mozilla.org">addons.mozilla.org</a> from CakePHP to Django.  It was a controversial decision.  Developers were ambivalent to excited, managers were opposed to neutral &#8211; a split anyone would expect.  When I <a href="http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/">first talked about it</a> I expected to be able to turn off PHP by the end of the year.  It didn&#8217;t turn out quite like that.  </p>
<p>Fifteen months later we&#8217;re still transitioning and it&#8217;s still stressful.  The toughest part about a major migration like this is that there is only one team that is doing the migration, continuing to add the new features we need, and all the while maintaining the old site.  That&#8217;s a stressful environment for developers since the interactions between the languages can be complicated, it&#8217;s stressful for managers because features take longer to complete, and it&#8217;s stressful for users (and QA for that matter) because issues <em>will</em> arise which are hard to reproduce and complicated to explain.</p>
<p>In the midst of all the work of migration, the rest of the company is still working:  the security team is <a href="http://blog.mozilla.com/security/2010/12/14/adding-web-applications-to-the-security-bug-bounty-program/">announcing bounties on our site</a> which means we need to be vigilant about fixing issues, project management continues to come up with features to be added, the site perseveres in its never-ending quest for a new <em>look and feel</em>, and <a href="http://blog.mozilla.com/addons/2011/03/22/firefox-4-add-ons/">Firefox 4 is using AMO like never before</a> meaning approaching 10,000 hits per second is a regular day.  All of that is specific to the add-ons site, but consider your own company if you&#8217;re thinking of going down the same road &#8211; what is coming up for your site that will throw a wrench in the works?</p>
<p>The meat and potatoes of it really comes down to:  Given the hindsight of today, would the migration be a good idea?  There isn&#8217;t a right answer for every site, but for AMO we did the right thing[1].  As of today the majority of pages that matter are on Python &#8211; there are some admin tools, and some cron jobs, and the occasional semi-obsolete public page that is on PHP, but for the most part, we&#8217;re looking really good (<a href="https://spreadsheets.google.com/ccc?key=0AgX-nlaDaTaBdGhVd3ZlU1ZySWRiNmZ4YmgxTkV6ZlE&#038;hl=en">less hand waving, more real data</a>).  My new (overly optimistic?) plan is to have PHP off by the end of <em>this</em> year.  We&#8217;ll see.</p>
<p>To give you an idea of man-hours, we&#8217;ve had anywhere from 3 to 6 superhero developers working on the site over the past 15 months, and it&#8217;s looking like the whole thing will take around 24 months.  That&#8217;s a big chunk of time for a site that needs to grow and evolve as quickly as popular sites do these days.</p>
<p>So, overall, I think the lesson is: any reasonably sized site is going to have rabbit holes in it.  At first glance AMO might look like it&#8217;s got a dozen &#8220;main&#8221; pages, with a couple dozen more supporting pages (and throw in a few more for the admin CRUD).  Have a look at that spreadsheet I linked above and you&#8217;ll see that&#8217;s not even remotely the case.  The spreadsheet even ignores sub-pages in a few places and doesn&#8217;t include any new features added in the past year.  If you&#8217;re considering a migration, think it through well.  Make a spreadsheet of every URL, identify the complicated areas, and make sure everyone is clear on the timeline and what it means for new features.  People will absolutely try to scope creep your migration &#8211; make it clear if a section of the site is migrating as-is or can be migrated and redesigned at the same time.  Redesigns add complexity for the developers but can earn you some good will with the users and managers and if you&#8217;re in this boat you can use all the good will you can get.  </p>
<p>May you have the best of luck with your decisions. <img src='http://micropipes.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>[1] I&#8217;ll write another post about pros/cons of the actual frameworks and platforms.  Let&#8217;s just assume we&#8217;re happy with the technical side of the switch for now.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2011/03/27/high-level-perspective-on-the-switch-from-php-to-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Status Watch: An add-on for noticing HTTP error codes</title>
		<link>http://micropipes.com/blog/2011/02/10/status-watch-an-add-on-for-noticing-http-error-codes/</link>
		<comments>http://micropipes.com/blog/2011/02/10/status-watch-an-add-on-for-noticing-http-error-codes/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 05:15:24 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[builder]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=189</guid>
		<description><![CDATA[Often on complex pages with many assets it can be easy to overlook assets which don&#8217;t load. Usually they are minor JS, CSS, or tracking pixels which aren&#8217;t noticed until you&#8217;ve spent way too long trying to track down the problem (or a month later you log into your stats dashboard to discover you haven&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Often on complex pages with many assets it can be easy to overlook assets which don&#8217;t load.  Usually they are minor JS, CSS, or tracking pixels which aren&#8217;t noticed until you&#8217;ve spent way too long trying to track down the problem (or a month later you log into your stats dashboard to discover you haven&#8217;t been collecting stats).</p>
<p>With the launch of the new <a href="https://builder.addons.mozilla.org">Add-on Builder</a> (still an alpha product, but usable) I decided to make my first Jetpack to fix this.</p>
<p>In only about <a href="https://builder.addons.mozilla.org/addon/1000273/latest/">20 lines of code</a> I was able to look for any 4xx or 5xx errors in the HTTP traffic and show a brief notification to the user about what went wrong and where.  The builder was a great development experience (lack of documentation aside) and was a breeze to do something relatively complex.</p>
<p>If you&#8217;ve wanted a similar add-on, feel free to use <a href="https://addons.mozilla.org/en-US/firefox/addon/status-watch/">Status Watch</a>.  It&#8217;s a Jetpack so you&#8217;ll need Firefox 4, but on the bright side, you won&#8217;t even need to restart the browser.  Just click and go.</p>
<p><em>I&#8217;ve had some requests to support a whitelist of sites so you don&#8217;t get notifications all over the web and I&#8217;ll add that when I get time.  It&#8217;s surprising how many sites have 403s and 404s though.</em></p>
<p>Update 2011-02-17:  Version 2 is on AMO now which supports a whitelist.  See the <a href="https://addons.mozilla.org/en-US/firefox/addon/status-watch/">AMO page</a> for details.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2011/02/10/status-watch-an-add-on-for-noticing-http-error-codes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CLI Split Windows in Vim</title>
		<link>http://micropipes.com/blog/2010/08/13/cli-split-windows-in-vim/</link>
		<comments>http://micropipes.com/blog/2010/08/13/cli-split-windows-in-vim/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 21:36:19 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[blah blah]]></category>
		<category><![CDATA[open web]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=170</guid>
		<description><![CDATA[I use split windows, both horizontally and vertically, in Vim all the time. I&#8217;ve always wanted to be able to split the window and then start a command line shell within that window but up until now that has just been a dream. My friend sent me a link to conque this morning which I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>I use split windows, both horizontally and vertically, in <a href="http://www.vim.org/">Vim</a> all the time.  I&#8217;ve always wanted to be able to split the window and then start a command line shell within that window but up until now that has just been a dream.</p>
<p><a href="http://hopson.ws/blog/">My friend</a> sent me a link to <a href="http://code.google.com/p/conque/">conque</a> this morning which I&#8217;m so taken with that it&#8217;s prompted me to drop coding and write a blog post.</p>
<p>Conque lets me do exactly what I&#8217;ve wanted, create shells within Vim.  In insert mode you interact with the shell as expected.  In normal mode you can scroll back through your history, yank text into buffers, paste and manipulate text.  Best thing ever.</p>
<p><a href="http://micropipes.com/blog/wp-content/img/vim_cli.png"><img src="http://micropipes.com/blog/wp-content/img/vim_cli_small.png" /></a><br />
<caption>Two files open on the left, three shells on the right; iPython, MySQL, and Django&#8217;s web server &#8211; all with syntax highlighting.</caption>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2010/08/13/cli-split-windows-in-vim/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>addons.mozilla.org ♥s unit tests.  Again.</title>
		<link>http://micropipes.com/blog/2010/05/03/addons-mozilla-org-%e2%99%a5s-unit-tests-again/</link>
		<comments>http://micropipes.com/blog/2010/05/03/addons-mozilla-org-%e2%99%a5s-unit-tests-again/#comments</comments>
		<pubDate>Mon, 03 May 2010 17:34:44 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=142</guid>
		<description><![CDATA[AMO has had an on-again off-again relationship with unit tests. A little over a year ago we had a thousand unit tests that sort of, mostly, ran. The problem is, PHP unit testing just isn&#8217;t as good as it should be. CakePHP relies on SimpleTest, one of the main PHP test suites. It worked relatively [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://addons.mozilla.org">AMO</a> has had an on-again off-again relationship with unit tests.  A little over a year ago we had <a href="http://micropipes.com/blog/2009/04/09/addonsmozillaorg-celebrates-1000-passing-unit-tests/">a thousand unit tests</a> that sort of, mostly, ran.  The problem is, PHP unit testing just isn&#8217;t as good as it should be.  CakePHP relies on <a href="http://www.simpletest.org/">SimpleTest</a>, one of the main PHP test suites.  It worked relatively well for a small number of tests, but as our suite grew, so did our troubles.</p>
<p>Our main issue was hitting a memory limit or the max execution time.  We hit the limits often for a variety of reasons, some legitimate bugs, and some because we tried to hack around things to make the tests run.  If we change the limits we affect the tests because they are running within the same environment.  There wasn&#8217;t really a concept of fixtures then, although it looks like <a href="http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite">CakePHP has stepped up there</a>.  The simple test web runner was hard to use and the mock objects were sometimes a little too mocked and missing some attributes.</p>
<p>All in all it was a heroic effort to get that many tests, but we didn&#8217;t maintain it because they were so slow to write and difficult to run.  Testing can be a pain to write, sure, but it shouldn&#8217;t be a burden like that.  Enter <a href="http://docs.djangoproject.com/en/dev/topics/testing/">Django&#8217;s testing suite</a> (built on top of <a href="http://docs.python.org/library/unittest.html">Python&#8217;s unittest</a>).  It has most of our complaints handled out of the box.  It&#8217;s very well documented, considers a lot of aspects of testing, supports fixtures, a built-in client, etc.  It&#8217;s a well thought out framework to build tests on.</p>
<p>We&#8217;re being more vigilant about requiring tests this time around, but they also aren&#8217;t as frustrating to write.  When you write them they actually work and they stay working.  Most of what you want is built in already.  For example, I wrote the password reset form we needed on AMO in Django.  With CakePHP and SimpleTest I&#8217;d have no idea how to test that the email was actually working.  It&#8217;s apparently possible <a href="http://www.curioussymbols.com/simplemail/">with a SimpleTest add-on</a> and enough code that I have to scroll in my browser.  With Django&#8217;s test suite the actual code was 5 lines, 3 of which were assertions:</p>
<pre><code class="python">
    def test_request_success(self):
        self.client.post('/en-US/firefox/users/pwreset',
                        {'email': self.user.email})

        eq_(len(mail.outbox), 1)
        assert mail.outbox[0].subject.find('Password reset') == 0
        assert mail.outbox[0].body.find('pwreset/%s' % self.uidb36) > 0
</code></pre>
<p>With the power of the new test suite we&#8217;re once again writing and maintaining our unit tests &#8211; currently at around 390 tests and increasing steadily.  Plenty of people have written about why unit tests are important so I won&#8217;t belabor the point, but I will mention that it&#8217;s a great feeling to be able to commit something and be confident it hasn&#8217;t affected other parts of the site.  It&#8217;s almost as good of a feeling when you write your code and a completely different test fails pointing out a case that you didn&#8217;t even consider but one that would soak up developer time trying to debug down the road.  </p>
<p>Building on a foundation that takes testing seriously is great.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2010/05/03/addons-mozilla-org-%e2%99%a5s-unit-tests-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuous Integration comes to AMO</title>
		<link>http://micropipes.com/blog/2010/04/07/continuous-integration-comes-to-amo/</link>
		<comments>http://micropipes.com/blog/2010/04/07/continuous-integration-comes-to-amo/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 14:54:13 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[statistics]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=139</guid>
		<description><![CDATA[It&#8217;s time to hail another milestone for AMO in our epic push for improvements in 2010. This time I&#8217;m happy to announce our Hudson continuous integration server which has been humming along for a few months. Hudson Integration Screenshot. Click to enlarge. AMO is the first Mozilla Webdev site to use continuous integration, and it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s time to hail another milestone for <a href="https://addons.mozilla.org/">AMO</a> in our <a href="http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/">epic push for improvements in 2010</a>.  This time I&#8217;m happy to announce our <a href="https://hudson.mozilla.org/job/preview.addons.mozilla.org/">Hudson continuous integration server</a> which has been humming along for a few months.</p>
<p><a href="http://micropipes.com/blog/wp-content/img/hudson_screenshot.png"><img src="http://micropipes.com/blog/wp-content/img/hudson_screenshot_small.png" title="Hudson Summary Screenshot" style="border:1px solid #000; padding:10px;" /></a></p>
<caption>Hudson Integration Screenshot.  Click to enlarge.</caption>
<p>AMO is the first Mozilla Webdev site to use continuous integration, and it&#8217;s been a long time coming.  With the way it&#8217;s currently configured we&#8217;ve got <a href="https://hudson.mozilla.org/job/preview.addons.mozilla.org/512/cobertura/?">code coverage trending</a>, <a href="https://hudson.mozilla.org/job/preview.addons.mozilla.org/512/testReport/?">unit test trending</a>, <a href="https://hudson.mozilla.org/job/preview.addons.mozilla.org/512/violations/?">code quality trending</a>, as well as detailed reports for all the above for every single check in.</p>
<p>If anything fails or oversteps a threshold our IRC bot complains and we can get it fixed up quickly.  It&#8217;s a boon to productivity to know that all the code being checked in is being tested automatically, plus it gives everyone a stable state to compare to.</p>
<p>Thanks to everyone that helped get Hudson going, from the <a href="http://blog.hudson-ci.org/">people that write it</a>, to <a href="http://blog.mozilla.com/it/">the IT team that keeps it alive</a>, to <a href="http://blog.mozilla.com/webdev/">the webdev team</a> that helped work out the kinks.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2010/04/07/continuous-integration-comes-to-amo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Maintaining localization between Python and PHP (it&#8217;s not fun)</title>
		<link>http://micropipes.com/blog/2010/03/08/maintaining-localization-between-python-and-php-its-not-fun/</link>
		<comments>http://micropipes.com/blog/2010/03/08/maintaining-localization-between-python-and-php-its-not-fun/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 22:42:00 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[L10n]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=115</guid>
		<description><![CDATA[I reached my hand into the barrel of problems our migration to Python is going to cause and came up with Localization. It figures. First out of the chute was the .po files. It turns out the actual formatting is different between the two languages. PHP uses %1$s for its substitutions, but python uses either [...]]]></description>
			<content:encoded><![CDATA[<p>I reached my hand into the barrel of problems <a href="http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/">our migration to Python</a> is going to cause and came up with Localization.  It figures.</p>
<p>First out of the chute was the .po files.  It turns out the actual formatting is different between the two languages.  PHP uses <em>%1$s</em> for its substitutions, but python uses either named variables like <em>(num)s</em> or integers like <em>{0}</em>.  For the record, they both support <em>%s</em> when you don&#8217;t need to order the substitutions.<br />
PHP example:<br />
<code>I have %2$s apples and %1$s oranges</code><br />
Python example:<br />
<code>I have {1} apples and {0} oranges</code></p>
<p>Since I&#8217;ve worked with the <a href="http://translate.sourceforge.net/wiki/">Translate Toolkit</a> before, I decided to write a script to convert between the two formats.  If you find yourself in the same unfortunate boat as me, behold<br />
<a href="http://translate.svn.sourceforge.net/viewvc/translate/src/trunk/translate/tools/phppo2pypo.py?view=markup">phppo2pypo</a> and <a href="http://translate.svn.sourceforge.net/viewvc/translate/src/trunk/translate/tools/pypo2phppo.py?view=markup">pypo2phppo</a> to convert between the two types.</p>
<p>Crisis averted, right?  Oh, that&#8217;s just scratching the surface.  Remember <a href="http://micropipes.com/blog/2008/07/09/adding-context-to-amo-po-files/">how happy I was that PHP finally started supporting msgctxt</a>?  Well, Python has had <a href="http://bugs.python.org/issue2504">a patch for it since 2008</a> but no one has bothered to land it.  I wrote a new <a href="http://github.com/clouserw/tower/blob/master/l10n/__init__.py">ugettext() and ungettext()</a> that recognizes context in the .po files.  To use simply do: <em>from l10n import ugettext as _</em> at the top of your file.</p>
<p>Along with adding msgctxt support, those two functions also collapse consecutive white space.  We&#8217;re using <a href="http://jinja.pocoo.org/2/">Jinja2</a> with <a href="http://babel.edgewall.org/">Babel</a> and the <a href="http://jinja.pocoo.org/2/documentation/extensions">i18n extension</a> as our template engine.  Jinja2 has a concept of stripping white space from the beginning or end of a string but does nothing about the middle.  A paragraph of text in a Jinja2 template would look like:<br />
<code><br />
  {% trans -%}Mozilla is providing links to these applications<br />
  as a courtesy, and makes no representations regarding the<br />
  applications or any information related thereto. Any questions,<br />
  complaints or claims regarding the applications must be<br />
  directed to the appropriate software vendor.<br />
  {%- endtrans %}<br />
</code></p>
<p>That&#8217;s a decent looking template, right?  Yeah, well, when Babel extracts that, it includes all the line breaks too, giving you something <a href="http://bitbucket.org/plurk/solace/src/tip/solace/i18n/messages.pot#cl-625">like this</a>.  The localizers would revolt if I sent them that, so I added in auto white-space collapsing.  Getting Babel to use the new functions means <a href="http://github.com/clouserw/tower/blob/master/tower/management/commands/extract.py">a new extraction script</a>.</p>
<p>At this point, we&#8217;re extracting strings from our new code and we can convert between Python and PHP files.  All we need now is a Frankenstein mix of xgettext functions to act as glue.  Meet the <a href="http://github.com/clouserw/tower/blob/master/l10n/management/commands/amalgamate.py">amalgamate script</a> that uses the pypo2php scripts, concatenates the .pot files, and merge updates each locales .po file.  After that it&#8217;s <a href="http://viewvc.svn.mozilla.org/vc?revision=63671&#038;view=revision">quick tweaks to the build scripts</a> to create z-messages.po files and we&#8217;re done.</p>
<p>So, all that said, the new process for L10n, while we&#8217;re in this transitional phase, is:</p>
<ol>
<li>From the PHP code, run <em>locale/extract-po-remora.sh</em>.  That pulls everything from all the PHP files, creates <em>locale/r-keys.pot</em>, updates the messages.po file for each locale, and compiles them.  Life used to be so simple.</li>
<li>From the python code, make sure you&#8217;re up to date, then run <em>./manage.py extract</em>.  That will pull everything from the python code and templates and create <em>locale/z-keys.pot</em>.</li>
<li>Run <em>./manage.py amalgamate</em>.  That will merge the z-keys.pot into the PHP messages.po files.</li>
<li>Localizers can make their changes as usual, and commit back to messages.po.</li>
<li>From PHP, <em>locale/copy-to-zamboni.py locale</em> will create z-messages.po files in the Python format. We could skip right to .mo files, but in case something goes wrong I want to see the .po files.</li>
<li>Then, like today, <em>locale/compile-mo.sh locale</em> will compile all the .po files.</li>
</ol>
<p>After all those steps are done, we&#8217;ve got duplicate .mo files, aside from formatting, and each application can look at its own .mo to get the strings it needs.  All this code is just a big band-aid and there are plenty of things that are more fun than juggling L10n between two applications across two <abbr title="Revision Control Systems">RCS</abbr>s.  But we knew what we were getting in to.  I&#8217;ll post something more positive later to help justify it. <img src='http://micropipes.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2010/03/08/maintaining-localization-between-python-and-php-its-not-fun/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>AMO Development Changes in 2010</title>
		<link>http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/</link>
		<comments>http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 21:44:12 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[hindsight]]></category>
		<category><![CDATA[L10n]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=98</guid>
		<description><![CDATA[The AMO team met in Mountain View last week to develop a 2010 plan. We&#8217;ve been wanting to change some key areas of our development flow for a while but we needed to make sure time was budgeted in the overall AMO and Mozilla goals. As usual, the timeline will be tight, but the AMO [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="https://addons.mozilla.org/"><abbr title="addons.mozilla.org">AMO</abbr></a> team met in Mountain View last week to develop a 2010 plan.  We&#8217;ve been wanting to change some key areas of our development flow for a while but we needed to make sure time was budgeted in the overall AMO and Mozilla goals.  As usual, the timeline will be tight, but the AMO developers do amazing work and as our changes are implemented, development should just get faster.  I&#8217;ll give a brief summary of the changes we&#8217;re planning; a lot of discussion went into this and I&#8217;m not going to be able to cover everything here.  If you&#8217;ve been in the AMO calls or reading the notes you probably already know most of this.</p>
<h3>Migrating from CakePHP to Django</h3>
<p>This is a big undertaking and we&#8217;ve been discussing it for quite a while.  We&#8217;re currently the highest trafficked site on the internet using <a href="http://cakephp.org/">CakePHP</a> and along with that we&#8217;ve run into a lot of frustrating issues.  CakePHP has serviced AMO well for several years, so it&#8217;s not my intention to bad mouth it here, but I do want to give a fair summary of why we&#8217;re moving on.  Please also note that <em>AMO is still running on CakePHP 1.1 which is, I think, a year out of date</em>?  Three substantial issues:</p>
<ul>
<li><strong>Useful Database Abstraction Layer:</strong>  CakePHP has a concept of database abstraction, but we didn&#8217;t find it powerful enough.  When it did work it would return enormous nested arrays of data causing massive CPU and memory usage (out of memory errors plague us on AMO).  When it didn&#8217;t work, we&#8217;d end up doing queries directly which kind of defeats the purpose.  We couldn&#8217;t use prepared statements so we&#8217;d have to escape variables ourselves.  There was no effective caching built-in and since we just had huge arrays as a response there was no effective way to invalidate the cache we were using (see: <a href="http://micropipes.com/blog/2008/04/23/caching-is-easy-expiration-is-hard/">Caching is easy; Expiration is hard</a>).  The DB layer should return objects that are easy to cache and easy to invalidate.  The built-in Django database classes (combined with memcache) should work fine for us here.</li>
<li><strong>Effective unit tests:</strong>  I&#8217;ve <a href="http://micropipes.com/blog/2009/04/09/addonsmozillaorg-celebrates-1000-passing-unit-tests/">beat the drum about our unit tests before</a> but the simple matter is that it&#8217;s really difficult to do them right with the tools we are using.  Our test data is already very limited, but if we try to run all our tests right now they&#8217;ll run out of memory (and take forever).  The CakePHP method of mocking controllers and models was inadequate for what we needed and difficult to deal with.  We want our unit tests to run quickly, from the command line, and be independent from each other so there aren&#8217;t intermittent problems to waste our time with.  We&#8217;ll be using Django&#8217;s <a href="http://docs.djangoproject.com/en/dev/topics/testing/">built-in testing framework</a>.</li>
<li><strong>Better debugging:</strong>  Debugging in CakePHP amounts to defining a DEBUG level and seeing what is printed on the screen (usually the giant arrays).  We supplemented this with <a href="http://www.xdebug.org/">Xdebug</a> where we needed it, but that&#8217;s still not enough.  A framework should have excellent logging and on-the-fly debugging that displays a full traceback (often something will fail deep within CakePHP and we&#8217;ll get the file/line where PHP gave up, but not the line in our code that started the problem), the values of variables, the page headers, server settings, SQL that was run, what views and elements are in use, etc.  We&#8217;re planning on using a combination of <a href="http://docs.python.org/library/pdb.html">pdb</a>, <a href="http://ipython.scipy.org/moin/">IPython</a>, and the <a href="http://robhudson.github.com/django-debug-toolbar/">django-debug-toolbar</a> to make all of this easily accessible while developing.</li>
</ul>
<p>Those are the major issues we&#8217;re having right now, but if you want to dig into the comparison some more check out our <a href="https://wiki.mozilla.org/AMO:v4">discussion wiki pages</a>, but realize the majority of discussion happened in person.</p>
<h3>Moving away from <abbr title="Subversion">SVN</abbr></h3>
<p>We moved AMO into SVN in 2006 and it&#8217;s treated us relatively well.  Somewhere along the line, we decided to tag our production versions at a revision of trunk instead of keeping a separate tag and merging changes into it.  It&#8217;s worked for us but it&#8217;s a hard cutoff on code changes, which means that while we&#8217;re in a code freeze no one can check anything in to trunk.  As we begin to branch for larger projects this will become more of a hassle, so I&#8217;m planning on going back to a system where a production tag is created and changes are merged into it as they are ready to go live.</p>
<p>Most of the development team has been using <a href="http://kernel.org/pub/software/scm/git/docs/git-svn.html">git-svn</a> for several months and, aside from the commands being far more verbose, we haven&#8217;t had many complaints.  We&#8217;ve discovered <a href="http://git-scm.com/">Git</a> is a much more powerful development tool and we expect to use it directly starting some time next year.  As of now, we expect to maintain the /locales/ directory in SVN so this change doesn&#8217;t affect localizers but we&#8217;ll keep people notified if there are any changes to that process.</p>
<h3>Continuous Integration</h3>
<p>I mentioned excellent testing being one of the reasons we&#8217;re moving to Django.  Along with that testing is the opportunity for continuous integration.  We plan on using <a href="https://hudson.dev.java.net/">Hudson</a> as the framework for our continuous integration.  With excellent test coverage and quick feedback from Hudson this should drastically lower our regressions and boost our confidence when we deploy.  Speaking of which&#8230;</p>
<h3>Faster Deployment</h3>
<p>For most of 2009 we&#8217;ve pushed on 3 week cycles.  2 weeks of development, 1 week of <abbr title="Quality Assurance">QA</abbr> and <abbr title="Localization">L10n</abbr>.  Delays and regressions being what they are, I think we averaged a little better than a push a month.  This is a fairly rapid cycle for a lot of development shops, but I feel like it&#8217;s holding us back.  We&#8217;ve heard a lot of success stories about shorter  cycles and I&#8217;d like to aim for deployment (optionally, of course) of a few times per week.  By shortening the development cycle we reduce the stress of:</p>
<ul>
<li><strong>the developers:</strong>  Everyone likes to see what they&#8217;ve done go out quicker and it means less conflicts with others when the patches are smaller.</li>
<li><strong>the QA team:</strong> Right now we dump 2 weeks of work on them and say we need it done right away.  With smaller cycles they can verify small changes as they go and not be overwhelmed.</li>
<li><strong>the infrastructure team:</strong> Smaller changes means less to go wrong and with a continuous integration server and some automation they can have minimal involvement with the whole process.</li>
<li><strong>the localizers:</strong> Every time we release we dump a bunch of changes on these fantastic people and tell them we need them back in a week.  Most of the time they plow forward and get them done on time.  If they don&#8217;t though, they are stuck with waiting for the next 3 week cycle.  If we push often, it&#8217;s not a big deal.</li>
<li><strong>the product managers:</strong> These guys come up with crazy ideas for us to implement and then they stare at graphs and numbers to see if it worked.  With shorter cycles they can get faster feedback about what works and what doesn&#8217;t.</li>
<li><strong>the users:</strong> Faster release cycles means bugs that are fixed in the repository are fixed on the live site sooner.  &#8217;nuff said.</li>
</ul>
<h3>Process Data Offline</h3>
<p>Much of AMO relies on cron jobs to get things done.  All the statistics, add-on download numbers, how popular an add-on is, all the star rating calculations, any cleanup or maintenance tasks &#8211; these are all run via cron and they are so intensive that the database has trouble keeping up.  We&#8217;re planning on utilizing <a href="http://gearman.org/">Gearman</a> to farm all this work out to other machines in incremental pieces instead of single huge queries.  Any heavy calculating that can be done offline will be moved to these external processors which should help improve the speed of the site and make all our statistics more reliable (as currently the cron jobs have a tendency to fail before they are complete).</p>
<h3>Improve the Documentation</h3>
<p>Documentation is a noble goal of many developers but it rarely gets enough attention.  We evaluated our <a href="https://wiki.mozilla.org/AMO:Developers">current documentation</a> and found it is woefully out of date.  By being on a wiki that is rarely used it doesn&#8217;t get updated except when someone tries to use it and sees it&#8217;s not right.  We&#8217;re hoping to change that by moving the developer documentation into the code repository itself.  We&#8217;ll be able to integrate with generated API docs, style the docs however we want, and check in changes right along with our code patches.  When someone checks out a copy of AMO, they&#8217;ll get all the documentation right along with it.  We&#8217;ll use <a href="http://sphinx.pocoo.org/">Sphinx</a> to build the docs.</p>
<p>The outline above details several large, high-level changes but there are a lot of other plans for smaller improvements as well.  This post got a lot longer than I was expecting, but I&#8217;m really excited about the direction AMO is headed for 2010.  As these changes are implemented the site will become more responsive and reliable, and we&#8217;ll be able to adapt to the needs of Mozilla&#8217;s users even faster.  As always, feedback and discussion are welcome and stay tuned for further back end improvements.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
	</channel>
</rss>

