<?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; AMO</title>
	<atom:link href="http://micropipes.com/blog/tag/amo/feed/" rel="self" type="application/rss+xml" />
	<link>http://micropipes.com/blog</link>
	<description>because at 3am anything sounds good</description>
	<lastBuildDate>Tue, 10 Apr 2012 17:38:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>How to get a development instance of AMO set up in about 10 minutes</title>
		<link>http://micropipes.com/blog/2012/04/10/how-to-get-a-development-instance-of-amo-set-up-in-about-10-minutes/</link>
		<comments>http://micropipes.com/blog/2012/04/10/how-to-get-a-development-instance-of-amo-set-up-in-about-10-minutes/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 17:29:54 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=256</guid>
		<description><![CDATA[Last year we set up landfill.amo to give contributors an easy base to set up the addons.mozilla.org site. Easy is relative here, of course, but it was a big leap over what we had at the time. Kumar leapfrogged that milestone by adding Vagrant configuration scripts to our repository. Now you can have a running [...]]]></description>
			<content:encoded><![CDATA[<p>Last year <a href="http://micropipes.com/blog/2011/03/29/welcome-to-the-landfill/">we set up landfill.amo</a> to give contributors an easy base to set up the addons.mozilla.org site.  Easy is relative here, of course, but it was a big leap over what we had at the time.</p>
<p><a href="http://farmdev.com/">Kumar</a> leapfrogged that milestone by adding <a href="http://vagrantup.com/">Vagrant</a> configuration scripts to our repository.  Now you can have a running version of AMO on your local system in about 3-5 commands[1].  </p>
<p>Check out <a href="http://mozilla.github.com/zamboni/topics/install-zamboni/install-with-vagrant.html">the steps to install AMO with Vagrant</a> to see how.  I set it up on OS X last week and aside from waiting for the download it only took a few minutes.  Drop by #amo on IRC if you run into any troubles.</p>
<p>[1]  Setting this up on Windows is apparently more difficult although one contributor did find success after fighting with it for some time.</p>
<p><em>Edit: Updated the installation instructions URL</em></p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2012/04/10/how-to-get-a-development-instance-of-amo-set-up-in-about-10-minutes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP is dead!  (on addons.mozilla.org)</title>
		<link>http://micropipes.com/blog/2012/04/09/php-is-dead-on-addons-mozilla-org/</link>
		<comments>http://micropipes.com/blog/2012/04/09/php-is-dead-on-addons-mozilla-org/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 17:26:57 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[L10n]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=267</guid>
		<description><![CDATA[This is just a short note to recognize the long coming milestone of PHP being effectively off[1] on addons.mozilla.org. We started the migration in 2010 and just finished it up a couple weeks ago. After the major pages were completed it was hard to budget time for all the minor details we had implemented since [...]]]></description>
			<content:encoded><![CDATA[<p>This is just a short note to recognize the long coming milestone of PHP being effectively off[1] on addons.mozilla.org.  We <a href="http://micropipes.com/blog/2009/11/17/amo-development-changes-in-2010/">started the migration</a> in 2010 and just finished it up a couple weeks ago.  After the major pages were completed it was hard to budget time for all the minor details we had implemented since there was so much other important stuff to do (I&#8217;m looking at you, marketplace.mozilla.org).  Now that the switch is done though we can simplify our setup instructions for AMO, simplify our infrastructure, optimize apache for python only, have full unit test coverage &#8211; the list goes on.</p>
<p>A big thanks to all the developers who made the switch possible, and especially the ones at the end who were working on migrating PHP scripts instead of more glorious projects.  Thanks to the management and all the other folks affected by the switch for being patient with the scheduling.  Thanks to the localizers for dealing with the crazy merged .po files, and, of course, thanks to the users of AMO for reporting bugs when they happened and generally being an all around great community to work with.</p>
<p>[1] Currently all traffic is being rewritten to a WSGI handler for Python.  PHP is still on the server but nothing uses it.  We&#8217;ll be removing it completely in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2012/04/09/php-is-dead-on-addons-mozilla-org/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Choosing your own greener grass</title>
		<link>http://micropipes.com/blog/2012/04/06/choosing-your-own-greener-grass/</link>
		<comments>http://micropipes.com/blog/2012/04/06/choosing-your-own-greener-grass/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 16:39:09 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[hindsight]]></category>
		<category><![CDATA[leadership]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=250</guid>
		<description><![CDATA[A lot of my time is spent trying to arrange projects and schedules so we can get code shipped in a reasonable time. AMO has the blessing/curse of being broad enough that there is work to do in nearly every area on the site. Once the highest priority areas have people working on them there [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of my time is spent trying to arrange projects and schedules so we can get code shipped in a reasonable time.  AMO has the blessing/curse of being broad enough that there is work to do in nearly every area on the site.  Once the highest priority areas have people working on them there is still plenty of work to go around that isn&#8217;t as time critical.</p>
<p>Last March there was some feedback from developers about being tired of the code they were working on and eyeing other technologies but not having the time to work with them.  This is a fragile balance which every manager and developer has had to struggle with.  Writing new code is always sexier than maintaining old code, but the old code is the bread and butter that keeps you in business.  Finding a happy medium is a noble, elusive, and unfortunately, shifting goal.</p>
<p>Enjoying what you work on is crucial to being happy and productive though so I&#8217;ll continue to pursue that goal.  </p>
<p>One of the changes we experimented with at the time was to let developers choose their own focus for the quarter.  We still had high level quarterly goals that needed to be done, but that left plenty of other time throughout the quarter to work on any of those areas which were all equally important but perhaps not equally as interesting.  I filled up a whiteboard with ideas one morning (and left space for developers to add more) and we had a meeting later in the day where anyone could discuss the ideas and sign up for what was interesting to them.  This was a short term commitment from the developers and they got to work on what they cared about.  From a managerial perspective, it increased motivation but didn&#8217;t sacrifice accountability.  Since I knew the focus of the developers early in the quarter, I could help clear out roadblocks that they&#8217;d meet before they even started working on their areas.</p>
<p>The quarter is over this week and overall the idea was a success.  All the feedback from developers was positive &#8211; if you&#8217;re looking for a way to spice up the top-down approach to goal setting this was effective.  It also turned the goal setting into more of a discussion rather than an edict that just shows up.</p>
<p><em>I wrote this almost 9 months ago but apparently never hit publish.  So, here it is.  We&#8217;ve played with it a bit since but haven&#8217;t had a large quarterly planning meeting like that because we&#8217;re mainly focused on the marketplace.  Experimenting with smaller goals is a next step here, and doing the meetings on a weekly or biweekly basis.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2012/04/06/choosing-your-own-greener-grass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>7</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>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>Libraries to connect to a Citrix NetScaler or Zeus Traffic Manager</title>
		<link>http://micropipes.com/blog/2010/03/23/libraries-to-connect-to-a-citrix-netscaler-or-zeus-traffic-manager/</link>
		<comments>http://micropipes.com/blog/2010/03/23/libraries-to-connect-to-a-citrix-netscaler-or-zeus-traffic-manager/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 18:56:57 +0000</pubDate>
		<dc:creator>Wil Clouser</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[AMO]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[scalability]]></category>

		<guid isPermaLink="false">http://micropipes.com/blog/?p=133</guid>
		<description><![CDATA[The first front end cache we used on AMO was the Citrix NetScaler. I&#8217;ve complained about it&#8217;s API before but apparently never announced the library I wrote to purge items from the cache. So, a little late, but I have some reusable PHP code that will talk to your NetScaler and let you expire objects. [...]]]></description>
			<content:encoded><![CDATA[<p>The first front end cache we used on <a href="https://addons.mozilla.org/">AMO</a> was the <a href="http://www.citrix.com/English/ps2/products/product.asp?contentID=21679">Citrix NetScaler</a>.  I&#8217;ve <a href="http://micropipes.com/blog/2008/07/14/planning-your-api-is-important/">complained about it&#8217;s API before</a> but apparently never announced the library I wrote to purge items from the cache.  So, a little late, but I have <a href="http://viewvc.svn.mozilla.org/vc/libs/ns-api/">some reusable PHP code that will talk to your NetScaler</a> and let you expire objects.</p>
<p>We hit some limitations with the NetScaler that we weren&#8217;t happy with.  Cost aside, it ignored some pretty standard stuff like the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44">HTTP Vary Header</a>.  After working around that for years we switched to the horizontally scalable <a href="http://www.zeus.com/products/traffic-manager/index.html">Zeus Traffic Manager</a> (at that time, referred to as ZXTM).  We&#8217;ve been pleased with our choice and six months ago I wrote a <a href="http://viewvc.svn.mozilla.org/vc/libs/zxtm-api/">similar PHP library that allows you to connect to Zeus&#8217;s API</a>.  Time and priorities being what they are, we never implemented it in production.</p>
<p>Finally, the real point to this post, last night I wrote a <a href="http://github.com/clouserw/hera">python library that will expire content from Zeus</a>.  We&#8217;ll roll this into our migration and waiting on content to expire from Zeus should be a thing of the past.</p>
<p>As always, if you can use the libraries, feel free.  They all have READMEs with examples.</p>
]]></content:encoded>
			<wfw:commentRss>http://micropipes.com/blog/2010/03/23/libraries-to-connect-to-a-citrix-netscaler-or-zeus-traffic-manager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

