<?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>Maggot Brain</title>
	<atom:link href="http://blog.mozilla.org/axel/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mozilla.org/axel</link>
	<description>Free your mind and your ass will follow.</description>
	<lastBuildDate>Mon, 13 May 2013 12:36:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>git-merge 2013</title>
		<link>http://blog.mozilla.org/axel/2013/05/13/git-merge-2013/</link>
		<comments>http://blog.mozilla.org/axel/2013/05/13/git-merge-2013/#comments</comments>
		<pubDate>Mon, 13 May 2013 12:36:49 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[GitMerge]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=527</guid>
		<description><![CDATA[I spent Friday and Saturday on git-merge, an unconference on git. Thursday was developer day, for core contributors to git itself, and libgit2/jgit. I didn&#8217;t go there. Friday was &#8220;user&#8221; day, and Saturday was hackday. I figured it might be useful to go to the userday, and turned out, it was. It wasn&#8217;t all that [...]]]></description>
				<content:encoded><![CDATA[<p>I spent Friday and Saturday on <a href="http://git-merge.com/">git-merge</a>, an unconference on git. Thursday was developer day, for core contributors to git itself, and libgit2/jgit. I didn&#8217;t go there. Friday was &#8220;user&#8221; day, and Saturday was hackday. I figured it might be useful to go to the userday, and turned out, it was. It wasn&#8217;t all that much about users at all. It was strictly unconference, so people would take the stage and give a quick lightening talk, and later in the day we had a few breakout sessions. The most user-like people were folks migrating to git just now, and they had a good deal of folks to talk to in the breakout session.</p>
<p>The rest of Friday was actually library and tool hackers talking about what they&#8217;re doing. There are notes on <a href="https://github.com/git-merge/user-day/blob/master/docs/01-index.md">github.com/git-merge/user-day</a>, but I do want to hightlight a few.</p>
<p><a href="https://github.com/mhagger/git-imerge">imerge</a> is probably the most interesting to gecko hackers. It allows you to merge or rebase intensive histories with conflicts incrementally, with tons of automation. It even allows to do test runs on the merges it does automatically. If you ever resolved the same conflict 10 times in one rebase, this is for you.</p>
<p>libgit2 was under the hood of many, with core contributors of the library itself being there, plus the maintainers of at least the C# and the python bindings. There was also a good deal of tooling based on jgit, a pure-java implementation of git.</p>
<p>Much debate on java vs not, actually. And Cmd-F1. Little conflict between git and hg.</p>
<p>I also got to enjoy the github backend talk by <a href="https://github.com/vmg">vmg</a>, with Ernie, Bert, and smoke through chimneys. I had seen a recording of it before, but it was well worth it seeing it live.</p>
<p>I joined the breakout session about teaching git, and had the pleasure to be in a group that tought git in various parts of the globe. Yes, that might be relevant to me, so that was good exercise. I talked with <a href="https://github.com/schacon">Scott Schacon</a> about localized version of the git book, and localized github docs, too.</p>
<p>Given that I had the chance to talk and co-hack with all those tooling guys, I decided to drop by on Saturday for the hack day. I wanted to take the opportunity to talk about my weird repository rewrite questions, and so I did.</p>
<p>Saturday was great. I only got 20 lines of code written, but I finally understood what git is about in the back-end. There&#8217;s loads of hackery that you can do, and funny enough, both I and <a href="https://github.com/ben">Ben</a> ended up hacking on a repository rewrite algorithm, which helped me a lot, both talking about the structure of the code, as well as vetting the approach. His code in C# is actually in a <a href="https://github.com/libgit2/libgit2sharp/pull/429">PR</a>. Worth a look for people that want to see how to hack tooling on top of that binding. I tried the same in python, and succeeded to some extent. David Ibáñez helped me a great deal. But it also showed me the difference between the C# API and the python bindings. If only mono was easy to get up on the mac.</p>
<p>On the conference itself, it was set up at the Radisson Blu next to the Berliner Dom, which is a nice venue for that size. Wifi worked, food and beer were there. It&#8217;s sad that many people claimed tickets and didn&#8217;t show up. Now you know what you missed, and what you made other people miss. Bad bunny, no chocolates! Thanks again for Jen for setting things up great.</p>
<p>Thanks to all the folks at git-merge for making it a great event. See you in Berlin…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2013/05/13/git-merge-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let me shake your hand</title>
		<link>http://blog.mozilla.org/axel/2013/04/02/let-me-shake-your-hand/</link>
		<comments>http://blog.mozilla.org/axel/2013/04/02/let-me-shake-your-hand/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 22:57:42 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=521</guid>
		<description><![CDATA[Timely for the 15 years of mozilla, let me share this with you. I was wearing my Firefox hoodie in a store in San Francisco last week. I was trying to find out what to buy, and a young guy came by. I did let him pass, but he didn&#8217;t find what he wanted, and [...]]]></description>
				<content:encoded><![CDATA[<p>Timely for the 15 years of mozilla, let me share this with you.</p>
<p>I was wearing my Firefox hoodie in a store in San Francisco last week. I was trying to find out what to buy, and a young guy came by. I did let him pass, but he didn&#8217;t find what he wanted, and left the store. Just a moment later he returned and said</p>
<blockquote><p>I&#8217;ve been using Firefox for 10 years, and I&#8217;d like to shake your hand.</p></blockquote>
<p>First of all, feel your hand shaken. It&#8217;s obviously us and not me.</p>
<p>But more importantly, this happened in the US. For the longest time, folks from the US would tell those stories coming back from Europe. We&#8217;re finally there, across the globe.</p>
<p>And when it comes down to the mission, we&#8217;re obviously winning. I love to tell people that I work for Mozilla. And mostly everybody knows that we exist, and more importantly, knows that they have a choice between various browsers. And they&#8217;re making a choice.</p>
<p>So here&#8217;s to 15 more years to choice and innovation on the internet.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2013/04/02/let-me-shake-your-hand/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Risk management for releases at scale</title>
		<link>http://blog.mozilla.org/axel/2013/02/15/risk-management-for-releases-at-scale/</link>
		<comments>http://blog.mozilla.org/axel/2013/02/15/risk-management-for-releases-at-scale/#comments</comments>
		<pubDate>Fri, 15 Feb 2013 15:26:39 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[L10n]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=504</guid>
		<description><![CDATA[Let me share some recent revelations I had. It all started with the infamous Berlin airport. Not the nice one in Tegel, but the BBI desaster. The one we&#8217;ve thought we&#8217;d open last year, and now we don&#8217;t know which year. Part of the newscoverage here in Germany was all about how they didn&#8217;t do [...]]]></description>
				<content:encoded><![CDATA[<p>Let me share some recent revelations I had. It all started with the infamous Berlin airport. Not the nice one in Tegel, but the <abbr title="Berlin-Brandenburg International">BBI</abbr> desaster. The one we&#8217;ve thought we&#8217;d open last year, and now we don&#8217;t know which year.</p>
<p>Part of the newscoverage here in Germany was all about how they didn&#8217;t do any risk analysis, and are doomed, and how that other project for the Olympics in London did do risk analysis, and got in under budget, ahead of time.</p>
<p>So what&#8217;s good for the Olympics can&#8217;t be bad for Firefox, and I started <a href="http://pike.github.com/release-scale/docs/math.html" title="annoted source code used later">figuring out the math</a> behind our risk to ship Firefox, at a given time, with loads of localizations. <em>How likely is it that we&#8217;ll make it?</em></p>
<p>Interestingly enough, the same algorithm can also be applied to a set of features that are scheduled for a particular Firefox release. Locales, features, blockers, product-managers, developers, all the same thing :-). Any bucket of N things trying to make a single deadline have similar risks. And the same cure. So bear with me. I&#8217;ll sprinkle graphs as we go to illustrate. They&#8217;ll <a href="http://pike.github.com/release-scale/">link to a site</a> that I&#8217;ve set up to play with the numbers, reproducing the shown graphs.</p>
<p>The setup is like this: Every single item (localization, for exampe) has a risk, and I&#8217;m assuming the same risk across the board. I&#8217;m trying to do that N times, and I&#8217;m interested in how likely I&#8217;ll get all of them. And then I evaluate the impact of different amounts of freeze cycles. If you&#8217;re like me, and don&#8217;t believe any statistics unless they&#8217;re done by throwing dices, check out the <a href="http://pike.github.com/release-scale/dices/">dices demo</a>.</p>
<p>Anyway, let&#8217;s start with 20% risk per locale, no freeze, and up to 100 locales.</p>
<p><a href="http://pike.github.com/release-scale/?freezes=0&amp;locales=1,3,20,100&amp;likely=80"><img src="http://blog.mozilla.org/axel/files/2013/02/Bildschirmfoto-2013-02-13-um-15.20.07.png" alt="80%, no freeze, up to 100" width="796" height="391" class="aligncenter size-full wp-image-505" /></a></p>
<p>Ouch. We&#8217;re crossing 50-50 at 3 items already, and anything at scale is a pretty flat zero-chance. Why&#8217;s that? What we&#8217;re seeing is an exponential decay, the base being 80%, and the power being how often we do that. This is <strong>revelation one</strong> I had this week.</p>
<p>How can we help this? If only our teams would fail less often? Feel free to play with the numbers, like setting the successrate from 80% to 90%. Better, but the system at large still doesn&#8217;t scale. To fight an exponential risk, we need a cure that&#8217;s exponential.</p>
<p>Turns out freezes are just that. And that&#8217;d be <strong>revelation two</strong> I had this week. Let&#8217;s add some 5 additional frozen development cycles.</p>
<p><a href="http://pike.github.com/release-scale/?freezes=5&amp;locales=1,3,20,100&amp;likely=80"><img src="http://blog.mozilla.org/axel/files/2013/02/Bildschirmfoto-2013-02-13-um-15.55.08.png" alt="80%, 5 freezes, up to 100" width="776" height="374" class="aligncenter size-full wp-image-507" /></a></p>
<p>Oh hai. At small scales, even just one frozen cycle kills risks. Three features without freeze have a 50-50 chance, but with just one freeze cycle we&#8217;re already at 88%, which is better than the risk of each individual feature. At large scales like we&#8217;re having in l10n, 2 freezes control the risk to mostly linear, 3 freezes being pretty solid. If I&#8217;m less confident and go down to 70% per locale, 4 or 5 cycles create a winning strategy. In other words, for a base risk of 20-30%, 4-5 freeze cycles make the problem for a localized release scale.</p>
<p>It&#8217;s actually intuitive that freezes are (kinda) exponentially good. The math is a tad more complicated, but simplified, if your per-item success rate is 70%, you only have to solve your problem for 30% of your items in the next cycle, and for 9% in the second cycle. Thus, you&#8217;re fighting scale with scale. You can see this in action on the <a href="http://pike.github.com/release-scale/dices/">dices demo</a>, which plays through this each time you &#8220;throw&#8221; the dices.</p>
<p>Now onwards to my <strong>third revelation</strong> while looking at this data. Features and blockers are just like localizations. Going in to the rapid release cycle with Firefox 5 etc, we&#8217;ve made two rules:</p>
<ul>
<li>Feature-freeze and string-freeze are on migration day from central to aurora</li>
<li>Features not making the freeze take the next train</li>
</ul>
<p>That worked fine for a while, but since then, mozilla has grown as an organization. We&#8217;ve also built out dependencies inside our organization that make us want particular features in particular releases. That&#8217;s actually a good situation to be in. It&#8217;s good that people care, and it&#8217;s good that we&#8217;re working on things that have organizational context.</p>
<p>But this changed the risks in our release cycle. We started off having a single risk of exponential scale after the migration date (l10n). Today, we have features going in to the cycle, and localizations thereof. At this point, having feature-freeze and string-freeze being the same thing becomes a risk for the release cycle at large. We should think about how to separate the two to mitigate the risk for each effectively, and ship awesome and localized software.</p>
<p>I learned quite a bit looking at our risks, I hope I could share some of that.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2013/02/15/risk-management-for-releases-at-scale/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Language packs are restartless now</title>
		<link>http://blog.mozilla.org/axel/2012/09/27/language-packs-are-restartless-now/</link>
		<comments>http://blog.mozilla.org/axel/2012/09/27/language-packs-are-restartless-now/#comments</comments>
		<pubDate>Thu, 27 Sep 2012 11:04:39 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[L10n]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=497</guid>
		<description><![CDATA[Language packs are add-ons that you can install to add additional localizations to our desktop applications. Starting with tomorrow&#8217;s nightly, and thus following the Firefox 18 train, language packs will be restartless. That was bug 677092, landed as 812d0ba83175. To change your UI language, you just need to install a language pack, set your language [...]]]></description>
				<content:encoded><![CDATA[<p><em>Language packs are add-ons that you can install to add additional localizations to our desktop applications.</em></p>
<p>Starting with tomorrow&#8217;s nightly, and thus following the Firefox 18 train, language packs will be restartless. That was <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=677092">bug 677092</a>, landed as <a href="https://hg.mozilla.org/mozilla-central/rev/812d0ba83175">812d0ba83175</a>.</p>
<p>To change your UI language, you just need to install a language pack, set your language (*), and open a new window. This also works for updates to an installed language pack. Opening a new window is the workaround for not having a reload button on the chrome window.</p>
<p>The actual patch turned out to be one line to make language packs restartless, and one line so that they don&#8217;t try to call in to <code>bootstrap.js</code>. I was optimistic that the chrome registry was already working, and rightfully so. There are no changes to the language packs themselves.</p>
<p>Tests were tricky, but Blair talked me through most of it, thanks for that.</p>
<p>(*) Language switching UI is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=377881">bug 377881</a>, which has a mock-up for those interested. Do not be scared, it only shows if you have language packs installed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/09/27/language-packs-are-restartless-now/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Why l10n tools should be editors instead of serializers</title>
		<link>http://blog.mozilla.org/axel/2012/07/20/why-l10n-tools-should-be-editors-instead-of-serializers/</link>
		<comments>http://blog.mozilla.org/axel/2012/07/20/why-l10n-tools-should-be-editors-instead-of-serializers/#comments</comments>
		<pubDate>Fri, 20 Jul 2012 16:18:41 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[L10n]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=490</guid>
		<description><![CDATA[If your tool serializes internal state instead of editing files, it&#8217;ll do surprising things if it encounters surprising content. Like, turn errNotSemicolonTerminated=Named character reference was not terminated by a semicolon. (Or “&#038;” should have been escaped as “&#38;amp;”.) into errNotSemicolonTerminated=Named character reference was not terminated by a semicolon. (Or “” should have been escaped as [...]]]></description>
				<content:encoded><![CDATA[<p>If your tool serializes internal state instead of editing files, it&#8217;ll do surprising things if it encounters surprising content. Like, turn</p>
<p><code>errNotSemicolonTerminated=Named character reference was not terminated by a semicolon. (Or “&#038;” should have been escaped as “&amp;amp;”.)</code></p>
<p>into</p>
<p><code>errNotSemicolonTerminated=Named character reference was not terminated by a semicolon. (Or “” should have been escaped as “amp;”.)</code></p>
<p>And that&#8217;s for a string the localizer never touched.</p>
<p>(likely <a href="http://code.google.com/p/narro/issues/detail?id=316">narro issue 316</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/07/20/why-l10n-tools-should-be-editors-instead-of-serializers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Notes on SemWiki</title>
		<link>http://blog.mozilla.org/axel/2012/07/20/notes-on-semwiki/</link>
		<comments>http://blog.mozilla.org/axel/2012/07/20/notes-on-semwiki/#comments</comments>
		<pubDate>Fri, 20 Jul 2012 16:01:36 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=482</guid>
		<description><![CDATA[Semantic Wiki is nice, but it&#8217;s hard to wrap one&#8217;s head around. Thus, writing down some notes-to-non-self. Most importantly, start with paper. SemWiki isn&#8217;t very forgiving if you reconsider. Once you&#8217;ve made some headway with paper, set up mediawiki locally. I&#8217;ve thrown my db away three times so far because I did do reconsider. FYI, [...]]]></description>
				<content:encoded><![CDATA[<p>Semantic Wiki is nice, but it&#8217;s hard to wrap one&#8217;s head around. Thus, writing down some notes-to-non-self.</p>
<p>Most importantly, start with paper. SemWiki isn&#8217;t very forgiving if you reconsider. Once you&#8217;ve made some headway with paper, set up mediawiki locally. I&#8217;ve thrown my db away three times so far because I did do reconsider. FYI, that&#8217;s a tad tricky, here&#8217;s what works for me:</p>
<ul>
<li>kill the db and recreate it</li>
<li>move <code>LocalSettings.php</code> away</li>
<li>load <code>index.php</code>, follow the configuration &#8217;til you have a db, ignore the download</li>
<li><code>php maintainance/update.php</code> to get the semwiki tables</li>
<li><code>Special:SMWAdmin</code> to do tables and data update (log in again)</li>
<li><code>php maintainance/runJobs.php</code> to speed up the data update</li>
</ul>
<p>Using <code>Special:CreateClass</code> is nice, as it&#8217;s doing a whole lot of things for you. There is one thing it doesn&#8217;t, for Properties linking to Pages, it won&#8217;t ask you for the Form to create/edit those pages. <code>Special:CreateProperty</code> does, but that&#8217;s of little help. You can add that later by editing the Property page, and adding a <code>Has default form</code> like</p>
<p><code>This is a property of type [[Has type::Page]]. It links to pages that use the form [[Has default form::Aisle Milestone]].</code></p>
<p>Property name is the wiki page name of a property, Field name is the human readable name used in the forms created, btw. If you loose the mapping between field and property name, edit the form, and explicitly specify the property with <code>{{{field|Summary|property=Has summary}}}</code> or the like. Though, more likely, you dropped <code>[[Has summary::{{{Summary|}}}]]</code> in the template, I replaced that with just <code>{{{Summary|}}}</code>, which breaks stuff.</p>
<p>Also, you don&#8217;t want to use &#8216;/&#8217; in your form names, that breaks editing URLs from your referring pages.</p>
<p>Oh, and yes, you don&#8217;t need to add the namespaces like <code>Template:</code> etc when entering the names in the semwiki forms, those are prepended automagically.</p>
<p>Another drawback of <code>Special:CreateClass</code> is, it&#8217;ll do all its work asynchonously, so you&#8217;ll need to wait a while &#8217;til things are up for you to actually enter your data. Locally, you can speed things up with <code>php maintainance/runJobs.php</code>.</p>
<p>I&#8217;m still torn on how much I&#8217;d really like to use the free text, right now I&#8217;m using a Text property to create a summary that I can put in a prominent part of the template.</p>
<p>One more trick, if you&#8217;re using largely prefixed pages, like we do on wikimo, you can get pretty descent sorting if you edit the Template to have a category hook like</p>
<p><code>[[Category:Aisle/Use Case|{{#titleparts: {{PAGENAME}} | | -1 }}]]</code></p>
<p>This is for <a href="https://wiki.mozilla.org/Aisle/Project">Aisle</a>, for which I ended up creating my own semweb instead of using our standard feature pages. They have a ton of stuff I don&#8217;t need, and don&#8217;t have a few things I hope to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/07/20/notes-on-semwiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why I deleted my account on facebook</title>
		<link>http://blog.mozilla.org/axel/2012/06/16/why-i-deleted-my-account-on-facebook/</link>
		<comments>http://blog.mozilla.org/axel/2012/06/16/why-i-deleted-my-account-on-facebook/#comments</comments>
		<pubDate>Sat, 16 Jun 2012 16:40:33 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=476</guid>
		<description><![CDATA[I opened a facebook account a good while ago to be present in communication channels where our community is. I&#8217;ve closed that account, with a host of pending &#8220;friend&#8221; requests from community members, and here&#8217;s why. On one hand, there&#8217;s all the &#8220;you wanna be a friends of a northern-german elderly guy with a click&#8221; [...]]]></description>
				<content:encoded><![CDATA[<p>I opened a facebook account a good while ago to be present in communication channels where our community is. I&#8217;ve closed that account, with a host of pending &#8220;friend&#8221; requests from community members, and here&#8217;s why.</p>
<p>On one hand, there&#8217;s all the &#8220;you wanna be a friends of a northern-german elderly guy with a click&#8221; thing, and the &#8220;what&#8217;s the value of my life at NASDAQ&#8221;. But if facebook would have worked for me, I would have continued to bite that bullet.</p>
<p>The real reason I left is that facebook doesn&#8217;t work for me. My role at Mozilla is to talk and engage with people all over the world. Many of them came back with friend requests on facebook. Their friends came back with friend requests. Now, most of what they&#8217;re putting up on facebook is targetted to their social circle, and, in their language. Which is cool, but my facebook feed just turned into a series of stuff I can&#8217;t read.</p>
<p>And being your friend and then mute you? That&#8217;d be just rude.</p>
<p>I haven&#8217;t communicated there really. So, I&#8217;ve stopped being on facebook. I&#8217;m still in that 14-day grace period, but I cleared my cookies to make it through that.</p>
<p>If you want to keep in touch, subscribe to this blog, or catch me on <a href="https://twitter.com/#!/axelhecht">twitter</a>. And then there&#8217;s irc and email, of course.</p>
<p>I intend to stay on twitter for the forseeable future. I&#8217;m not fond of their promo-tweets, but I enjoy the asymmetric nature of connections there. I have no plans to join other social networks at this point.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/06/16/why-i-deleted-my-account-on-facebook/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rapid releases and the l10n dashboard are friends now</title>
		<link>http://blog.mozilla.org/axel/2012/06/09/rapid-releases-and-the-l10n-dashboard-are-friends-now/</link>
		<comments>http://blog.mozilla.org/axel/2012/06/09/rapid-releases-and-the-l10n-dashboard-are-friends-now/#comments</comments>
		<pubDate>Sat, 09 Jun 2012 19:07:04 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[L10n]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[elmo]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=469</guid>
		<description><![CDATA[Wait a second, we&#8217;re on the rapid release schedule for almost a year now, and 9 releases. How can the l10n dashboard be friends with the trees only now? Well, I&#8217;ve hacked and lied and tweaked and spoofed the data for a year. No more. The obvious changes are: Localizers as well as drivers can [...]]]></description>
				<content:encoded><![CDATA[<p>Wait a second, we&#8217;re on the rapid release schedule for almost a year now, and 9 releases. How can the l10n dashboard be friends with the trees only now?</p>
<p>Well, I&#8217;ve hacked and lied and tweaked and spoofed the data for a year. No more.</p>
<p>The obvious changes are:</p>
<ul>
<li>Localizers as well as drivers can now see how far behind their work is, in release cycles</li>
<li>channel migration code is actually not a lie, and can be taken over by release management</li>
</ul>
<p>On the team page, you&#8217;ll now see something like</p>
<p><a href="http://blog.mozilla.org/axel/files/2012/06/Bildschirmfoto-2012-06-09-um-19.01.16.png"><img src="http://blog.mozilla.org/axel/files/2012/06/Bildschirmfoto-2012-06-09-um-19.01.16.png" alt="" title="Team page with fallback" width="991" height="257" class="alignnone size-full wp-image-471" /></a></p>
<p>You&#8217;ll notice the difference between the <strong>Current</strong> sign-off with the green check-mark, and the <strong>fx14</strong> one with the looking glass. In the past, we&#8217;ve shown the green check-mark for both, now we&#8217;re actually showing the version that we&#8217;re using instead of the current one, and the looking glass is there to indicate that the localizer should actually look into this. There&#8217;s been a good deal of confusion about this, and I sure hope that this will resolve it a good deal.</p>
<p>There&#8217;s a ton of follow-up work, <a href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=650816&#038;hide_resolved=0" title="dendencies">for one on elmo</a>. This bug has been blocking a lot of other patches and work, both for the localizer-facing parts as well as the release infrastructure-facing parts.</p>
<p>More so, the state of localizations changes from &#8220;n missing strings, probably in this bucket&#8221; to &#8220;didn&#8217;t update since fx12&#8243;. That&#8217;s changing how we guide our work as l10n drivers a good deal. The impact between what we do and what localizers do becomes less anecdotal, and more science.</p>
<p>And there&#8217;s quite a few things we need to do, in particular for desktop.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/06/09/rapid-releases-and-the-l10n-dashboard-are-friends-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>compare-locales 0.9.6</title>
		<link>http://blog.mozilla.org/axel/2012/06/07/compare-locales-0-9-6/</link>
		<comments>http://blog.mozilla.org/axel/2012/06/07/compare-locales-0-9-6/#comments</comments>
		<pubDate>Thu, 07 Jun 2012 11:32:55 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[L10n]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[compare-locales]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=464</guid>
		<description><![CDATA[I&#8217;ve updated compare-locales with two important fixes: License header fix for ini files, bug 760998 l10n-merge now works with multiple errors per file, bug 756448 I&#8217;ve also updated the license to MPL2. Update your local installs with the usual commands, like pip install -U compare-locales The l10n dashboard is already running the new code, I&#8217;ll [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve updated compare-locales with two important fixes:</p>
<ul>
<li>License header fix for ini files, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=760998">bug 760998</a></li>
<li>l10n-merge now works with multiple errors per file, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=756448">bug 756448</a></li>
</ul>
<p>I&#8217;ve also updated the license to MPL2.</p>
<p>Update your local installs with the usual commands, like</p>
<p><code>pip install -U compare-locales</code></p>
<p>The l10n dashboard is already running the new code, I&#8217;ll file a bug to get the production builds updated probably tomorrow.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/06/07/compare-locales-0-9-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Migrating to the rapid release process</title>
		<link>http://blog.mozilla.org/axel/2012/03/23/migrating-to-the-rapid-release-process/</link>
		<comments>http://blog.mozilla.org/axel/2012/03/23/migrating-to-the-rapid-release-process/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 17:45:22 +0000</pubDate>
		<dc:creator>Axel Hecht</dc:creator>
				<category><![CDATA[L10n]]></category>
		<category><![CDATA[Mozilla]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=452</guid>
		<description><![CDATA[Wait, what, migrating to the rapid release process? Aren&#8217;t we, like, doing that? Well, not in the data models that drive the l10n dashboard. What follows is two-fold, for one, why would I be hacking on a patch for half a year? But also, there are some interesting technical tidbits on how to do intensive [...]]]></description>
				<content:encoded><![CDATA[<p>Wait, what, migrating to the rapid release process? Aren&#8217;t we, like, doing that? Well, not in the data models that drive the l10n dashboard. What follows is two-fold, for one, why would I be hacking on a patch for <a href="http://blog.mozilla.org/axel/2011/08/24/sung-to-the-tune-of/">half a year</a>? But also, there are some interesting technical tidbits on how to do intensive data migrations in a django project. I&#8217;ll link to the actual code in full later, right now the patch is still in flux. I&#8217;ll need to write this stuff down to get a review on the patch, so why not here.</p>
<p>I&#8217;ve blogged about <a href="http://blog.mozilla.org/axel/2011/07/22/data-models-and-vom-kopf-auf-die-fuse/">data models before</a>, but here&#8217;s a quick glossary:</p>
<p><code>Tree</code> models a set of repositories to run automated tests against, namely, <em>compare-locales</em>. <code>AppVersion</code> models the thing we&#8217;re shipping, say Firefox 3.6 or Firefox 13.</p>
<p>When gandalf and I originally designed this part of the dashboard, the relationship between what we build and what we shipped was static, kinda like</p>
<p><a href="http://blog.mozilla.org/axel/files/2012/03/old-style.png"><img class="alignnone size-full wp-image-455" title="old schema" src="http://blog.mozilla.org/axel/files/2012/03/old-style.png" alt="Static relation between AppVersion and Tree" width="372" height="163" /></a></p>
<p>Small caveat, for <code>AppVersion</code>s we&#8217;re not building right now, the old tree is stored as <code>lasttree</code>. We&#8217;ll need that data further down.</p>
<p>The rapid release process now lets AppVersions jump from Tree to Tree like little birds. So we need to have some intermediary that models that relationship, with <code>start</code> and <code>end</code> time. More like</p>
<p><a href="http://blog.mozilla.org/axel/files/2012/03/new-style.png"><img src="http://blog.mozilla.org/axel/files/2012/03/new-style.png" alt="Connect AppVersions and Trees through a model in time" title="new schema" width="338" height="182" class="alignnone size-full wp-image-454" /></a></p>
<p>Sorry for the ugliness, but that&#8217;s the pretty part so far.</p>
<p>Let&#8217;s start with doing that migration. Be warned, it&#8217;s migration 1 out of 4.</p>
<p>This first migration covers the sql schema, and persists the existing links between AppVersions and Trees. We&#8217;ll want to drop two ForeignKey columns for tree and lasttree from AppVersion, and add a ManyToMany table for the new relationship. Plus constraints and indices, sure. As I don&#8217;t speak sql, I want to use the ORM as much as I can, which sounds like one couldn&#8217;t. Enter a fake migration app that mimics the import pieces of our shipping app. It&#8217;ll contain a subset of <code>AppVersion</code> to the extent we need it, and the intermediate model, <code>AppVersionTreeThrough</code>. This needs to be really fake code, as you shouldn&#8217;t rely too much on the version of the code on disk to be really what you need for this db migration step. I cheat a bit on that, though. The import trick here is that the fake <code>AppVersion</code> contains both the old and the new fields, and that the fake <code>AppVersionTreeThrough</code> matches the one you migrate to in all flags and fields.</p>
<p>Now, getting django to eat a fake app is tricky. You need a module for the app, and that module needs to have a <code>models</code> module. Both need to be in <code>sys.modules</code>, and they need to have the <code>__file__</code> properties set. Just because django is paranoid about equality of code and thinks it needs to verify location on disk. But hey, I can spoof all of that. Python ftw. Then you create a meta class, copying most data for db and management from your original app, and with that meta, create Model subclasses.</p>
<p>Ok, so now we have python code to do the migration, but we don&#8217;t have the SQL tables and columns yet. Let&#8217;s get our fingers dirty with that.</p>
<pre>from django.core.management import color, sql
style = color.no_style()
sql.sql_all(mig_module.models, style, ship_connection)</pre>
<p>This is going to return a list of all CREATE TABLE, CREATE INDEX, ALTER TABLE ADD CONSTRAINT sql commands for our fake migration models. The migration code inspects that, and creates the many-to-many table, adds constraints and indices, and tweaks the CREATE TABLE statement for AppVersion to just pull out the SQL definitions for the columns. Those get inserted into ALTER TABLE ADD COLUMN statements, and then we execute all that.</p>
<p>At this point, the database contains the old columns with the old data, and the new empty tables (and columns).</p>
<p>Now migrate the data, with the help of the our intermediate classes that can create the django orm magic. As we&#8217;re still in the first phase of our migration, let&#8217;s not overrotate and just make links between AppVersion and Tree over all time for those that are currently bound, and for those that used to be linked (read <code>lasttree</code>), make the <code>end</code> time just <code>now()</code>. We&#8217;ll fix that later. That&#8217;s a nice and easy loop.</p>
<p>Now we&#8217;ve used our migration app to the extent we need. It&#8217;d be nice if we could just leave it with that, but we&#8217;ve got to tear it down, because otherwise the validation step will complain about multiple apps referring to the same tables. Module caches in django are tough, the following code does that at least for 1.3:</p>
<pre>    # prune "migration_phase_1" app again
    del settings.INSTALLED_APPS[-1]
    from django.db.models import loading
    loading.cache.app_models.pop('migration_phase_1', None)
    loading.cache.register_models('migration_phase_1')  # clear cache
    # empty sys modules from our fake modules
    sys.modules.pop(mig_name)
    sys.modules.pop(mig_models_name)</pre>
<p>And, yes, now we can DROP stuff, at least when using mysql. sqlite doesn&#8217;t do that, and in contrast to peterbe, I don&#8217;t mind postgres ;-). Of course, as django adds constraints with rather arbitrary names, the best thing we can do is inspect the database for the actual names of those, and then we drop&#8217;em, and the columns.</p>
<p>And if you think this blog post is too long, you&#8217;re right. Let&#8217;s talk about the migrations 2-4.</p>
<p>The second migration just inspects our actual builds, and adjusts the start and end times for stuff that&#8217;s not on the rapid release cycle, and old.</p>
<p>The third migration fights the past. To make our mismatching data model work for the rapid cycle, I replicated a lot of history data each time we migrated appversions, to a newly created set of appversions for that cycle. Now that our data model gets that right, this migration searches for that data (Signoff entries, and their associated Action ones), and deletes them.</p>
<p>The forth migration sets the start and end times for the rapid release cycle, including the off-times for Firefox 5, and moves the Signoff entries from the long running aurora AppVersion to the respective AppVersions on aurora at the time. Not too bad, but really loads of weird data, and it gets worse every six weeks :-).</p>
<p><strong>Phew</strong>. You made it. Now all I need to do is to fix the code that uses all that data.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/axel/2012/03/23/migrating-to-the-rapid-release-process/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
