<?xml version="1.0"?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel>
	<title>Planet Mozilla</title>
	<link>http://planet.mozilla.org/</link>
	<language>en</language>
	<description>Planet Mozilla - http://planet.mozilla.org/</description>
	<atom:link rel="self" href="http://planet.mozilla.org/rss20.xml" type="application/rss+xml"/>

<item>
	<title>Seif Lotfy: Globaleaks 0.2 Alpha</title>
	<guid isPermaLink="false">http://seilo.geekyogre.com/?p=3313</guid>
	<link>http://seilo.geekyogre.com/2013/05/3313/</link>
	<description>&lt;p&gt;&lt;strong&gt;Globaleaks 0.2 Alpha is out.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;a href=&quot;https://globaleaks.org/&quot;&gt;Globaleaks&lt;/a&gt; is an open source project aimed at creating a worldwide, anonymous, censorship-resistant, distributed whistle-blowing platform. It enables organizations interested in running whistle-blowing initiatives to setup their own safe zone, where whistle-blowers and recipients can exchange data.&lt;/p&gt;
&lt;p&gt;2 Years ago I helped out with the development of Globaleaks 0.1. And although I am not active anymore, I really support the initiative behind it. Now with the &lt;a href=&quot;http://logioshermes.org&quot;&gt;HERMES Center for Transparency and Digital Human Rights&lt;/a&gt; backing it up, it has grown a lot and shaped up to be a very organized and thought through project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full rewrite&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;line-height: 1.714285714; font-size: 1rem;&quot;&gt;More flexible and extensible&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Linux ready-made system and network hardened installation&lt;/li&gt;
&lt;li&gt;
&lt;div id=&quot;magicdomid17&quot;&gt;&lt;span style=&quot;line-height: 1.714285714; font-size: 1rem;&quot;&gt;Written in python using twisted&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;New Frontend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Try it out:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Try out the &lt;a href=&quot;http://demo.globaleaks.org/&quot;&gt;demo&lt;/a&gt;. It is pretty straight forward.&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;line-height: 1.714285714; font-size: 1rem;&quot;&gt;Help out:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As young project, Globaleaks can use some help fixing &lt;a href=&quot;https://globaleaks.org/bughunting/&quot;&gt;bugs&lt;/a&gt;. Just head to the &lt;a href=&quot;https://github.com/globaleaks/GlobaLeaks/wiki&quot;&gt;wiki&lt;/a&gt; and read through it. It is pretty straight forward, and explains the modules, security concepts and set up instructions.&lt;/p&gt;
&lt;p&gt;Globaleaks already has Debian and Ubuntu ready packages. An easy way to help out is to set up a  PPA for us on Launchpad. &lt;img alt=&quot;:D&quot; class=&quot;wp-smiley&quot; src=&quot;http://seilo.geekyogre.com/wp-includes/images/smilies/icon_biggrin.gif&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get in touch:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;You can contact the Globaleaks team at info () globaleaks org or on IRC on #globaleaks at irc.oftc.net&lt;/p&gt;
&lt;p&gt;Here are some screenshots of the new frontend &lt;img alt=&quot;:D&quot; class=&quot;wp-smiley&quot; src=&quot;http://seilo.geekyogre.com/wp-includes/images/smilies/icon_biggrin.gif&quot; /&gt; &lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_3324&quot; style=&quot;width: 310px;&quot;&gt;&lt;a href=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-1.04.53-PM1.png&quot;&gt;&lt;img alt=&quot;Congratulation you are using Tor&quot; class=&quot;size-medium wp-image-3324&quot; height=&quot;227&quot; src=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-1.04.53-PM1-300x227.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Congratulations you are using Tor&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_3325&quot; style=&quot;width: 310px;&quot;&gt;&lt;a href=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-1.07.57-PM1.png&quot;&gt;&lt;img alt=&quot;Receiver selection page&quot; class=&quot;size-medium wp-image-3325&quot; height=&quot;261&quot; src=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-1.07.57-PM1-300x261.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Receiver selection page&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_3327&quot; style=&quot;width: 310px;&quot;&gt;&lt;a href=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-1.09.10-PM1.png&quot;&gt;&lt;img alt=&quot;The submission receipt&quot; class=&quot;size-medium wp-image-3327&quot; height=&quot;261&quot; src=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-1.09.10-PM1-300x261.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The submission receipt&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_3329&quot; style=&quot;width: 310px;&quot;&gt;&lt;a href=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-11.07.47-PM.png&quot;&gt;&lt;img alt=&quot;Configuring a receiver&quot; class=&quot;size-medium wp-image-3329&quot; height=&quot;261&quot; src=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-11.07.47-PM-300x261.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Configuring a receiver&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_3330&quot; style=&quot;width: 310px;&quot;&gt;&lt;a href=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-11.08.08-PM.png&quot;&gt;&lt;img alt=&quot;Configuring a context&quot; class=&quot;size-medium wp-image-3330&quot; height=&quot;261&quot; src=&quot;http://seilo.geekyogre.com/uploads/2013/05/Screen-Shot-2013-05-18-at-11.08.08-PM-300x261.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Configuring a context&lt;/p&gt;&lt;/div&gt;
 &lt;p&gt;&lt;a href=&quot;http://seilo.geekyogre.com/?flattrss_redirect&amp;amp;id=3313&amp;amp;md5=efd82cce67b144a2437de26f5be0f3d5&quot; target=&quot;_blank&quot; title=&quot;Flattr&quot;&gt;&lt;img alt=&quot;flattr this!&quot; src=&quot;http://seilo.geekyogre.com/wp-content/plugins/flattrss/img/flattr-badge-large.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 18 May 2013 21:25:46 +0000</pubDate>
	<dc:creator>Seif Lotfy</dc:creator>
</item>
<item>
	<title>Amir Aharoni: Always define the language and the direction of your HTML documents, part 02: Backwards English</title>
	<guid isPermaLink="false">http://aharoni.wordpress.com/?p=2166</guid>
	<link>http://aharoni.wordpress.com/2013/05/18/always-define-the-language-and-the-direction-of-your-html-documents-part-02-backwards-english/</link>
	<description>&lt;p&gt;In part 01 of these series, I showed &lt;a href=&quot;http://aharoni.wordpress.com/2012/08/07/always-dir-01/&quot;&gt;why is it important to always define the language and the direction of all HTML content&lt;/a&gt; and not rely on the defaults: The content may get embedded in a document with different direction and be displayed incorrectly.&lt;/p&gt;
&lt;p&gt;This issue is laughably easy to avoid: If you are writing the content, you are supposed to know in what language it is written, so if it’s English, just write &amp;lt;html lang=”en” dir=”ltr”&amp;gt; even though these seem to be the defaults. Nineteen or so characters that ensure your content is readable and not displayed backwards. Please do it always and tell all your friends to do it.&lt;/p&gt;
&lt;p&gt;The problem is that you don’t only have to explicitly set the language and the direction, but, as silly as it sounds, you have to set them correctly, too. A more subtle, but nevertheless quite frequent and disruptive bug is displaying presumably, but not actually, translated content in a different direction. This happens quite frequently when a website supports the browser language detection feature, known as Accept-Language:&lt;/p&gt;
&lt;div dir=&quot;rtl&quot;&gt;
&lt;ol&gt;
&lt;li&gt;The web server sees that the browser requests content in Hebrew.&lt;/li&gt;
&lt;li&gt;The web server sends a response with &amp;lt;html lang=”he” dir=”rtl”&amp;gt;, but because the website is not actually translated, the text is shown in the fallback language, which is usually English.&lt;/li&gt;
&lt;li&gt;The user sees the content just like this numbered list, which I intentionally set to dir=”rtl”: with the numbers and the punctuation on the wrong side, and possibly invisible, because English is not a right-to-left language.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Of course, it can go even worse. Arrows can point the wrong way and buttons and images can overlap and hide each other, rendering the page not just hard to read, but totally unusable.&lt;/p&gt;
&lt;p&gt;This bug is also an example of the &lt;a href=&quot;http://aharoni.wordpress.com/2011/08/24/the-software-localization-paradox/&quot;&gt;Software Localization Paradox&lt;/a&gt;: It manifests itself when Accept-Language is not English, but most developers install English operating systems and don’t bother to change the preferred language settings in the browser, so they never see how this bug manifests itself. The site developers don’t bother to test for it either.&lt;/p&gt;
&lt;p&gt;The solution, of course, is to set a different language and direction only if the site is actually translated, and not to pretend that it is if it’s not translated.&lt;/p&gt;
&lt;p&gt;Here are two examples of such brokenness. Both sites are important and useful, but hard to use for people whose Accept-Language is Hebrew, Persian or Arabic.&lt;/p&gt;
&lt;p&gt;Here’s how the &lt;a href=&quot;https://developer.mozilla.org/he/&quot;&gt;Mozilla Developer Network website&lt;/a&gt; looks in fake Hebrew:&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_2167&quot; style=&quot;width: 510px;&quot;&gt;&lt;a href=&quot;http://aharoni.files.wordpress.com/2013/05/mdn-rtl.png&quot;&gt;&lt;img alt=&quot;Mozilla Developer Network website, in English, but right-to-left&quot; class=&quot;size-full wp-image-2167&quot; height=&quot;358&quot; src=&quot;http://aharoni.files.wordpress.com/2013/05/mdn-rtl.png?w=500&amp;amp;h=358&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Mozilla Developer Network website, in English, but right-to-left&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Notice how the full stops are on the left end and how the text overlaps the images in the tiles on the right-hand side. This is how it is supposed to look, more or less:&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_2168&quot; style=&quot;width: 510px;&quot;&gt;&lt;a href=&quot;http://aharoni.files.wordpress.com/2013/05/mdn-ltr.png&quot;&gt;&lt;img alt=&quot;Mozilla Developer Network home page in English, left-to-right&quot; class=&quot;size-full wp-image-2168&quot; height=&quot;377&quot; src=&quot;http://aharoni.files.wordpress.com/2013/05/mdn-ltr.png?w=500&amp;amp;h=377&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Mozilla Developer Network home page in English, left-to-right&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I manually changed dir=”rtl” to dir=”ltr” using the element inspector from Firefox’s developer tools and I also had to tweak a CSS class to move the “mozilla” tab at the top.&lt;/p&gt;
&lt;p&gt;The above troubles are reported as &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=816443&quot;&gt;bug 816443 –  lang and dir attributes must be used only if the page is actually translated&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After showing an example of a web development bug from a site for, ahem, web developers, here is an even funnier example: The &lt;a href=&quot;http://cldr.unicode.org/&quot;&gt;home page Unicode’s CLDR&lt;/a&gt;. That’s right: Unicode’s own website shows text with incorrect direction:&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_2169&quot; style=&quot;width: 510px;&quot;&gt;&lt;a href=&quot;http://aharoni.files.wordpress.com/2013/05/cldr-rtl.png&quot;&gt;&lt;img alt=&quot;The Unicode CLDR website, in English but right-to-left&quot; class=&quot;size-full wp-image-2169&quot; height=&quot;301&quot; src=&quot;http://aharoni.files.wordpress.com/2013/05/cldr-rtl.png?w=500&amp;amp;h=301&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The Unicode CLDR website, in English but right-to-left&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The only words translated here are “Contents” (תוכן) and “Search this site” (חיפוש באתר זה), which is not so useful. The rest is shown in English, and the direction is broken: Notice the strange alignment of the content and the schedule table. A few months ago that table was so broken that its content wasn’t visible at all, but that was probably patched.&lt;/p&gt;
&lt;p&gt;Here’s how it is supposed to look:&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_2170&quot; style=&quot;width: 510px;&quot;&gt;&lt;a href=&quot;http://aharoni.files.wordpress.com/2013/05/cldr-ltr.png&quot;&gt;&lt;img alt=&quot;The CLDR home page in English, appropriately left-to-right&quot; class=&quot;size-full wp-image-2170&quot; height=&quot;301&quot; src=&quot;http://aharoni.files.wordpress.com/2013/05/cldr-ltr.png?w=500&amp;amp;h=301&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The CLDR home page in English, appropriately left-to-right&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I tried reporting &lt;a href=&quot;http://unicode.org/cldr/trac/ticket/6072&quot;&gt;the CLDR home page direction bug&lt;/a&gt;, but it was closed as “out-of-scope”: The CLDR developers say that the Google Sites infrastructure is to blame. This is frustrating, because as far as I know Google Sites doesn’t have a proper bug reporting system and all I can do is write a &lt;a href=&quot;http://productforums.google.com/forum/#!category-topic/sites/report-a-problem/dzqvgdz1Dpo&quot;&gt;question about that direction problem in the Google Sites forum&lt;/a&gt; and hope that somebody notices it or poke my Googler friends.&lt;/p&gt;
&lt;p&gt;One thing that I will not do is switch my Accept-Language to English. Whenever I can, I don’t just want to see the website correctly, but to &lt;a href=&quot;http://www.quora.com/User-Behavior/Bilingual-web-users-Do-you-usually-browse-in-your-native-language-or-simply-use-the-sites-default-language-Why&quot;&gt;try to help my neighbor&lt;/a&gt;: see the possible problems that can affect other users who use different language. Somebody has to break the Software Localization Paradox.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://aharoni.wordpress.com/category/firefox/&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=&quot;http://aharoni.wordpress.com/category/free-software/&quot;&gt;Free Software&lt;/a&gt;, &lt;a href=&quot;http://aharoni.wordpress.com/category/localization/&quot;&gt;localization&lt;/a&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/aharoni.wordpress.com/2166/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/aharoni.wordpress.com/2166/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=aharoni.wordpress.com&amp;amp;blog=92632&amp;amp;post=2166&amp;amp;subd=aharoni&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 18 May 2013 12:14:26 +0000</pubDate>
	<dc:creator>aharoni</dc:creator>
</item>
<item>
	<title>Will Kahn-Greene: Proposal: LDAP password resets as a unit of measure</title>
	<guid isPermaLink="false">http://www.bluesock.org/~willg/blog/mozilla/ldap_pwd_resets_as_a_unit_of_measure</guid>
	<link>http://www.bluesock.org/~willg/blog/mozilla/ldap_pwd_resets_as_a_unit_of_measure.html</link>
	<description>&lt;div class=&quot;section&quot; id=&quot;backstory&quot;&gt;
&lt;h3&gt;Backstory&lt;/h3&gt;
&lt;p&gt;Every 3 months, we at Mozilla have to reset our LDAP passwords. The
system helpfully sends the first reminder 2 weeks before your password
expires, then the second reminder 1 week before your password expires
and the last reminder 2 days before your password expires.&lt;/p&gt;
&lt;p&gt;Sometimes time passes by faster than you know and you end up with
a &lt;a class=&quot;reference external&quot; href=&quot;https://badges.mozilla.org/en-US/badges/badge/Locked-out-of-LDAP-account&quot;&gt;Locked out of LDAP account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The 3 month LDAP password reset is such a large part of our lives that
I propose it become a standard unit of measure for elapsed time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;usage&quot;&gt;
&lt;h3&gt;Usage&lt;/h3&gt;
&lt;p&gt;Used in casual conversation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pat: Hi!&lt;/p&gt;
&lt;p&gt;Jordan: Hi!&lt;/p&gt;
&lt;p&gt;Pat: I haven't seen you before. How long have you been at
Mozilla?&lt;/p&gt;
&lt;p&gt;Jordan: I've been here for 6 LDAP password resets.&lt;/p&gt;
&lt;p&gt;Pat: Oh, weird. I've been here for 7. Good to meet you!
Would you like a banana?&lt;/p&gt;
&lt;p&gt;Jordan: Would I ever!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Used in casual conversation on IRC:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;code literal-block&quot;&gt;&amp;lt;patbot&amp;gt; anyone use less?
&amp;lt;corycory&amp;gt; i only use sass. it's the best.
* riledupriley has quit (Quit: riledupriley)
&amp;lt;patbot&amp;gt; :(
&amp;lt;hugbot&amp;gt; (patbot)
* r1cky has joined #casualconversationexample
&amp;lt;r1cky&amp;gt; morning!
&amp;lt;nigelb&amp;gt; r1cky: hai!
&amp;lt;nigelb&amp;gt; Ah, it's nearly mfbt.
&amp;lt;mtjordan&amp;gt; sure. been using it for 3 ldap password resets.
&amp;lt;mtjordan&amp;gt; patbot: why do you ask?
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Used in Bugzilla comments:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;code literal-block&quot;&gt;Jordan [:jordan]  1 day ago       Comment 0 [reply] [-]

Readonly mode causes the site to ISE.
&lt;/pre&gt;
&lt;pre class=&quot;code literal-block&quot;&gt;Pat [:pat]  1 day ago             Comment 1 [reply] [-]

I looked into it. Turns out we haven't used readonly
mode in at least 4 LDAP password resets.

I think we just need to add a fake authentication
module. Easy peasy.
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Used when joining a new group:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;code literal-block&quot;&gt;From: Pat
To: some-group@mozilla.org
Subject: Welcome Jordan to some-group!

Hi all!

I'd like to welcome Jordan to some-group! Jordan brings
expertise that is invaluable. I'm excited! Yay!

Jordan: Tell us about yourself!

Pat
&lt;/pre&gt;
&lt;pre class=&quot;code literal-block&quot;&gt;From: Jordan
To: some-group@mozilla.org
Subject: Re: Welcome Jordan to some-group!

Hi!

I'm excited to join some-group! Hopefully I bring something
useful to the table.

I've been at Mozilla for 7 LDAP password resets, I like
top-posting and I make a mean cold brew coffee.

Looking forward to my first meeting!

Jordan


On Blah blah blah at blah blah blah, Pat wrote:
&amp;gt; Hi all!
&amp;gt;
&amp;gt; I'd like to welcome Jordan to some-group! Jordan brings
&amp;gt; expertise that is invaluable. I'm excited! Yay!
&amp;gt;
&amp;gt; Jordan: Tell us about yourself!
&amp;gt;
&amp;gt; Pat
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Used in an email to everyone@ about departing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;code literal-block&quot;&gt;Dear everyone!

It is with sadness that I tell you I'm leaving as of next
Friday. As you know, I've been with Mozilla for 32 LDAP
password resets and frankly, I'm totally out of usable
Sherlock Holmes story titles, so I'm off to new challenges.

I will miss you all.
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;
  [&lt;a href=&quot;http://www.bluesock.org/~willg/blog/mozilla/ldap_pwd_resets_as_a_unit_of_measure.html&quot;&gt;Comments&lt;/a&gt;]
&lt;/p&gt;</description>
	<pubDate>Sat, 18 May 2013 04:00:00 +0000</pubDate>
</item>
<item>
	<title>Tantek Çelik: 
#UX: &quot;Learn more&quot; Links in Warning Boxes Should Go To A Page With These Three Things
</title>
	<guid isPermaLink="true">http://tantek.com/2013/137/b1/ux-learn-more-links-warning-boxes-three-things</guid>
	<link>http://tantek.com/2013/137/b1/ux-learn-more-links-warning-boxes-three-things</link>
	<description>&lt;div class=&quot;e-content entry-content&quot;&gt;
&lt;p&gt;
Sometimes web pages display brief warning boxes at the top with &quot;learn more&quot; links. The learn more link in a specific warning box should go to a page specifically about that warning with, in rough order:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; screenshot of warning box&lt;/li&gt;
&lt;li&gt; quoted full text of the warning (for searchability / search engine discovery)&lt;/li&gt;
&lt;li&gt; detailed text answering: 
 &lt;ul&gt;
 &lt;li&gt;how could have the issue occurred?&lt;/li&gt;
 &lt;li&gt;what should the user do to resolve the issue?&lt;/li&gt;
 &lt;li&gt;how can the user avoid the issue in the future?&lt;/li&gt;
 &lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
E.g. the &quot;Learn more ›&quot; link in the yellow warning box in this screenshot:
&lt;/p&gt;
&lt;p class=&quot;figure&quot;&gt;
&lt;a href=&quot;http://instagram.com/p/ZbRE9ZA9cy/&quot;&gt;&lt;img alt=&quot;cropped screenshot of a tweet permalink page with a yellow warning box at the top&quot; src=&quot;http://distilleryimage10.s3.amazonaws.com/3bbb6e36bf2f11e2bcd822000aa80037_7.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
links to: &lt;a href=&quot;https://support.twitter.com/articles/82050-i-m-having-trouble-confirming-my-email&quot;&gt;https://support.twitter.com/articles/82050-i-m-having-trouble-confirming-my-email&lt;/a&gt; which:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Neither has screenshot nor text of warning&lt;/li&gt;
&lt;li&gt;Covers several topics unrelated to the warning&lt;/li&gt;
&lt;li&gt;Does not answer the above questions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And could be improved by linking to a specific page about this particular warning, containing the above points 1-3, and answering all three questions in point 3.&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;http://tantek.com/2013/137/t3/scary-twitter-warning-removed-email-from-account&quot;&gt;Scary Twitter warning: &quot;... removed the email address from your account...&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 17 May 2013 22:13:00 +0000</pubDate>
</item>
<item>
	<title>J. Paul Reed: Eulogy for a Founding Father, revisited</title>
	<guid isPermaLink="false">http://soberbuildengineer.com/blog/?p=1277</guid>
	<link>http://soberbuildengineer.com/blog/2013/05/eulogy-for-a-founding-father-revisited/</link>
	<description>&lt;p&gt;In response to my post earlier this week on &lt;a href=&quot;http://soberbuildengineer.com/blog/2013/05/eulogy-for-a-founding-father/&quot;&gt;Tinderbox’s end-of-life&lt;/a&gt;, reader Carsten Mattner asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Reading [your post], I couldn’t figure out what replaced Tinderbox for the Mozilla builds. What feeds &lt;a href=&quot;http://tbpl.mozilla.org/&quot;&gt;tbpl&lt;/a&gt;? Does Mozilla not use Tinderbox to build continuously?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;When I left Mozilla in 2007, there was a Release Engineering project in progress to actively replace Tinderbox (Client) with &lt;a href=&quot;http://buildbot.net/&quot;&gt;buildbot&lt;/a&gt;. So in short, no, Mozilla does not use Tinderbox Client to drive its continuous integration builds, and hasn’t for some time.&lt;/p&gt;
&lt;p&gt;Do they still use buildbot today?&lt;/p&gt;
&lt;p&gt;I didn’t know the answer to that question, so I tracked down &lt;a href=&quot;http://coop.deadsquid.com/&quot;&gt;Coop&lt;/a&gt; on IRC, who graciously gave me a few minutes of his time to answer exactly that.&lt;/p&gt;
&lt;p&gt;He said:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mozilla currently uses “95% buildbot, with 5% Jenkins for random small projects”&lt;/li&gt;
&lt;li&gt;There are multiple buildbot masters that drive the buildbot clients&lt;/li&gt;
&lt;li&gt;Unlike the out-of-the-box buildbot master setup, the masters query a job scheduling database instead of monitoring source control for changes themselves; they then report their results to a database, which tbpl (and other services) use to generate their reports/dashboards; the buildbot master waterfall pages aren’t accessible to the external world (which makes sense, because they include unsecured administrative functionality&lt;sup&gt;&lt;a name=&quot;reffn_1&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;)&lt;/li&gt;
&lt;li&gt;There are about 60 masters right now, but Coop said “number keeps growing though, so we need to rethink the whole solution”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So there’s your answer, Carsten!&lt;/p&gt;
&lt;p&gt;&lt;small&gt;_______________&lt;br /&gt;
&lt;sup&gt;1&lt;/sup&gt;&lt;a name=&quot;fn_1&quot;&gt;&lt;/a&gt; A long standing criticism of mine, &lt;a href=&quot;http://soberbuildengineer.com/blog/2010/11/the-incompetent-build-master/&quot;&gt;among others&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_1&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 20:47:13 +0000</pubDate>
	<dc:creator>preed</dc:creator>
</item>
<item>
	<title>Selena Deckelmann: Migrations with Alembic: a lightspeed tour</title>
	<guid isPermaLink="false">http://www.chesnok.com/daily/?p=4761</guid>
	<link>http://www.chesnok.com/daily/2013/05/17/migrations-with-alembic-a-lightspeed-tour/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=migrations-with-alembic-a-lightspeed-tour</link>
	<description>&lt;p&gt;I’ve got a &lt;a href=&quot;https://wiki.mozilla.org/Webdev/Beer_And_Tell/May2013&quot;&gt;Beer &amp;amp; Tell&lt;/a&gt; to give about &lt;a href=&quot;https://alembic.readthedocs.org/en/latest/&quot;&gt;alembic&lt;/a&gt;. Alembic is a migration tool that works with SQLAlchemy. I’m using it for database migrations with PostgreSQL.&lt;/p&gt;
&lt;p&gt;So, here’s what I want to say today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Written by SQLAlchemy wiz &lt;a href=&quot;https://twitter.com/zzzeek&quot;&gt;Mike Bayer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Here’s the &lt;a href=&quot;https://alembic.readthedocs.org/en/latest/tutorial.html&quot;&gt;tutorial&lt;/a&gt;. Socorro is now using alembic in production with SQLAlchemy 0.6.x. I’m hoping to get us upgraded to 0.8.x soon.&lt;/li&gt;
&lt;li&gt;Here’s what &lt;a href=&quot;https://gist.github.com/selenamarie/4dcf5d05bbe8419e4b42/raw/62de2c32f17c0153dc69afa97f145f25a5fab12b/alembic+output+v46.txt&quot;&gt;running an upgrade in production for Socorro looks like&lt;/a&gt;. Awesome right?&lt;/li&gt;
&lt;li&gt;Here’s what a &lt;a href=&quot;https://github.com/mozilla/socorro/blob/master/alembic/versions/37004fc6e41e_bug_867606_add_data_.py&quot;&gt;migration looks like&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Here’s &lt;a href=&quot;https://github.com/mozilla/socorro/blob/master/config/alembic.ini-dist&quot;&gt;a configuration file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Generating a migration from the command line might look something like:&lt;br /&gt;
&lt;code&gt;alembic revision -m &quot;bug XXXXXX Add a new table&quot; --autogenerate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most difficult thing to deal with so far are the many &lt;a href=&quot;https://github.com/mozilla/socorro/tree/master/socorro/external/postgresql/raw_sql/procs&quot;&gt;User Defined Functions that we use in Socorro&lt;/a&gt;. This isn’t something that any migration tools I tested deal well with.&lt;/p&gt;
&lt;p&gt;Happy to answer questions! And I’ll see about making a longer talk about this transition soon.&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 20:44:46 +0000</pubDate>
	<dc:creator>selena</dc:creator>
</item>
<item>
	<title>Matt Thompson: Using Bugzilla for Webmaker</title>
	<guid isPermaLink="false">http://openmatt.org/?p=7886</guid>
	<link>http://openmatt.org/2013/05/17/using-bugzilla-for-webmaker/</link>
	<description>&lt;p&gt;&lt;em&gt;cross-posted from the &lt;a href=&quot;http://blog.webmaker.org/bugzilla-for-webmaker&quot;&gt;Webmaker blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;img alt=&quot;&quot; height=&quot;157&quot; src=&quot;https://wiki.mozilla.org/images/e/e8/Get_involved_banner.png&quot; width=&quot;711&quot; /&gt;&lt;/h3&gt;
&lt;h3&gt;We use Bugzilla to work open and get stuff done&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Webmaker, like many Mozilla projects, uses an issue tracker called &lt;a href=&quot;https://bugzilla.mozilla.org/buglist.cgi?list_id=6563210&amp;amp;query_format=advanced&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bug_status=VERIFIED&amp;amp;product=Webmaker&quot;&gt;Bugzilla&lt;/a&gt; for filing tickets and getting stuff done&lt;/strong&gt;. These two new pages provide tips and tricks for filing bugs, and for getting the most out of Bugzilla:&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.webmaker.org/bugzilla&quot;&gt;&lt;strong&gt;Bugzilla for Webmaker&lt;/strong&gt;&lt;/a&gt; — &lt;span style=&quot;text-decoration: underline;&quot;&gt;the best place to start&lt;/span&gt;. How to file a Webmaker bug, plus simple tweaks for making Bugzilla easier to use.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.webmaker.org/bugzilla-pro-tips&quot;&gt;&lt;strong&gt;Bugzilla for Webmaker: PRO TIPS &lt;/strong&gt;&lt;/a&gt;– &lt;span style=&quot;text-decoration: underline;&quot;&gt;for digging deeper&lt;/span&gt;. How to make it easier for users to file tickets, tagging, searching and tracking bugs, Frequently Asked Questions and more.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Anyone can create, comment or contribute to a ticket&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;We work open&lt;/strong&gt;. Webmaker is an open source, non-profit project powered by a global community of friendly humans like you. Anyone can create a ticket, comment on a ticket, and contribute. &lt;strong&gt;Just because it’s called a “bug” doesn’t necessarily mean there’s something wrong&lt;/strong&gt;. It could just be a to-do, or a suggestion. All your tickets are welcome — don’t worry if you’re doing it right. We’re a friendly community, and we want your ideas!&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 20:23:12 +0000</pubDate>
	<dc:creator>openmatt</dc:creator>
</item>
<item>
	<title>Lawrence Mandel: May Open Web Open Mic Toronto: Call for Presenters</title>
	<guid isPermaLink="false">http://lawrencemandel.com/?p=4045</guid>
	<link>http://lawrencemandel.com/2013/05/17/may-open-web-open-mic-toronto-call-for-presenters/</link>
	<description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://lawrencemandel.files.wordpress.com/2013/05/owomapr2013.png&quot;&gt;&lt;img alt=&quot;owomapr2013&quot; class=&quot;aligncenter size-large wp-image-4047&quot; height=&quot;315&quot; src=&quot;http://lawrencemandel.files.wordpress.com/2013/05/owomapr2013.png?w=639&amp;amp;h=315&quot; style=&quot;border: 1px solid black;&quot; width=&quot;639&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;What: Mozilla Open Web Open Mic&lt;br /&gt;
When: May 22, 6-9pm ET.&lt;br /&gt;
Where: Mozilla Toronto, 366 Adelaide St. W, 5th Floor&lt;/p&gt;
&lt;p&gt;Mozilla Open Web Open Mic (OWOM) is back for May. Put on by the Mozilla Toronto community, OWOM features a science share exploration and lightening talks (5 min). April’s event had a great turnout (50-60 people) and included a variety of content from WEBVTT, to MakerFaire, to my talk &lt;a href=&quot;http://lawrencemandel.com/2013/04/15/building-for-mobile-web-compatibility/&quot; title=&quot;Building for Mobile Web Compatibility&quot;&gt;Building for Mobile Web Compatibility&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The call is currently open for science share participants and speakers. Sign up at&lt;br /&gt;
&lt;a href=&quot;https://mozillianstoronto.etherpad.mozilla.org/owom-may-2013&quot; target=&quot;_blank&quot;&gt;https://mozillianstoronto.etherpad.mozilla.org/owom-may-2013&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Interested in attending? Sign up now at&lt;br /&gt;
&lt;a href=&quot;http://owommay2013.eventbrite.ca/&quot; target=&quot;_blank&quot;&gt;http://owommay2013.eventbrite.ca/#&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt; Tagged: &lt;a href=&quot;http://lawrencemandel.com/tag/mozilla/&quot;&gt;mozilla&lt;/a&gt;, &lt;a href=&quot;http://lawrencemandel.com/tag/mozilla-community/&quot;&gt;mozilla community&lt;/a&gt;, &lt;a href=&quot;http://lawrencemandel.com/tag/toronto/&quot;&gt;toronto&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/lawrencemandel.wordpress.com/4045/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/lawrencemandel.wordpress.com/4045/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=lawrencemandel.com&amp;amp;blog=8148745&amp;amp;post=4045&amp;amp;subd=lawrencemandel&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 17 May 2013 19:40:29 +0000</pubDate>
	<dc:creator>Lawrence Mandel</dc:creator>
</item>
<item>
	<title>David Ascher: You are more than your job title</title>
	<guid isPermaLink="false">http://blog.ascher.ca/?p=807</guid>
	<link>http://blog.ascher.ca/2013/05/17/you-are-more-than-your-job-title/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=you-are-more-than-your-job-title</link>
	<description>&lt;p&gt;In grad school, I remember a conversation across the campus green with an visiting psychologist from Harvard.  I don’t remember much about the conversation except that he introduced me to Isaiah Berlin’s notion of the &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Hedgehog_and_the_Fox&quot; target=&quot;_blank&quot;&gt;Hedgehog and the Fox&lt;/a&gt;, and correctly pegged me as a Fox.  I think I was a bit offended at the simplification, but time has proven him right.  I’m certainly no hedgehog.&lt;/p&gt;
&lt;p&gt;I got into a silly argument on twitter last night, about whether my looking to hire someone who I labeled (as job descriptions make us do) a “Coding Designer” was not just foolish (I’d seen the Unicorn references in my tweetstream already) but apparently a bad idea, because, so the ultra-simplified argument goes, you somehow can’t be both.  And so I’ll use the energy to rant a bit about what seem to be prevailing attitudes around titleism and narrow definitions of “professionalism”.&lt;/p&gt;
&lt;p&gt;We all need to define ourselves to others. It helps us be understood, and hopefully valued.  Labels can be useful for that. We also, even more, like to label others.  It helps us simplify our approach to them.  If I can find a label for you, then I can rely on a prioris about how people with that label tend to think and behave, and I don’t need to actually get to know you too much.  The more people we interact with, the more important these shortcuts are.  Some roles are particularly subject to that (Recruiters, VCs, politicians, etc. — people who routinely talk to dozens if not hundreds of people a day).  And the best at these roles are those who use a different labeling system than their peers.  Recruiters who see the latent ambition or genius in a shy candidate; VCs who see the determination behind a stutter, or, conversely, the lack of self-confidence behind the bravado, etc.&lt;/p&gt;
&lt;p&gt;Labels are useful and practical in the short term.  And I don’t know how one could run a large HR department without them.  But we should be careful to not take them too seriously, as in the long term, they can hurt. They hurt because people, especially interesting, worth-getting-to-know people, are much more subtle, complicated, confusing and hard to categorize creatures.  Whether you take the label too seriously when thinking about others (e.g., refuse to see the valid opinion about a design expressed by a non-Designer) or about yourself (and limit your impact on the world because “oh, that’s not something that a mere ____ like me could say/do”), you’re not getting the most out of anyone involved.&lt;/p&gt;
&lt;p&gt;As I write this, I realize that I feel quite strongly about this topic.  Part of it is probably because I grew up in an &lt;a href=&quot;http://www.education.gouv.fr/&quot; target=&quot;_blank&quot;&gt;educational system&lt;/a&gt;, which at least then believed way too much in labeling people and determining their fate based on that label.  Much waste ensued.  Part of it is probably because I can’t for the life of me figure out what &lt;em&gt;my&lt;/em&gt; label should be, and if I can’t, then that must be bad. I’ve had a range of professional labels, from scientist to engineer, architect, team lead, vice president, CTO, CEO, blah blah blah.  I’ve been called a designer, strategist, entrepreneur, boss, blah blah blah. None of those words will, I hope, be in my epitaph.  And so I get cranky on twitter at night, because if there are people who strive to be both excellent &lt;em&gt;at&lt;/em&gt; design and&lt;em&gt; at&lt;/em&gt; coding, then by golly we should encourage them.&lt;/p&gt;
&lt;p&gt;Titles are a poor approximation of a professional ideal, and a profession is a poor approximation of a human’s breadth, contributions, and talents.  Embrace your inner fox, and if you happen to have both design and coding skills, can see a problem, conjure up a solution, prototype it, welcome challenges to your idea from peers, data, and users, &lt;a href=&quot;https://careers.mozilla.org/en-US/position/okTqXfwk&quot; target=&quot;_blank&quot;&gt;apply&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 18:02:24 +0000</pubDate>
	<dc:creator>david</dc:creator>
</item>
<item>
	<title>Michelle Thorne: Webmaker Train the Trainer</title>
	<guid isPermaLink="false">http://michellethorne.cc/?p=2263</guid>
	<link>http://michellethorne.cc/2013/05/webmaker-train-the-trainer/</link>
	<description>&lt;p&gt;Back in March, we kicked off the first in hopefully a series of &lt;strong&gt;train-the-trainer (TTT) events for webmaking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea is to run events that &lt;strong&gt;train people who go on to train others how to &lt;a href=&quot;https://webmaker.org/en-US/teach/&quot;&gt;teach the web&lt;/a&gt;.&lt;/strong&gt; We focused on practicing an open and participatory ethos, adapting lesson plans, and facilitating events.&lt;/p&gt;

&lt;p&gt;This is a post to &lt;strong&gt;share what we did and encourage people in designing their own train-the-trainer events.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2264&quot; height=&quot;360&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/train-the-trainers-e1368784092302.jpg&quot; title=&quot;train-the-trainers&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;How to run a Webmaker Train the Trainer&lt;/h3&gt;

&lt;p&gt;Our prototype, the &lt;a href=&quot;https://wiki.mozilla.org/Webmaker/Teach/TrainingDays&quot;&gt;Reps Training Days&lt;/a&gt;, &lt;strong&gt;ran for four days in Athens, Greece with 40 Reps from around the world.&lt;/strong&gt; The agenda was based on &lt;a href=&quot;http://www.zythepsary.com/&quot;&gt;Laura Hilliger’s&lt;/a&gt; research and insights on successful TTT program and on &lt;a href=&quot;http://aspirationtech.org/&quot;&gt;Allen Gunn’s&lt;/a&gt; participatory event methodology. It was made possible by the amazing Mozilla Greek community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our participants were &lt;a href=&quot;https://reps.mozilla.org/&quot;&gt;Mozilla Reps&lt;/a&gt;,&lt;/strong&gt; a fantastic ambassador program with some of the most active and thoughtful Mozillians. &lt;a href=&quot;http://michellethorne.cc/2012/10/webmaker-sig/&quot;&gt;Reps have been early adopters and innovators with Webmaker&lt;/a&gt;. They organized nearly 50 events during last year’s Summer Code Party and are leading the way in developing tools, tutorials, and localization for Webmaker. It seemed like a &lt;strong&gt;natural fit to run our first TTT with them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2266&quot; height=&quot;360&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/train-the-trainers3-e1368784161262.jpg&quot; title=&quot;train-the-trainers3&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;1. Participate in a Webmaker event&lt;/h4&gt;

&lt;p&gt;The first day of Training Days was &lt;strong&gt;spent observing and participating in a &lt;a href=&quot;https://webmaker.org/en-US/events/guides/pop-up/&quot;&gt;Hive Pop-Up&lt;/a&gt;,&lt;/strong&gt; organized by Hive Athens. This was an opportunity for the participants to experience a webmaker event firsthand, to see the tools and activities in action, to learn about the logistics, and to understand the vibe.&lt;/p&gt;

&lt;p&gt;We then circled up to &lt;strong&gt;discuss what we saw.&lt;/strong&gt; Participants shared their reflections on what worked well at the pop-up and what they would change if they did their own.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2280&quot; height=&quot;360&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/hive-athens-pop-up--e1368804277498.jpg&quot; title=&quot;hive athens pop-up&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;2. Build the training agenda&lt;/h4&gt;

&lt;p&gt;Then we opened up the training days properly. While we had topics in mind we wanted to hack on together, it was more important that everyone in the room thought about what they want to learn or discuss. &lt;strong&gt;So we had an agenda brainstorm.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To do this: we split into groups for 3 people. On post-it notes, we wrote down topics. 1 topic per post-it and the encouragement to write it as concretely as possible.&lt;/p&gt;

&lt;p&gt;Then everyone pasted the notes on the wall. We read them all and then clustered them by themes. &lt;strong&gt;This collaborative board formed both critical event documentation as well as agenda fodder&lt;/strong&gt; for the coming days.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2265&quot; height=&quot;360&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/train-the-trainers2-e1368784128710.jpg&quot; title=&quot;train-the-trainers2&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;3. Teach someone something&lt;/h4&gt;

&lt;p&gt;To warm up to the idea of teaching, we then got into pairs. The task: &lt;strong&gt;teach someone something in 5 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One person would go and then switch. Even if you knew what was being taught, you were encouraged to play a good learner, asking good questions and prompting the teacher.&lt;/p&gt;

&lt;p&gt;After this exercise, we circled up and discussed what we observed from this experience. For many, it was a great way to think about how to explain something clearly, using metaphors and knowledge building blocks. &lt;strong&gt;It helped bring people into a teaching mindset.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2275&quot; height=&quot;360&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/playtesting-e1368801590683.jpg&quot; title=&quot;playtesting&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;4. Make a learner profile&lt;/h4&gt;

&lt;p&gt;Now that we’ve been thinking about teachers and learners, we made small groups and &lt;strong&gt;hacked together a learner’s profile.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This goal of this activity was to think about who our learners are. We used &lt;a href=&quot;https://thimble.webmaker.org/p/lbwa/&quot;&gt;Webmaker tools to make these profiles&lt;/a&gt;, which was also a fun, maker-y way to be introduced to these tools. Participants were encouraged to &lt;strong&gt;think about real people they want to teach.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2271&quot; height=&quot;403&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/Screen-Shot-2013-05-17-at-16.26.56-e1368800874282.png&quot; title=&quot;user profiles&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;5. Hack an event invitation&lt;/h4&gt;

&lt;p&gt;After we’ve made our learner profiles, we thought about the kind of event we wanted to run. Most of the participants have already organized Webmaker events in the past, so there was already some familiarity with the format.&lt;/p&gt;

&lt;p&gt;Nevertheless, it was helpful to &lt;strong&gt;hack together an event invitation.&lt;/strong&gt; The idea was to think about your target learner and to &lt;strong&gt;make an invitation that would speak to them.&lt;/strong&gt; Again, we used Webmaker tools to quickly pull these invitations together on the web.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2272&quot; height=&quot;393&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/Screen-Shot-2013-05-17-at-16.31.15-e1368801113505.png&quot; title=&quot;event invitation&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;6. Deep dive into lesson plans&lt;/h4&gt;

&lt;p&gt;With a learner profile, an event invitation and some familiarity with Webmaker tools, we then &lt;strong&gt;introduced the &lt;a href=&quot;https://webmaker.org/en-US/kits/&quot;&gt;hackable kits&lt;/a&gt;.&lt;/strong&gt; These are remixable lesson plans that help mentors, trainers, etc. to teach the web. The idea is that they are adaptable to different contexts and that people can share new ways of teaching in a shared format.&lt;/p&gt;

&lt;p&gt;Participants poked around in the kits and asked questions. We also did some fun icebreakers so they could see the activities in action and get some energy going.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2274&quot; height=&quot;252&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/Screen-Shot-2013-05-17-at-16.35.00-e1368801331636.png&quot; title=&quot;hacktivity kits&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;7. Playtest lesson plans&lt;/h4&gt;

&lt;p&gt;Now came the fun part. We had to &lt;strong&gt;plan for a real live event&lt;/strong&gt; the next day. So participants got into groups of five with one group facilitator.&lt;/p&gt;

&lt;p&gt;They had to design a four-hour agenda for local youth. Using three recommended activities from the kits, &lt;strong&gt;they adapted the lesson plans.&lt;/strong&gt; Then they walked through a script for the next day, including having people role-play as learners. It was a lot of fun to see and a great way to prepare for the big day.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2281&quot; height=&quot;360&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/train-the-trainers4-e1368804356691.jpg&quot; title=&quot;train-the-trainers4&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;8. Put training to practice at a live event&lt;/h4&gt;

&lt;p&gt;So with some nervousness, &lt;strong&gt;we got ready for the live event.&lt;/strong&gt; About a hundred youth were coming. We split into different rooms, each group of five trainers getting about 20 learners.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2283&quot; height=&quot;405&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/british-council-e1368804483501.jpg&quot; title=&quot;british council&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While there were the inevitable challenges (the internet is down! one kid won’t listen!), the Reps did a terrific job. They rolled with their scripts, adapting them as they saw what was working. They also taught well in smaller pairs with their learners, sometimes adding new challenges or tools to fit their needs.&lt;/p&gt;

&lt;p&gt;It was a beautiful and fun thing to see. &lt;strong&gt;All the training the days before paid off: the youth had a lot of fun and so did we.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2277&quot; height=&quot;403&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/viking-e1368803836447.jpg&quot; title=&quot;viking&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;9. Reflect on event, lessons learned and where from here&lt;/h4&gt;

&lt;p&gt;We ended the event with a closing circle. &lt;strong&gt;We talked about what we saw that day, what worked well, what didn’t.&lt;/strong&gt; We each shared one thing we appreciated about the experience, and what we’re excited about doing next.&lt;/p&gt;

&lt;p&gt;With that, we headed out into the city to &lt;strong&gt;enjoy the day and the rest of our time together.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2278&quot; height=&quot;405&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/in-athens-e1368803936712.jpg&quot; title=&quot;in athens&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;10. Go forth and teach!&lt;/h4&gt;

&lt;p&gt;Each participant &lt;strong&gt;left the Training Days with a local plan.&lt;/strong&gt; It was a short list of possible collaborators in their hometown, a date for a small team huddle to bring those people together, and then a date for a larger Webmaker event to organize with their new collaborators.&lt;/p&gt;

&lt;p&gt;We also &lt;strong&gt;started interest groups&lt;/strong&gt; in topics like localization and offline tools. And now, a few months later, the participants from Training Days are now &lt;strong&gt;“Webmaker Super Mentors”, mentoring people in &lt;a href=&quot;http://hivenyc.org/teachtheweb/&quot;&gt;an online course to learn how to teach the web.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the coming months, we hope to &lt;strong&gt;keep remixing and improving these agendas,&lt;/strong&gt; as well as work with people who are interested in TTT in their own cities or communities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let us know if you’d like to get involved! &lt;a href=&quot;https://twitter.com/search?q=%23teachtheweb&quot;&gt;#teachtheweb&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-2284&quot; height=&quot;403&quot; src=&quot;http://michellethorne.cc/wp-content/uploads/greeks-e1368804509616.jpg&quot; title=&quot;super mentors everywhere!&quot; width=&quot;540&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 15:40:46 +0000</pubDate>
	<dc:creator>thornet</dc:creator>
</item>
<item>
	<title>Jan Odvarko: New Firebug feature: Use in Command Line</title>
	<guid isPermaLink="false">http://www.softwareishard.com/blog/?p=697</guid>
	<link>http://feedproxy.google.com/~r/SoftwareIsHardPlanetMozilla/~3/P4uyDtuxRpI/</link>
	<description>&lt;p&gt;&lt;a href=&quot;https://getfirebug.com/releases/firebug/1.12/firebug-1.12.0a6.xpi&quot;&gt;Firebug 1.12 alpha 6&lt;/a&gt; introduces one new feature called simply: &lt;strong&gt;Use in Command Line&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This feature allows referring various page objects (HTML elements, JS objects, network requests, cookies, etc.) from within Firebug Command Line.&lt;br /&gt;
The user can also use object's properties in JS expressions.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;http://code.google.com/p/fbug/issues/detail?id=6422&quot;&gt;issue 6422&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-3122&quot; height=&quot;242&quot; src=&quot;http://www.softwareishard.com/images/posts/use-in-commandline/useincommandline.png&quot; title=&quot;Use in Command Line&quot; width=&quot;520&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This post explains the feature in detail and also asks for feedback.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-697&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;How it works&lt;/h3&gt;
&lt;p&gt;As depicted on the previous screenshot the feature is represented by a new context menu item called &lt;em&gt;Use in Command Line&lt;/em&gt;. This item is available for various objects (in various panels).&lt;/p&gt;
&lt;p&gt;The action is simple: an expression &lt;code&gt;$p&lt;/code&gt; is inserted into the Command Line if you execute the command. It's a variable that refers to the clicked object. You can also use the variable to access any property of the object.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-3124&quot; height=&quot;249&quot; src=&quot;http://www.softwareishard.com/images/posts/use-in-commandline/commandlinepopup.png&quot; title=&quot;Command Line Popup&quot; width=&quot;520&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What happens on the screenshot:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The DOM panel shows an object &lt;code&gt;person&lt;/code&gt; implemented on the page.&lt;/li&gt;
&lt;li&gt;The user clicks on the person's value (the green right hand part) and executes &lt;em&gt;Use in Command Line&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Command Line popup&lt;/em&gt; is opened within the DOM panel (so, the user doesn't have to leave the DOM panel).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$p&lt;/code&gt; expression is inserted into the Command Line (and the command line automatically gets focus).&lt;/li&gt;
&lt;li&gt;The user presses the Enter key to evaluate the expression.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the &lt;code&gt;person&lt;/code&gt; object implemented on the page looks as follows:&lt;/p&gt;
&lt;div class=&quot;dean_ch&quot; style=&quot;white-space: wrap;&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;var&lt;/span&gt; person = &lt;span class=&quot;br0&quot;&gt;{&lt;/span&gt;&lt;br /&gt;
    &lt;span class=&quot;kw3&quot;&gt;name&lt;/span&gt;: &lt;span class=&quot;st0&quot;&gt;&quot;Bob&quot;&lt;/span&gt;,&lt;br /&gt;
    age: &lt;span class=&quot;nu0&quot;&gt;38&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;br0&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;If you want to access properties of an object just use dot notation. You can do following in our example.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$p.name&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-3124&quot; height=&quot;188&quot; src=&quot;http://www.softwareishard.com/images/posts/use-in-commandline/accessproperties.png&quot; title=&quot;Access properties&quot; width=&quot;520&quot; /&gt;&lt;/p&gt;
&lt;p&gt;See, even the auto-completion works as expected!&lt;/p&gt;
&lt;h3&gt;Supported Objects&lt;/h3&gt;
&lt;p&gt;The feature is implemented for various objects across all Firebug panels. Here is a list of those objects.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any JS object (even functions etc.)&lt;/li&gt;
&lt;li&gt;HTML elements&lt;/li&gt;
&lt;li&gt;CSS rules and properties&lt;/li&gt;
&lt;li&gt;Cookies&lt;/li&gt;
&lt;li&gt;Network requests&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Call for Feedback&lt;/h3&gt;
&lt;p&gt;All objects accessible through the &lt;code&gt;$p&lt;/code&gt; variable are coming from the page content except of network requests and cookies.&lt;/p&gt;
&lt;p&gt;We are actually logging &lt;code&gt;nsIHttpChannel&lt;/code&gt; for network requests and &lt;code&gt;nsICookie&lt;/code&gt; for cookies. So, the object comes from chrome (privileged scope) and isn't accessible in the page content. This way, the user has more info, but it could be confusing since the user could expect that the data are actually accessible from the page content (and Firebug is for page content debugging).&lt;/p&gt;
&lt;p&gt;Possible options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not implement the feature for network requests and cookies&lt;/li&gt;
&lt;li&gt;Implement the feature only for XHRs (and show the real &lt;code&gt;XMLHttpRequest&lt;/code&gt; instance) and cookie (coming from &lt;code&gt;document.cookie&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Keep it as it is&lt;/li&gt;
&lt;li&gt;Anything else?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do you think?&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Also, would you like to refer more objects at the same time? Something like having more variables (a history) available: &lt;code&gt;$p0&lt;/code&gt;, &lt;code&gt;$p1&lt;/code&gt;, &lt;code&gt;$p2&lt;/code&gt;, ...&lt;/p&gt;
&lt;p&gt;How would you expect it to be working?&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Thanks for any feedback!&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/SoftwareIsHardPlanetMozilla/~4/P4uyDtuxRpI&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 17 May 2013 15:22:06 +0000</pubDate>
	<dc:creator>Honza</dc:creator>
</item>
<item>
	<title>Arky: Mozilla Localization Makes a Positive Social Impact</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3970910572020526646.post-7440430964978058990</guid>
	<link>http://playingwithsid.blogspot.com/2013/05/mozilla-localization-makes-positive.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://mozilla.org&quot;&gt;Mozilla&lt;/a&gt; brings power of the web into ordinary people's hands. Every day I spend countless hours working with volunteer communities around the world to translate &lt;a href=&quot;http://http://www.mozilla.org/en-US/firefox/new/&quot;&gt;Firefox&lt;/a&gt; web browser. Reading &lt;a href=&quot;https://plus.google.com/101852104918354575573&quot;&gt;Sudheesh Singanamalla&lt;/a&gt;'s &lt;a href=&quot;http://theirregularview.blogspot.in/2013/05/a-localization-journey-farmers-tale.html&quot;&gt;blog post&lt;/a&gt; about his encounter with a farmer in rural India was such a touching experience.&lt;/p&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;h3&gt;&lt;a href=&quot;http://theirregularview.blogspot.in/2013/05/a-localization-journey-farmers-tale.html&quot;&gt;A Localization journey - A Farmer's tale - A Delightful Experience&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;It was on my way back in a cramped out bus, travelling researching about language changes and variations within the state of Andhra Pradesh, that  I sat next to a man, quite old. &lt;/p&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-OGa2f6TWN18/UZYFAzil-PI/AAAAAAAAARA/xpL0Knoca8I/s1600/Rural-farmers-uses-firefox-in-telugu.jpg&quot;&gt;&lt;img alt=&quot;Sudheesh and the old man&quot; border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-OGa2f6TWN18/UZYFAzil-PI/AAAAAAAAARA/xpL0Knoca8I/s320/Rural-farmers-uses-firefox-in-telugu.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Me &lt;/b&gt;: What do you use in the internet? How do you talk to your son?&lt;br /&gt;
&lt;b&gt;Old man&lt;/b&gt;: I go to Rajat's Net Cafe nearby by house and then talk from there on Google (meant Google+)&lt;br /&gt;
&lt;b&gt;Me &lt;/b&gt;: Do you know how to read English and understand which button to click and so on?&lt;br /&gt;
&lt;b&gt;Old man&lt;/b&gt; : Oh, i don't know English, but i use it in Telugu. The  shop guy Rajat has seen me since he was small, so after my son went to  Delhi, he separately bought a Telugu keyboard so that i can be using the  keyboard.&lt;br /&gt;
&lt;b&gt;Me&lt;/b&gt;: Okay, but then how do you read the information on the computer screen? Isn't that in English?&lt;br /&gt;
&lt;b&gt;Old man&lt;/b&gt; : (Laughs) Don't you know, there is this software something called Firefox, it is in Telugu.&lt;br /&gt;
&lt;b&gt;Me&lt;/b&gt; : Really? Can you tell me how the software looks?&lt;br /&gt;
&lt;b&gt;Old man&lt;/b&gt; : You should know more, you're an engineering student but  if you ask i'll tell you, its a small thing like this earth picture but  a small cat , orange in colour is holding it.&lt;br /&gt;
&lt;b&gt;Me&lt;/b&gt;: (smiling crazily) You know how to use it in Telugu?&lt;br /&gt;
Old man : Yeah, its not hard, I know how to read Telugu and also know how to use mouse, so clicking gets me the job done.&lt;br /&gt;
 &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 10:31:09 +0000</pubDate>
	<author>noreply@blogger.com (Arky r)</author>
</item>
<item>
	<title>Anton Kovalyov: Google Mobile Summit</title>
	<guid isPermaLink="true">http://anton.kovalyov.net/2013/05/17/re-google-mobile-summit</guid>
	<link>http://anton.kovalyov.net/2013/05/17/re-google-mobile-summit</link>
	<description>&lt;p&gt;Yesterday, Google organized an invite-only summit for mobile web and tools developers. As an engineer working on Firefox Developer Tools, I was invited to be on a panel about mobile testing and tooling. This is my attempt to write down my answers in hope they’ll be useful for someone out there. I suggest reading them as separate, individual mini essays.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/web-developer-tools/1060a9f69e6a&quot;&gt;Read it on Medium&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Lucas Rocha: Introducing The Layout</title>
	<guid isPermaLink="false">http://lucasr.org/?p=3791</guid>
	<link>http://lucasr.org/2013/05/17/introducing-the-layout/</link>
	<description>&lt;p dir=&quot;ltr&quot;&gt;As engineers, I believe the way we &lt;em&gt;approach&lt;/em&gt; a problem is as important as the code we write. This is especially relevant in the context of UI engineering where design is such a vital element.&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;Unfortunately, it seems quite hard to find good content about everything that happens &lt;em&gt;around&lt;/em&gt; us and &lt;em&gt;inside&lt;/em&gt; our heads when we are building user interfaces. This is what &lt;a href=&quot;http://thelayout.cc/&quot;&gt;The Layout&lt;/a&gt; is about.&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;My &lt;a href=&quot;http://thelayout.cc/preamble/&quot;&gt;intent&lt;/a&gt; is to create a space for high quality content discussing the principles, mindset, and practices that I believe shape the craft of UI engineering. It is meant to be a shared space with many voices—so, expect some awesome guest authors.&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;I’ve just posted the very first article, &lt;a href=&quot;http://thelayout.cc/mind-the-gap/&quot;&gt;Mind the Gap&lt;/a&gt;. My plan is to publish a new article every other week-ish. For now, subscribe to the &lt;a href=&quot;http://thelayout.cc/feed/&quot;&gt;RSS feed&lt;/a&gt; or simply follow The Layout on &lt;a href=&quot;http://twitter.com/readthelayout&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;https://plus.google.com/u/0/109366488041901352956/posts&quot;&gt;Google+&lt;/a&gt; to get future updates.&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;I really hope you enjoy it!&lt;/p&gt;</description>
	<pubDate>Fri, 17 May 2013 05:28:00 +0000</pubDate>
	<dc:creator>Lucas Rocha</dc:creator>
</item>
<item>
	<title>Christian Heilmann: Giving “image swivel” the vanilla web diet treatment</title>
	<guid isPermaLink="false">http://christianheilmann.com/?p=3460</guid>
	<link>http://christianheilmann.com/2013/05/17/giving-image-swivel-the-vanilla-web-diet-treatment/</link>
	<description>&lt;p&gt;With my chapter for the upcoming Smashing Book 4 done and talking about “The Vanilla Web Diet” and some workshops in the making I thought it is a good idea to show in an example how to make a seemingly good solution better by rethinking it with the &lt;a href=&quot;http://vanillawebdiet.com/&quot;&gt;principles of the vanilla web diet&lt;/a&gt; in mind.&lt;/p&gt;

	&lt;p&gt;The solution I am targeting is the &lt;a href=&quot;http://codepen.io/AlexanderY/pen/IJGxk&quot;&gt;image swivel effect&lt;/a&gt; that was &lt;a href=&quot;http://css-tricks.com/photo-swivel/&quot;&gt;posted a few days ago on &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; tricks&lt;/a&gt;. I sent &lt;a href=&quot;http://vanillawebdiet.com/demos/imageswivel/index.html&quot;&gt;my solution&lt;/a&gt; to the author and he was very interested in getting more information as to the why. The effect as it stands works and does the job to inspire people to play with it. The comments showed that where lots of developers had a go at creating their own solutions fixing some of the issues I am about to cover here. My favourite probably is &lt;a href=&quot;http://comakai.com/&quot;&gt;Eduardo García Sanz&lt;/a&gt;’s &lt;a href=&quot;http://jsfiddle.net/coma/BZajk/11/&quot;&gt;Pure &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; solution&lt;/a&gt; which to me is a good plan to achieve an effect like that if you don’t need touch support or keyboard access.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;codepen&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;a href=&quot;http://codepen.io/AlexanderY/pen/IJGxk&quot;&gt;Check out this Pen!&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;Before I get accused of “hating” – the code is OK as a demo to get creative juices flowing but it has many issues that would show up when used in production. It is also mouse-dependent and doesn’t work on touch devices. Therefore I’ll start by stating what I find troublesome about the published solution and then explain how to approach the problem to make it as simple and maintainable as possible. I also add support for mouse, keyboard and touch access and try to achieve the effect whilst not blocking people out.&lt;/p&gt;

	&lt;p&gt;If you prefer to &lt;a href=&quot;http://www.youtube.com/watch?v=OYIZnwP7vCQ&quot;&gt;see this as a screencast&lt;/a&gt;, here is one I recorded explaining the ideas, the issues I found with the original code and how my solution works. This is live and unscripted.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;How much markup do we need?&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;Let’s start by looking at the solution that is shown in the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; tricks article.&lt;br /&gt;
The &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; is the following:&lt;/p&gt;

	&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;xml&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;faces&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;face-area&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-1&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-left-3.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-2&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-left-2.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-3&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-left-1.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-4&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-center.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-5&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-right-1.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-6&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-right-2.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;image-7&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;style&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/images/look-right-3.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces_overlay&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;5&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;6&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;the_faces&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;data-number&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;7&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;lt;!-- END #face-area --&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/div&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;&amp;lt;!-- END #faces --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;



	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #1: Repeated &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; structures without logical connections&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;This is a very common mistake I see when starting an effect like that. We create something that contains the content and then something that gets acted upon to show the effect. Thus we lose the benefit of already interacting with the parent element and using event handling to find out where we are. I guess historically this is based on “CSS only solutions” that needed that kind of separation as you could not calculate or detect mouse position in &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;.&lt;/p&gt;

	&lt;p&gt;As we create two separate sets of markup for an effect we need to find a way to connect the element that was interacted with to the one we want to show. This means adding IDs to all the elements, classes to all the elements we interact with and a data attribute to tell which of the images to show. This is bad for maintainability. If we add an image, we need to also add an element to interact with. Great code is catered to making maintenance as easy as possible. Here we have a lot of dependencies to deal with when adding or removing an image.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #2: Lack of semantic markup&lt;/h4&gt;&lt;br /&gt;
The other gripe I have with this &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; is that it means nothing at all. As the order of the images is important, the right &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; construct to use here is an ordered list.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #3: Lack of alternative content&lt;/h4&gt;&lt;br /&gt;
Another big &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; mistake is adding images without an alt attribute. This means that screenreader users would get the file path of the images read out to them. Either provide a sensible alternative text or add a alt=”” to hide the image from screenreaders.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #4: Dependency on the number of elements&lt;/h4&gt;&lt;br /&gt;
One big warning sign to me here is that our effect is dependent on the number of images in the widget and that we need to have the data attributes and the IDs maintained together although they are on different elements.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;The more elements we add means the more IDs we need to maintain. This is not what coding is about. Computers are good at calculating things for us.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #5: Empty elements and inline styles&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;Whenever I see inline styles I know something went wrong. There is no point in them and if ever they should only be generated by code, not by humans. The same with empty &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; elements: you probably did some extra work that is not needed. &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; is there to contain content or provide interaction. If you have a lot of empty DIVs without an obvious templating use case, something went wrong.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Giving no power to &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;The &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; of the solution is not much, and it doesn’t do much either. This is a shame seeing how much easier it is for a visual maintainer to change &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; rather than changing JavaScript.&lt;/p&gt;

	&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;css&quot; style=&quot;font-family: monospace;&quot;&gt;body &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;background&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc00cc;&quot;&gt;#333&lt;/span&gt; 
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#faces&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;333px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;500px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;margin&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;border&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;8px&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;solid&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#face-area&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;500px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;333px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#the_faces_overlay&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;500px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#faces&lt;/span&gt; &lt;span style=&quot;color: #6666ff;&quot;&gt;.the_faces&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;333px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;14.2857143%&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;margin&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;padding&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;



	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #6: &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; dependent on the amount of elements&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;The glaring issue here is the “width: 14.2857143%;” which is calculated by dividing 100% into seven parts. This means that if you delete an image from the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, you also need to change the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; width here. You should never be dependent on the amount of elements in your &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, as those are prone to change. In this case especially there is no logical way to find out why this is the width. &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; calc() can at least make that obvious but in general it is a bad idea to create look and feel that is tied to a certain amount of elements.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Goldfish jQuery&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;The jQuery code to make the effect work is very short:&lt;/p&gt;

	&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// Reveal the &quot;center&quot; image&lt;/span&gt;
&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; centerImage &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; $&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;#image-4&quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;show&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// Bind hovers to each column&lt;/span&gt;
$&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;.the_faces&quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;each&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  $&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;mouseover&quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
    $&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;#image-&quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;+&lt;/span&gt; $&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;attr&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;data-number&quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;show&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;mouseout&quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
    $&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;#image-&quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;+&lt;/span&gt; $&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;attr&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;data-number&quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;hide&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// Reset center image&lt;/span&gt;
$&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;#face-area&quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;mouseleave&quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  centerImage.&lt;span style=&quot;color: #660066;&quot;&gt;show&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;mouseenter&quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  centerImage.&lt;span style=&quot;color: #660066;&quot;&gt;hide&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;



	&lt;p&gt;It is, however, very demanding to the browser. Slowing down a browser can be done in many ways – the most damaging ones are heavy computation, accessing the &lt;span class=&quot;caps&quot;&gt;DOM&lt;/span&gt; and lots and lots of event handling. The latter two is what we do here.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;Warning sign #7: lack of data caching&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;We loop over all the elements with the class “.the_faces” and add a mouseover and mouseout handler to each of them. Every time these get fired, we read an attribute, create a string with it and access an element that has the ID of the string and show or hide it. Showing and hiding using the jQuery methods is another access to the &lt;span class=&quot;caps&quot;&gt;DOM&lt;/span&gt; as it manipulates the display style property. We show and hide the “center image” upfront and also on another event hander on the overall parent element.&lt;/p&gt;

	&lt;p&gt;If we were to add touch and keyboard handlers we’d triple the amount of assigned event handlers as we apply them on each image.&lt;/p&gt;

	&lt;p&gt;I call this Goldfish code – we keep asking the browser for things we should already know. The widget interface we have here is static &lt;span class=&quot;caps&quot;&gt;HTML &lt;/span&gt;- there is no loading of content, no changes in it. Therefore there is no point in continuously reading out what the data-number attribute is and ask the browser to find the element with a certain ID. Caching results is a very simple thing to do and the performance benefits are amazing.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Rethinking the solution the vanilla web diet way&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;I approached the solution by looking at what we need to do here:&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We have a widget of a certain size with images in it&lt;/li&gt;&lt;li&gt;We have an unknown amount of images – it should be dead easy to remove or add one or replace them all&lt;/li&gt;&lt;li&gt;Moving the mouse over the widget should loop through the images, also touching the widget should do so and it would be nice to be able to flip forward and backward with the keyboard&lt;/li&gt;&lt;li&gt;Should things not work out it would be nice to have an display that still makes sense&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h4&gt;The &lt;span class=&quot;caps&quot;&gt;HTML &lt;/span&gt;- we don’t need IDs or data attributes&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;xml&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;href&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;/productpage&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;rollover&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;ol&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0518.jpg&quot;&lt;/span&gt; alt&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0517.jpg&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;alt&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0516.jpg&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;alt&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;current&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0515.jpg&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;alt&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0519.jpg&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;alt&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0520.jpg&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;alt&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;pics/IMG_0521.jpg&quot;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;alt&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/li&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/ol&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/a&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;



	&lt;p&gt;We should link this to something – after all a beautiful effect like that should react in some sale or deep-dive, right? Good thing is that in &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; links can contain other elements. So all we add is a link. This automatically gives us keyboard access to the widget – something otherwise we’d have to create by using &lt;a href=&quot;http://www.yuiblog.com/blog/2009/02/23/managing-focus/&quot;&gt;roaming tabIndex&lt;/a&gt;.&lt;/p&gt;

	&lt;p&gt;As the order of the images is important, an OL is the right element to use. Each image has an empty alt attribute to ensure there is no hassle with screenreaders. Instead of defining which image to show as the first one in our JavaScript we keep this maintained in &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, too, by adding a class of “current” to the image.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Showing and hiding with &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;css&quot; style=&quot;font-family: monospace;&quot;&gt;body &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;font-family&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; arial&lt;span style=&quot;color: #00AA00;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#rollover&lt;/span&gt;&lt;span style=&quot;color: #6666ff;&quot;&gt;.js&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;display&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;margin&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;2em&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;z-index&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;270px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;200px&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;cursor&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#rollover&lt;/span&gt;&lt;span style=&quot;color: #6666ff;&quot;&gt;.js&lt;/span&gt; img &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;visibility&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;hidden&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #cc00cc;&quot;&gt;#rollover&lt;/span&gt;&lt;span style=&quot;color: #6666ff;&quot;&gt;.js&lt;/span&gt; img&lt;span style=&quot;color: #6666ff;&quot;&gt;.current&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;visibility&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #993333;&quot;&gt;visible&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #00AA00;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;



	&lt;p&gt;As our functionality is dependent on JavaScript, our styling should be, too. This we can achieve by adding a “js” class to the element when JavaScript is available and only apply the styles when needed. This &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; gives the widget a fixed size and positions all the images stacked inside it.&lt;/p&gt;

	&lt;p&gt;Instead of doing a hide() and show() in JavaScript, all we need to do is to apply a class of “current” to the element we need to show. All the hiding and showing is thus done in &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; which means that in the future we’d want to do other visual things with the “shown” and “hidden” images, all we need to change is the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;.&lt;/p&gt;

	&lt;p&gt;
&lt;/p&gt;&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
 
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;document.&lt;span style=&quot;color: #660066;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
 
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; rollover &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; document.&lt;span style=&quot;color: #660066;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'#rollover'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    rollover.&lt;span style=&quot;color: #660066;&quot;&gt;className&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'js'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; images &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; rollover.&lt;span style=&quot;color: #660066;&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'img'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; all &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; images.&lt;span style=&quot;color: #660066;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; width &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; rollover.&lt;span style=&quot;color: #660066;&quot;&gt;offsetWidth&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; ox &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; rollover.&lt;span style=&quot;color: #660066;&quot;&gt;offsetLeft&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; boundarywidth &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; width &lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt; all&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; current &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; x &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; index &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; touched &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; setcurrent &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;index&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;images&lt;span style=&quot;color: #009900;&quot;&gt;[&lt;/span&gt;index&lt;span style=&quot;color: #009900;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
        images&lt;span style=&quot;color: #009900;&quot;&gt;[&lt;/span&gt;current&lt;span style=&quot;color: #009900;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;className&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
        images&lt;span style=&quot;color: #009900;&quot;&gt;[&lt;/span&gt;index&lt;span style=&quot;color: #009900;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;className&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'current'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
        current &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; index&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; findindex &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;x&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      index &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; parseInt&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;x &lt;span style=&quot;color: #339933;&quot;&gt;-&lt;/span&gt; ox&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt; boundarywidth&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;index &lt;span style=&quot;color: #339933;&quot;&gt;!==&lt;/span&gt; current&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
        setcurrent&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;index&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    rollover.&lt;span style=&quot;color: #660066;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'mousemove'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;!&lt;/span&gt;touched&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
        findindex&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev.&lt;span style=&quot;color: #660066;&quot;&gt;clientX&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    rollover.&lt;span style=&quot;color: #660066;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'touchstart'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      touched &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    rollover.&lt;span style=&quot;color: #660066;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'touchend'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      touched &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    rollover.&lt;span style=&quot;color: #660066;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'touchmove'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;touched&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
        findindex&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev.&lt;span style=&quot;color: #660066;&quot;&gt;changedTouches&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;clientX&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
        ev.&lt;span style=&quot;color: #660066;&quot;&gt;preventDefault&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    rollover.&lt;span style=&quot;color: #660066;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'keydown'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;ev&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; key &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; ev.&lt;span style=&quot;color: #FF0000;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;||&lt;/span&gt; ev.&lt;span style=&quot;color: #660066;&quot;&gt;key&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;||&lt;/span&gt; ev.&lt;span style=&quot;color: #660066;&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;key &lt;span style=&quot;color: #339933;&quot;&gt;===&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;37&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; index &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; index &lt;span style=&quot;color: #339933;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;key &lt;span style=&quot;color: #339933;&quot;&gt;===&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;39&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; index &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; index &lt;span style=&quot;color: #339933;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;index &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;index &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;index &lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt; all &lt;span style=&quot;color: #339933;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;index &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; all &lt;span style=&quot;color: #339933;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
      setcurrent&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;index&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;rollover.&lt;span style=&quot;color: #660066;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'.current'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; i &lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt; all&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #339933;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;images&lt;span style=&quot;color: #009900;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #009900;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;className&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;===&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'current'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
          current &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; i&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
          &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
      &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      setcurrent&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;current&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;



	&lt;p&gt;Quite longer than the jQuery, but bear with me as this does a lot more and in a much less demanding fashion. We wrap our code in a closure to makes sure we don’t leave any nasty globals behind. That should always be the first step.&lt;/p&gt;

	&lt;p&gt;Then we test if the browser supports document.querySelector. This is the standard answer to jQuery’s $() and is supported by lots and lots of great browsers. It is not supported by old and outdated browsers, which is why it is a good idea to test for it. This means that old Internet Explorer versions will not get the effect but instead they get the images as a numbered list (as we made the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; dependent on a class applied with JavaScript). This is good, as it means we don’t need to test on these old browsers, which is hard to do and frankly a waste of our time.&lt;/p&gt;

	&lt;p&gt;We get a reference to our rollover widget using &lt;code&gt;document.querySelector()&lt;/code&gt; and add the “js” class to it. This hides all the images and sets up the look and feel of the widget – all maintained in &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;. No need to loop through a lot of elements or use inline styles to hide them.&lt;/p&gt;

	&lt;p&gt;Next we get references to all the &lt;span class=&quot;caps&quot;&gt;DOM&lt;/span&gt; elements we need and calculate what we need to find out what to show when the mouse cursor or the finger is on a certain part of the widget.&lt;/p&gt;

	&lt;p&gt;First we get all the images and store them in &lt;code&gt;images&lt;/code&gt;. This will not change while the page is open, and &lt;code&gt;querySelectorAll()&lt;/code&gt; gives us references to all of them. We store the amount of images in &lt;code&gt;all&lt;/code&gt; to compare against later on.&lt;/p&gt;

	&lt;p&gt;Next we do the thing dynamically that the original solution did by hand – calculate the width of the different strips of the interaction that shows and hides images. We do this by reading out the &lt;code&gt;offsetWidth&lt;/code&gt; of the widget as it is defined in &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, so we don’t know and don’t want to hard-wire any widths in our JavaScript. We find out how far left the widget is in the browser by reading the &lt;code&gt;offsetLeft&lt;/code&gt; property and store that in &lt;code&gt;ox&lt;/code&gt;. Then we calculate the width of the interaction boundaries by dividing the width of the widget by the amount of images and store that in &lt;code&gt;boundarywidth&lt;/code&gt;.&lt;/p&gt;

	&lt;p&gt;This makes the widget flexible to change any time the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; changes or the amount of images does. If you remove or add an image, the width of the boundaries is calculated newly. No need to change the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; to reflect that width. We made this now maintainable simply by adding or removing list items.&lt;/p&gt;

	&lt;p&gt;We define the current shown image index as 0, preset an &lt;code&gt;x&lt;/code&gt; variable as 0, define the current &lt;code&gt;index&lt;/code&gt; of the detected movement as 0 and set &lt;code&gt;touched&lt;/code&gt; to false.&lt;/p&gt;

	&lt;p&gt;The &lt;code&gt;index&lt;/code&gt; will be the index of the image to be shown at a certain point in the interaction. The index of the currently shown one is be stored in &lt;code&gt;current&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt; will be detected position of the mouse or finger on the screen and &lt;code&gt;touched&lt;/code&gt; defines if the screen is currently being touched or not.&lt;/p&gt;

	&lt;p&gt;The &lt;code&gt;setcurrent()&lt;/code&gt; function hides the last shown image and shows a new one by shifting the “current” class from one to the other. It then stores the new image index in current. This is a very simple way to show a new state in a collection of things that can only show one at a time. No need to ask the browser which one is visible when we can store this in a variable like &lt;code&gt;current&lt;/code&gt;.&lt;/p&gt;

	&lt;p&gt;The &lt;code&gt;findindex()&lt;/code&gt; function converts the detected horizontal position of the mouse cursor or the finger of the user into an index of our image array. All you need to do is to subtract the left position of the widget itself and divide the value by the boundarywidth. Convert it to an integer and compare it to the current index and if it differs, call &lt;code&gt;setcurrent()&lt;/code&gt;.&lt;/p&gt;

	&lt;p&gt;All that is left is to assign the event handlers to make the magic happen. The first is a mousemove listener on the widget that calls &lt;code&gt;findindex()&lt;/code&gt; when no touch happened. The current horizontal mouse position is stored in &lt;code&gt;clientX&lt;/code&gt; of the &lt;code&gt;mousemove&lt;/code&gt; event.&lt;/p&gt;

	&lt;p&gt;Touch interaction needs to be initiated (at least in Chrome in my testing here) so we set the Boolean of &lt;code&gt;touched&lt;/code&gt; to true when a &lt;code&gt;touchstart&lt;/code&gt; happened and to false when &lt;code&gt;touchend&lt;/code&gt; was detected.&lt;/p&gt;

	&lt;p&gt;When a user moves a finger over the widget the browser fires the &lt;code&gt;touchmove&lt;/code&gt; event and the current horizontal position is stored in the &lt;code&gt;clientX&lt;/code&gt; property of the &lt;code&gt;changedTouches&lt;/code&gt; array. We only detect the first finger in this case.&lt;/p&gt;

	&lt;p&gt;Keyboard detection doesn’t give us a position on the screen, so all we do is manipulate the image index directly. We listen for a &lt;code&gt;keydown&lt;/code&gt; event and check the code of the key that was pressed. If it is the left arrow we subtract one from the current index and in the case of the right arrow we add one to it. We ensure that the index stays in the allowed limits and call &lt;code&gt;setcurrent()&lt;/code&gt;.&lt;/p&gt;

	&lt;p&gt;The last thing to do is to show the current image. If there is one with the right class in the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; we need to find out its index and we do that by looping over them until we find the right one. If there isn’t any we just apply the current class to the first image (as defined at the start of the script).&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Many solutions to the same idea&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;I hope this gives you an idea of how to approach an effect like that when you want to put it in production. There are of course other ways of doing it, but I wanted to ensure a few things that get very often forgotten:&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The whole effect is now generated from the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, so all you need to do to create a new swivel is add other images&lt;/li&gt;&lt;li&gt;The whole look and feel is defined in &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; and you can resize the widget without having to worry about the size of the different boundaries&lt;/li&gt;&lt;li&gt;It can be used with a keyboard, the mouse or on touch devices&lt;/li&gt;&lt;li&gt;The &lt;span class=&quot;caps&quot;&gt;DOM&lt;/span&gt; interaction is kept to an absolute minimum which means the performance on low spec devices is much, much better&lt;/li&gt;&lt;li&gt;There is no jQuery dependency&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;


 &lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/chrisheilmann/~4/8LZYwBkp6kI&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 16 May 2013 23:05:05 +0000</pubDate>
	<dc:creator>Chris Heilmann</dc:creator>
</item>
<item>
	<title>Robert Kaiser: Preserving Software - Feedback Requested!</title>
	<guid isPermaLink="true">http://home.kairo.at/blog/2013-05/preserving_software_feedback_requested</guid>
	<link>http://home.kairo.at/blog/2013-05/preserving_software_feedback_requested</link>
	<description>As &lt;a href=&quot;http://www.digitalpreservation.gov/&quot;&gt;Digital Preservation&lt;/a&gt; is part of the agenda of the US Library of Congress, they're doing a workshop on Software Preservation next week, and Mozilla was invited as an expert group. &lt;a href=&quot;https://mozillians.org/u/ottodv/&quot;&gt;Otto de Voogd&lt;/a&gt; and myself are in the delegation going there (I'll be roughly in the Washington, DC, area from Saturday until June 2) for Mozilla - and the text below is a guest post by Otto with questions that we would like some feedback on so we can represent the Mozilla community as well as possible:&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;br /&gt;
&lt;br /&gt;
On the 20th and 21st of May the Library of Congress holds a workshop on the topic of preserving software.&lt;br /&gt;
Otto de Voogd and Robert Kaiser will be representing Mozilla, putting forward our viewpoint as custodians of a codebase with a significant heritage and importance.&lt;br /&gt;
&lt;br /&gt;
Many questions and thoughts arise. Here's an overview of ours; we look forward to feedback.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Should archivists keep source codes or executables or both?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Executables and source code are both valuable. Executables are valuable because the source code is sometimes not available, or perhaps the build tools are not, and setting up a build environment for older code can be a difficult and complex thing.&lt;br /&gt;
&lt;br /&gt;
Source is valuable to determine how a program works. It also makes it possible to reuse code and algorithms, especially, but not only, in the case of open source software.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Preserving documentation.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Preserving documentation that goes with software, seems logical.&lt;br /&gt;
Would this need to go as far as preserving discussion threads and entries in bug trackers?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Preserving environments/platforms.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
It seems obvious that without preserving an environment in which the software can run, it is going to be impossible to experience the software.&lt;br /&gt;
Preserving such an environment should therefor be part of the software preservation effort.&lt;br /&gt;
&lt;br /&gt;
To avoid the physical constraints imposed by preserving old hardware (which would be a preservation effort in its own right), a solution would be to build virtual machines and emulators.&lt;br /&gt;
As hardware capacity constantly grows, running virtual versions of older hardware should generally be feasible.&lt;br /&gt;
&lt;br /&gt;
To fully recreate an environment we'd also need to preserve the operating systems and other software tools that the preserved software needs to run.&lt;br /&gt;
Those being software themselves would logical already be included in any software preservation effort.&lt;br /&gt;
&lt;br /&gt;
Preserving documentation concerning environments, would also be required.&lt;br /&gt;
To build virtual machines and emulators it would be helpful for hardware makers to make technical specifications available. One could envision this to become a legal requirement at least for older hardware.&lt;br /&gt;
&lt;br /&gt;
Can we imagine a world where web based emulators would allow an online digital library to serve users worldwide? Users who would be able to run old software in emulators running in their browsers...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Is everything worth preserving, if not how does one go about selecting what is worth preserving?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Does one need to preserve every version of software, just the last version or all major releases? What about preserving software that has not spread widely. Would there be some threshold, or some other criteria?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- How does one index software and search the library?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
There will be a need to gather meta data about software and the preservation of documentation as we already mentioned. This meta data and documentation could serve to populate an index enabling for instance the search for particular features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Can software preservation help in making code reusable?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
If there are good ways to actually find relevant and useful code, this could lead to more reuse not only of actual code, but also of algorithms and concepts.&lt;br /&gt;
It may also become a valuable source for students who wish to learn about actual implementations of software solutions.&lt;br /&gt;
&lt;br /&gt;
At the very least a minimum of meta data, such publication dates, copyright owners and licenses should be available to determine how certain code can be reused.&lt;br /&gt;
In particular for open source software we believe that software libraries should strive make it available without restrictions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Preserving data formats.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The software preservation effort should also include an effort to preserve data formats. Including technical descriptions of those formats and the tools to read, write and edit those formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Can software preservation help in the discovery of prior art?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We believe it can, and as such preserving old code could be a great tool in preventing the repatenting of existing software concepts.&lt;br /&gt;
&lt;br /&gt;
Of course we believe that software patents shouldn't exist in the first place, as software is already covered by copyrights, but at the very least prior art is a good avenue to prevent some of the worst abuse of software patents.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- How do copyrights affect software libraries?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A lot of software is licensed to be used on a particular piece of hardware or only available via subscription. How does this affect software libraries? Should there be exceptions like there are for traditional libraries?&lt;br /&gt;
&lt;br /&gt;
In the life cycle of software, the commercially exploitable time is limited, likely anything older than 10 years no longer has any commercial value.&lt;br /&gt;
Maybe copyrights on software should be significantly reduced to something like 10 years, which is more than enough to cover the commercially exploitable timeframe of the software life cycle.&lt;br /&gt;
&lt;br /&gt;
Such a limit would greatly enhance the work of software libraries, increasing availability and ease of access as well as removing a lot of the red tape involving requests for permission to keep copies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- What about software as a service?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
And what about software as a service, where neither the source code nor the executables are ever published? How can something like Gmail be preserved, when neither the service's code nor the environment is available to the public?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;- Preserving &quot;illegal&quot; or cracked copies?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
What if a copy of a piece of software comes from an illegal source? A cracked version with modifications maybe? They have value in themselves as they are a cultural expression.&lt;br /&gt;
&lt;br /&gt;
What if such an illegal copy is the only copy still available? Would it make sense to preserve that too?&lt;br /&gt;</description>
	<pubDate>Thu, 16 May 2013 22:08:13 +0000</pubDate>
	<dc:creator>KaiRo</dc:creator>
</item>
<item>
	<title>Rob Campbell: #io13</title>
	<guid isPermaLink="false">http://robcee.net/?p=138</guid>
	<link>http://robcee.net/2013/io13/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/robceemoz/8744727638/&quot; title=&quot;IO13 by robceemoz, on Flickr&quot;&gt;&lt;img alt=&quot;IO13&quot; height=&quot;333&quot; src=&quot;http://farm8.staticflickr.com/7282/8744727638_bd8557ee05.jpg&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I sat in on three sessions at Google IO 2013 yesterday.&lt;/p&gt;
&lt;p&gt;Memory Lane with Chrome Devtools and GMail was the first.&lt;/p&gt;
&lt;p&gt;The presenters showed off their Heap Tracking Profiler and Memory Tracking tool in the Timeline and explained how to use them to track down a leaky DOM node. It was a practical application of how to use a developer tool to solve a particular problem.&lt;/p&gt;
&lt;p&gt;One interesting takeaway that surprised the presenters during their research: Always allocating more memory (caching) as a way to improve performance in a large application like Gmail is not a panacea for slow performance. Having a large heap space actually slows down the garbage collector and your performance suffers. It’s a fine balance.&lt;/p&gt;
&lt;p&gt;What surprised me was how they analyzed their problem by tracking a user with a known high memory problem for three days. The Google team constantly monitors their apps’ performance via the window.performance API and can single out hotspots in the population.&lt;/p&gt;
&lt;p&gt;The next talk I sat in on was about Chrome Apps. The presenter, Erik Kay showed off some of the “Immersive” experiences of Chrome Apps and the different ways they could interact with the hardware on the Chrome Book. The talk included a demo of a small thermal printer being hooked up and controlled over USB which garnered some applause.&lt;/p&gt;
&lt;p&gt;The Chrome Web Store lets you buy apps for Chrome.&lt;/p&gt;
&lt;p&gt;The only real mention of Android was that they were using PhoneGap and Cordova to provide their compatibility layer. Same for IOS. There will be compatibility issues with deploying on iOS but it seems surprising that they would pursue this completely separate technology for Android. Surely they could ship a full version of the Chrome Runtime and deal with hardware incompatibilities directly.&lt;/p&gt;
&lt;p&gt;The questions from the room were interesting. One man (not a Mozillian) asked about WebRTC compatibility across the different platforms, pointedly repeating the question of whether or not he’d be able to use WebRTC in an app on iOS. Only when their WebView supports it.&lt;/p&gt;
&lt;p&gt;Another man asked something about interoperability between B2G and ChromeRT. Erik said that there is “no forcing function yet to drive standardization”.&lt;/p&gt;
&lt;p&gt;I think my biggest takeaway from this talk was that people wearing Google Glass look like dorks.&lt;/p&gt;
&lt;p&gt;My second biggest takeaway was that I was very surprised that there was zero mention of the Google Play Store for Chrome Apps.&lt;/p&gt;
&lt;p&gt;Last talk I attended was a Fireside Chat with the Blink Team. While I was expecting an actual fire and was disappointed there wasn’t one, the team bravely took questions from an audience confused about feature-detection, unprefixed CSS and market fragmentation.&lt;/p&gt;
&lt;p&gt;Dan Buchner asked the panel something about standardization and I felt a little badly for the Blink team who had a whole chunk of slides talking about how they’re going to be good citizens. (If you want to participate, you should join blink-dev@chromium.org.)&lt;/p&gt;
&lt;p&gt;I was interested in &lt;a href=&quot;http://www.chromestatus.com/features&quot;&gt;ChromeStatus.com/features &lt;/a&gt;which shows a spreadsheet of features in-progress. Time will tell how their Intent to Implement and Intent to Ship broadcasting will work from an Open Source point-of-view, but they are currently claiming that a third of their intents to implement are coming from outside of Google.&lt;/p&gt;
&lt;p&gt;I wanted to meet Paul Irish after the talk but Steven Shankland showed up and pushed me out of the way. When he was done I did get to meet him, but I think Buchner had made him angry or something. Maybe he was just tired. I dunno.&lt;/p&gt;</description>
	<pubDate>Thu, 16 May 2013 14:45:49 +0000</pubDate>
	<dc:creator>rob</dc:creator>
</item>
<item>
	<title>Joey Armstrong: Transitioning to moz.build</title>
	<guid isPermaLink="false">http://adirondackfirefly.wordpress.com/?p=408</guid>
	<link>http://adirondackfirefly.wordpress.com/2013/05/16/transitioning-to-moz-build/</link>
	<description>If you have been wondering about status for the transition to mozbuild as a replacement for makefile infrastructure, a source is becoming available. People involved with the conversion have been meeting bi-weekly on the topic – details and content can … &lt;a href=&quot;http://adirondackfirefly.wordpress.com/2013/05/16/transitioning-to-moz-build/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;→&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=adirondackfirefly.wordpress.com&amp;amp;blog=34277858&amp;amp;post=408&amp;amp;subd=adirondackfirefly&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 16 May 2013 14:04:47 +0000</pubDate>
	<dc:creator>njaph66</dc:creator>
</item>
<item>
	<title>Michael Kaply: Disabling Safe Mode (Again)</title>
	<guid isPermaLink="false">http://mike.kaply.com/?p=1856</guid>
	<link>http://mike.kaply.com/2013/05/16/disabling-safe-mode-again/</link>
	<description>&lt;p&gt;
So lots of people are having trouble disabling safe mode using my earlier instructions and I discovered it is because of problems overlaying the dialog. So here are some new instructions that should work for everyone.
&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1856&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
First, create a disablesafemode directory in distribution/bundles where the Firefox executable is located (you'll probable have to create the distribution and bundles directories as well). Then create a file called chrome.manifest that looks like this:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;content disablesafemode content/
override chrome://browser/content/safeMode.xul chrome://disablesafemode/content/safeMode.xul
&lt;/pre&gt;
&lt;p&gt;Then create a subdirectory called content. In that directory, create a file called safeMode.xul that looks like this:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;?xml-stylesheet href=&quot;chrome://global/skin/&quot;?&amp;gt;
&amp;lt;dialog xmlns=&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;
        id=&quot;safeModeDialog&quot;
        buttons=&quot;,&quot;
        ondialogcancel=&quot;closeFirefox();&quot;&amp;gt;
  &amp;lt;script type=&quot;application/x-javascript;version=1.7&quot;&amp;gt;
  &amp;lt;![CDATA[
  function closeFirefox() {
    Components.utils.import(&quot;resource://gre/modules/Services.jsm&quot;);
    Services.startup.quit(Services.startup.eForceQuit);
  }
  ]]&amp;gt;
  &amp;lt;/script&amp;gt;
  &amp;lt;description&amp;gt;
  Safe Mode has been disabled.
  &amp;lt;/description&amp;gt;
&amp;lt;/dialog&amp;gt;&lt;/pre&gt;
&lt;p&gt;This will cause a dialog to be shown instead of the safe mode dialog that when the user closes, will simply close Firefox. If you'd prefer to show no dialog at all, change &lt;code&gt;ondialogcancel&lt;/code&gt; to &lt;code&gt;onload&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
I've tested this a lot, and it is working for me. Please let me know if you have problems.&lt;/p&gt;</description>
	<pubDate>Thu, 16 May 2013 13:49:51 +0000</pubDate>
	<dc:creator>Mike Kaply</dc:creator>
</item>
<item>
	<title>Nagappan: Announce: LDTP 3.5 - Linux GUI test automation tool</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5172440053446312608.post-8364904088331380401</guid>
	<link>http://ldtp-soc.blogspot.com/2013/05/announce-ldtp-35-linux-gui-test.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Highlights&lt;/b&gt;:&lt;br /&gt;&lt;b&gt;New API&lt;/b&gt;:&lt;br /&gt;* inserttext, objtimeout, guitimeout, getcellsize, getcellvalue,&lt;br /&gt;getobjectnameatcoords, getcombovalue, getaccesskey in Python client&lt;br /&gt;* doubleClick, doubleClickRow, onWindowCreate, getCellSize, getComboValue,&lt;br /&gt;appUnderTest, getAccessKey in Java client&lt;br /&gt;* getcellsize, getcellvalue in Ruby client&lt;br /&gt;* GetCellSize, GetComboValue, AppUnderTest, GetAccessKey, MouseRightClick,&lt;br /&gt;DoubleClick, DoubleClickRow, RightClick in C# client&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New control type&lt;/b&gt;:&lt;br /&gt;* POPUP MENU for Ubuntu environment&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bugs fixed&lt;/b&gt;:&lt;br /&gt;&lt;b&gt;Ruby client&lt;/b&gt;:&lt;br /&gt;* Fixed optional arguments to imagecapture&lt;br /&gt;* Check window_name parameter, if empty then use @window_name passed in&lt;br /&gt;constructor&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python client&lt;/b&gt;:&lt;br /&gt;* Fixed optional argument APIs to work on both Windows and Linux&lt;br /&gt;* imagecapture x, y offset, height and width parameters are disregarded if&lt;br /&gt;window parameter is provided - Bug#685548&lt;br /&gt;* Return unicode string all the time on gettextvalue&lt;br /&gt;* Fix partial match argument in selectrow, compatible with Windows&lt;br /&gt;* Patch by ebass to support Python 2.6&lt;br /&gt;* Added Errno 101 as we see in ebass Ubuntu 10.04 environment&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Core LDTP2&lt;/b&gt;&lt;br /&gt;* Include label type on gettextvalue&lt;br /&gt;* Don't include separators in the list&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Perl client&lt;/b&gt;:&lt;br /&gt;* Added perl client&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Credit&lt;/b&gt;:&lt;br /&gt;* Sawyer X for the Perl interface&lt;br /&gt;* ebass (IRC nick name)&lt;br /&gt;* Marek Rosa &lt;br /&gt;* Thanks to all others who have reported bugs through forum / email /&lt;br /&gt;in-person / IRC&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About LDTP&lt;/b&gt;:&lt;br /&gt;Cross Platform GUI Automation tool Linux version is LDTP, Windows version&lt;br /&gt;is Cobra and Mac version is PyATOM.&lt;br /&gt;&lt;br /&gt;* Linux version is known to work on GNOME / KDE (QT &amp;gt;= 4.8) / Java Swing /&lt;br /&gt;LibreOffice / Mozilla application on all major Linux distribution.&lt;br /&gt;* Windows version is known to work on application written in .NET / C++ /&lt;br /&gt;Java / QT on Windows XP SP3 / Windows 7 / Windows 8 development version.&lt;br /&gt;* Mac GUI testing is known to work on OS X Snow Leopard/Lion/Mountain Lion.&lt;br /&gt;Where ever PyATOM runs, LDTP should work on it.&lt;br /&gt;&lt;br /&gt;Download &lt;a href=&quot;https://github.com/ldtp/ldtp2&quot;&gt;source&lt;/a&gt; / &lt;a href=&quot;http://download.opensuse.org/repositories/home:/anagappan:/ldtp2:/&quot;&gt;binary&lt;/a&gt; (RPM/DEB)&lt;br /&gt;&lt;br /&gt;Documentation references: &lt;a href=&quot;http://ldtp.freedesktop.org/user-doc/index.html&quot;&gt;API&lt;/a&gt; / &lt;a href=&quot;http://ldtp.freedesktop.org/javadoc/&quot;&gt;JavaDoc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For detailed information on LDTP framework and latest updates visit&lt;br /&gt;http://ldtp.freedesktop.org&lt;br /&gt;&lt;br /&gt;Report &lt;a href=&quot;http://ldtp.freedesktop.org/wiki/Bugs&quot;&gt;bugs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To subscribe to LDTP mailing &lt;a href=&quot;http://ldtp.freedesktop.org/wiki/Mailing_20list&quot;&gt;lists&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IRC Channel - #ldtp on irc.freenode.net&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How can you help&lt;/b&gt;: Spread the news and send back your feedback to us&lt;/div&gt;</description>
	<pubDate>Thu, 16 May 2013 08:04:18 +0000</pubDate>
	<author>noreply@blogger.com (Nagappan)</author>
</item>
<item>
	<title>Brendan Eich: C is for Cookie</title>
	<guid isPermaLink="false">https://brendaneich.com/?p=8159</guid>
	<link>https://brendaneich.com/2013/05/c-is-for-cookie/</link>
	<description>&lt;p&gt;Mozilla is engaged in a broad, deep conversation about Internet privacy. We believe in &lt;a href=&quot;https://blog.mozilla.org/blog/2013/05/10/personalization-with-respect/&quot;&gt;putting users in control&lt;/a&gt; of their online experience, and we want a healthy, thriving web ecosystem — we do not see a contradiction. However, sometimes a crucial experiment is required to prove it.&lt;/p&gt;
&lt;p&gt;To this end, we are testing a patch from &lt;a href=&quot;http://www.stanford.edu/~jmayer/&quot;&gt;Jonathan Mayer&lt;/a&gt;. Jonathan’s &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=818340&quot;&gt;patch&lt;/a&gt; matches how Safari has worked for years, and does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allows &lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_cookie&quot;&gt;cookies&lt;/a&gt; from sites you have already visited.
&lt;/li&gt;&lt;li&gt;Blocks cookies from sites you have not visited yet.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The idea is that if you have not visited a site (including the one to which you are navigating currently) and it wants to put a cookie on your computer, the site is likely not one you have heard of or have any relationship with. But this is only likely, not always true. Two problems arise:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;False positives&lt;/b&gt;. For example, say you visit a site named &lt;code&gt;foo.com&lt;/code&gt;, which embeds cookie-setting content from a site named &lt;code&gt;foocdn.com&lt;/code&gt;. With the patch, Firefox sets cookies from &lt;code&gt;foo.com&lt;/code&gt; because you visited it, yet blocks cookies from &lt;code&gt;foocdn.com&lt;/code&gt; because you never visited &lt;code&gt;foocdn.com&lt;/code&gt; directly, even though there is actually just one company behind both sites.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;False negatives&lt;/b&gt;. Meanwhile, in the other direction, just because you visit a site once does not mean you are ok with it tracking you all over the Internet on unrelated sites, forever more. Suppose you click on an ad by accident, for example. Or a site you trust directly starts setting &lt;a href=&quot;http://blog.sidstamm.com/2013/03/what-ever-happened-to-second-party.html&quot;&gt;third-party cookies&lt;/a&gt; you do not want.&lt;/p&gt;
&lt;p&gt;Our challenge is to find a way to address these sorts of cases. We are looking for more granularity than deciding automatically and exclusively based upon whether you visit a site or not, although that is often a good place to start the decision process. &lt;/p&gt;
&lt;p&gt;We plan to ship an evolution of the patch “on” by default, but we want to make refinements first. To make sure we get this right we need more data. Our next engineering task is to add privacy-preserving code to measure how the patch affects real websites. We will also ask some of our Aurora and Beta users to opt-in to a study with deeper data collection.&lt;/p&gt;
&lt;p&gt;There are many conflicting claims about how this patch will affect the Internet. Why debate in theory what we can measure in practice? We are going to find out more and adjust course as needed. This is the essence of the release test cycle.&lt;/p&gt;
&lt;p&gt;On Tuesday we did two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The patch has progressed to the &lt;a href=&quot;http://www.mozilla.org/firefox/beta/&quot;&gt;Beta&lt;/a&gt; release channel for &lt;a href=&quot;https://wiki.mozilla.org/Releases#Firefox_22&quot;&gt;Firefox 22&lt;/a&gt;, but it is not “on” by default there. This allows more people to test the patch via Firefox’s “preferences” (AKA “options”) user interface, and avoids an abrupt change for site owners while we work on handling the hard cases.
&lt;/li&gt;&lt;li&gt;The patch remains in the &lt;a href=&quot;http://www.mozilla.org/firefox/aurora/&quot;&gt;Aurora&lt;/a&gt; channel for Firefox, where it is “on” by default. This gives the patch better ongoing test coverage and facilitates A/B testing.
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;We have heard important feedback from concerned site owners. We are always committed to user privacy, and remain committed to shipping  a version of the patch that is “on” by default. We are mindful that this is an important change; we always knew it would take a little longer than most patches as we put it through its paces. &lt;/p&gt;
&lt;p&gt;For those who read this as Mozilla softening our stance on protecting privacy and putting users first, in a word: no. False positives break sites that users intentionally visit. (Fortunately, we haven’t seen too many such problems, but greater testing scale is needed.) False negatives enable tracking where it is not wanted. The patch as-is needs more work.&lt;/p&gt;
&lt;p&gt;We look forward to continued dialog with colleagues, contributors, fans, and detractors. We will update all of you within six weeks so you can understand our thinking and how we will proceed. Comments welcome.&lt;/p&gt;
&lt;p&gt;/be&lt;/p&gt;
&lt;p&gt;P.S. Cookies (&lt;a href=&quot;http://en.wikipedia.org/wiki/Magic_cookie&quot;&gt;name&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/X_Window_authorization&quot;&gt;history&lt;/a&gt;) were originally intended to be ephemeral (Windows 3.1 had so little usable memory with its 64K memory segments that Netscape’s founders had no choice). At first, they held only session state that could be recovered from the server by logging in again.&lt;/p&gt;
&lt;p&gt;(Remind me to tell the story some day of &lt;a href=&quot;http://en.wikipedia.org/wiki/Lou_Montulli&quot;&gt;Montulli’s&lt;/a&gt; aborted “twinkies” idea from the Netscape 2 era. UPDATE: Lou has published a new &lt;a href=&quot;http://montulli.blogspot.com/2013/05/the-reasoning-behind-web-cookies.html&quot;&gt;blog post about cookies&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;How far we have come in the amazing, living system that is the Web! No one planned for what actually happened, but with more work on the cookie policy in Firefox and (I hope) other browsers, I believe that we can evolve to a better space.&lt;/p&gt;</description>
	<pubDate>Thu, 16 May 2013 07:11:50 +0000</pubDate>
	<dc:creator>Brendan Eich</dc:creator>
</item>
<item>
	<title>Erik Vold: Old School To Jetpack Part 2 - XUL Bashing</title>
	<guid isPermaLink="false">http://work.erikvold.com/jetpack/2013/05/16/old-school-to-jetpack-xul</guid>
	<link>http://work.erikvold.com/jetpack/2013/05/16/old-school-to-jetpack-xul.html</link>
	<description>&lt;p&gt;In &lt;a href=&quot;http://work.erikvold.com/jetpack/2013/05/12/old-school-to-jetpack-retrofit.html&quot;&gt;Old School to Jetpack Part 1&lt;/a&gt; I briefly mentioned that xul overlays are not supported with Jetpacks, so today I want to talk about how to convert old school XUL overlays.&lt;/p&gt;

&lt;p&gt;A typical overlay would look something like lke this &lt;code&gt;addon-browser-overlay.xul&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;overlay xmlns=&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;&amp;gt;
  &amp;lt;toolbar id=&quot;addon-bar&quot;&amp;gt;
    &amp;lt;textbox id=&quot;test-status-bar-message&quot; insertbefore=&quot;addonbar-closebutton&quot; value=&quot;Hi!&quot;&amp;gt;&amp;lt;/textbox&amp;gt;
  &amp;lt;/toolbar&amp;gt;
&amp;lt;/overlay&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This overlay, would then be associated to &lt;code&gt;browser.xul&lt;/code&gt; in the &lt;code&gt;chrome.manifest&lt;/code&gt; file with an entry like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;overlay    chrome://browser/content/browser.xul chrome://{add-on name here}/content/addon-browser-overlay.xul&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, the overlay would produce this in Firefox’s addon-bar:&lt;/p&gt;
&lt;img alt=&quot;Screen Shot&quot; src=&quot;http://work.erikvold.com/images/xul-jplib-ss.png&quot; /&gt;
&lt;p&gt;With Jetpacks however the latter step cannot be done, because these overlay entries are ignored for restartless add-ons. One could manually force the overlay with a call to &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/DOM/document.loadOverlay&quot;&gt;&lt;code&gt;document.loadOverlay&lt;/code&gt;&lt;/a&gt;, but there is no way to undo this, that is why overlay’s are not supported for restartless add-ons at the moment.&lt;/p&gt;

&lt;p&gt;So what is needed here is a module that will add the desired XUL elements to the desired XUL documents.&lt;/p&gt;

&lt;p&gt;This is why I wrote a &lt;a href=&quot;https://github.com/erikvold/xul-jplib/&quot;&gt;XUL package for Jetpack&lt;/a&gt;, it is very raw at the moment, and very simple, so you’ve been warned!&lt;/p&gt;

&lt;h3&gt;XUL Package for Jetpack&lt;/h3&gt;

&lt;h4&gt;About&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/erikvold/xul-jplib/&quot;&gt;source code can be found on github here&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Pros&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Quick easy solution for coverting XUL overlays for use with Jetpacks&lt;/li&gt;

&lt;li&gt;Handles unloads&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Cons&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Only works on Firefox (or other applications made with XUL)&lt;/li&gt;

&lt;li&gt;At the moment this package only works for adding xul to &lt;code&gt;browser.xul&lt;/code&gt; (although it won’t be hard to extend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Alternatives&lt;/h4&gt;

&lt;p&gt;Before I go in to this module I want to take a moment to point out that there are many &lt;a href=&quot;https://github.com/mozilla/addon-sdk/wiki/Community-developed-modules&quot;&gt;third party packages&lt;/a&gt; which handle most of the use cases that overlays for &lt;code&gt;browser.xul&lt;/code&gt; support; they don’t cover everything though, like the example above, so this is why I wrote this general purpose package.&lt;/p&gt;

&lt;h4&gt;Usage&lt;/h4&gt;

&lt;p&gt;To implement the example above using this module, one would simply need to do the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const { XUL, getXULById } = require('xul/browser');
getXULById('addon-bar').insertBefore(XUL('textbox', {
  id: 'test-status-bar-message',
  value: 'Hi!'
}), 'addonbar-closebutton');&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And this code is restartless!&lt;/p&gt;</description>
	<pubDate>Thu, 16 May 2013 07:00:00 +0000</pubDate>
	<author>evold@mozilla.com (Erik Vold)</author>
</item>
<item>
	<title>Byron Jones: happy bmo push day!</title>
	<guid isPermaLink="false">http://globau.wordpress.com/?p=402</guid>
	<link>http://globau.wordpress.com/2013/05/16/happy-bmo-push-day-45/</link>
	<description>&lt;p&gt;the following changes have been pushed to bugzilla.mozilla.org:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=868044&quot; target=&quot;_blank&quot;&gt;868044&lt;/a&gt;] Bugzilla should be automagically aware of which product channel a bug-filer is using.&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=815531&quot; target=&quot;_blank&quot;&gt;815531&lt;/a&gt;] splinter fails to display attachment 681995 correctly&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=869077&quot; target=&quot;_blank&quot;&gt;869077&lt;/a&gt;] Component isn’t preselected from the query_string when cloning a bug&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=850135&quot; target=&quot;_blank&quot;&gt;850135&lt;/a&gt;] hide the textarea custom fields by default with an (edit) link&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=866447&quot; target=&quot;_blank&quot;&gt;866447&lt;/a&gt;] Make form.doc set up whiteboard for scrumbu.gs&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=871436&quot; target=&quot;_blank&quot;&gt;871436&lt;/a&gt;] release tracking flag refresh (24)&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=870907&quot; target=&quot;_blank&quot;&gt;870907&lt;/a&gt;] Project Kickoff Form: javascript responsible for checking for required values not working&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=828344&quot; target=&quot;_blank&quot;&gt;828344&lt;/a&gt;] “contains all of the words” no longer looks for all words within the same comment or flag&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=872022&quot; target=&quot;_blank&quot;&gt;872022&lt;/a&gt;] don’t link a review flag to splinter unless the attachment is a patch&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=841559&quot; target=&quot;_blank&quot;&gt;841559&lt;/a&gt;] Project Kickoff Form: Simplify finance question regrading budget&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=850920&quot; target=&quot;_blank&quot;&gt;850920&lt;/a&gt;] Project Kickoff Form: Add new question to Legal subsection area&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=841449&quot; target=&quot;_blank&quot;&gt;841449&lt;/a&gt;] Project Kickoff Form: New Question within Finance Sub Questions&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=850934&quot; target=&quot;_blank&quot;&gt;850934&lt;/a&gt;] Project Kickoff Form: Make Release Date a Required Field&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=850932&quot; target=&quot;_blank&quot;&gt;850932&lt;/a&gt;] Project Kickoff Form: Rework Privacy Policy/Project sub questions&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=826214&quot; target=&quot;_blank&quot;&gt;826214&lt;/a&gt;] New file with one line isn’t shown&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=797840&quot; target=&quot;_blank&quot;&gt;797840&lt;/a&gt;] Replying to a comment on Splinter always replies to the first comment&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=821889&quot; target=&quot;_blank&quot;&gt;821889&lt;/a&gt;] Make it so that Splinter shouts loudly when a patch introduces Windows line endings&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://globau.wordpress.com/category/mozilla/bmo/&quot;&gt;bmo&lt;/a&gt;, &lt;a href=&quot;http://globau.wordpress.com/category/mozilla/&quot;&gt;mozilla&lt;/a&gt;  &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=globau.wordpress.com&amp;amp;blog=25718030&amp;amp;post=402&amp;amp;subd=globau&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 16 May 2013 06:54:44 +0000</pubDate>
	<dc:creator>glob</dc:creator>
</item>
<item>
	<title>Alexander Surkov: Accessible Mozilla: Tech overview of Firefox 22</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-564396784419613484.post-173205603505247325</guid>
	<link>http://asurkov.blogspot.com/2013/05/accessible-mozilla-tech-overview-of.html</link>
	<description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;Firefox 22 reached beta status (it will be released June 24). It's time to list accessibility improvements we made for this version. &lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;ARIA&lt;/h3&gt;&lt;br /&gt;ARIA &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;a href=&quot;http://www.w3.org/TR/wai-aria/roles#note&quot;&gt;role=&quot;note&quot;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt; doesn't allow name from subtree (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=833256&quot;&gt;bug&lt;/a&gt;) anymore. The bug caused JAWS, for example, to announce &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;role=&quot;note&quot;&lt;/span&gt;&lt;/span&gt; content twice.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;HTML&lt;/h3&gt;&lt;br /&gt;* HTML &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;radio&lt;/span&gt;&lt;/span&gt; group position doesn't count hidden &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;radio&lt;/span&gt;&lt;/span&gt; elements (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=794620&quot;&gt;bug&lt;/a&gt;). So if the page contains hidden &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;input@type=&quot;radio&quot;&lt;/span&gt;&lt;/span&gt; then a screen reader doesn't take them into account announcing the number of radios.&lt;br /&gt;&lt;br /&gt;* HTML &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;input@type=&quot;file&quot;&lt;/span&gt;&lt;/span&gt; changed its hierachy. Now it contains a push button and a label. Be careful if you have dependences on this hierarchy (see &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=345195&quot;&gt;bug&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;* HTML5 &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;header&lt;/span&gt;&lt;/span&gt; and &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;footer&lt;/span&gt;&lt;/span&gt; has &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=849624&quot;&gt;changed&lt;/a&gt; their mapping according to &lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/dom.html#sec-strong-native-semantics&quot;&gt;HTML spec&lt;/a&gt;:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;code&gt;&lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/sections.html#the-footer-element&quot;&gt;footer&lt;/a&gt;&lt;/code&gt; element that is not a descendant of an &lt;code&gt;&lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/sections.html#the-article-element&quot;&gt;article&lt;/a&gt;&lt;/code&gt; or &lt;code&gt;&lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/sections.html#the-section-element&quot;&gt;section&lt;/a&gt;&lt;/code&gt; element.      &lt;code title=&quot;attr-aria-role-contentinfo&quot;&gt;contentinfo&lt;/code&gt; role;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/sections.html#the-header-element&quot;&gt;header&lt;/a&gt;&lt;/code&gt; element that is not a descendant of an &lt;code&gt;&lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/sections.html#the-article-element&quot;&gt;article&lt;/a&gt;&lt;/code&gt; or &lt;code&gt;&lt;a href=&quot;http://www.w3.org/html/wg/drafts/html/master/sections.html#the-section-element&quot;&gt;section&lt;/a&gt;&lt;/code&gt; element.       &lt;code title=&quot;attr-aria-role-banner&quot;&gt;banner&lt;/code&gt; role.&lt;/blockquote&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;XUL&lt;/h3&gt;&lt;br /&gt;XUL &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;label@value&lt;/span&gt;&lt;/span&gt; element now implements text interface (partially). You can obtain a text between offsets but you can't get it by words for example (refer to &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=396166&quot;&gt;bug&lt;/a&gt;). XUL &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;label&lt;/span&gt;&lt;/span&gt; is used wide in Firefox user interface (for example, in Options dialog). Let us know if you have problems with new implementation.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;ATK&lt;/h3&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;RELATION_NODE_PARENT_OF&lt;/span&gt;&lt;/span&gt; has been &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=527461&quot;&gt;implemented&lt;/a&gt;. It's exposed for &lt;a href=&quot;http://www.w3.org/TR/wai-aria/states_and_properties#aria-owns&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;aria-owns&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; markup and XUL trees (used in Thunderbird and Firefox bookmarks).&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Text interface&lt;/h3&gt;&lt;br /&gt;As I &lt;a href=&quot;http://asurkov.blogspot.ru/2013/04/accessible-text-support-in-firefox.html&quot;&gt;wrote before&lt;/a&gt; we started text interface reimplementation. Firefox 22 got improved &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=853340&quot;&gt;getTextAt&lt;/a&gt; and &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855732&quot;&gt;getTextBefore&lt;/a&gt; offsets at word boundaries. Note, in case of getTextAt we had to mimic WebKit behavior rather than follow the ATK spec to keep &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=860013&quot;&gt;Orca working&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Attention. It might be important&lt;/h3&gt;&lt;br /&gt;* &lt;span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;Document load&lt;/span&gt;&lt;/span&gt; event may be fired a bit later than we used to do that, it will be fired right after all events contained in the queue at the time when document got loaded (see &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=852044&quot;&gt;bug&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;* &lt;a href=&quot;http://asurkov.blogspot.ru/2012/12/iserverprovider-implementation-in.html&quot;&gt;IServiceProvider&lt;/a&gt; interface is implemented as a tear off (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=832158&quot;&gt;bug&lt;/a&gt;).&lt;/div&gt;</description>
	<pubDate>Thu, 16 May 2013 05:45:40 +0000</pubDate>
	<author>noreply@blogger.com (Alexander Surkov)</author>
</item>
<item>
	<title>Dave Townsend: Firefox now ships with the add-on SDK</title>
	<guid isPermaLink="false">http://www.oxymoronical.com/?p=1417</guid>
	<link>http://www.oxymoronical.com/blog/2013/05/Firefox-now-ships-with-the-add-on-SDK</link>
	<description>&lt;p&gt;It’s been a long ride but we can finally say it. This week Firefox 21 shipped and it includes the add-on SDK modules.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;We took all the Jetpack APIs and we shipped them in Firefox!&quot; class=&quot;aligncenter&quot; height=&quot;604&quot; src=&quot;http://i.qkme.me/3ue90f.jpg&quot; width=&quot;343&quot; /&gt;What does this mean? Well for users it means two important things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Smaller add-ons. Since they no longer need to ship the APIs themselves add-ons only have to include the unique code that makes them special. That’s something like a 65% file-size saving for the most popular SDK based add-ons, probably more for simpler add-ons.&lt;/li&gt;
&lt;li&gt;Add-ons will stay compatible with Firefox for longer. We can evolve the modules in Firefox that add-ons use so that most of the time when changes happen to Firefox the modules seamlessly shift to keep working. There are still some cases where that might be impossible (when a core feature is dropped from Firefox for example) but hopefully those should be rare.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To take advantage of these benefits add-ons have to be repacked with a recent version of the SDK. We’re &lt;a href=&quot;https://groups.google.com/d/msg/mozilla-labs-jetpack/-nxopO-_gVI/MxZHoOv0ddIJ&quot;&gt;working on a plan&lt;/a&gt; to do that automatically for existing add-ons where possible but developers who want to get the benefits right now can just repack their add-ons themselves using SDK 1.14 and using &lt;code&gt;cfx xpi --strip-sdk&lt;/code&gt;, or using the next release of the SDK, 1.15 which will do that by default.&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 22:31:59 +0000</pubDate>
	<dc:creator>Dave Townsend</dc:creator>
</item>
<item>
	<title>Margaret Leibovic: New Coding Stewards Mailing List</title>
	<guid isPermaLink="true">http://blog.margaretleibovic.com/post/50508579167</guid>
	<link>http://blog.margaretleibovic.com/post/50508579167</link>
	<description>&lt;p&gt;As part of the &lt;a href=&quot;https://wiki.mozilla.org/Contribute&quot;&gt;Grow Mozilla&lt;/a&gt; effort, the &lt;a href=&quot;https://wiki.mozilla.org/Stewards/Coding&quot;&gt;coding stewards&lt;/a&gt; have been working to grow our coding community. Our main focus has been to increase the number of contributions to the core mozilla-central codebase, which includes making it easier for newcomers to get started, as well as keeping existing contributors engaged. Recent work has been focused on things like mentored bugs and recognizing contributors.&lt;br /&gt;&lt;br /&gt;We hold open&lt;a href=&quot;https://wiki.mozilla.org/Stewards/Coding#Weekly_Meeting&quot;&gt; weekly meetings&lt;/a&gt; every Wednesday to discuss progress on these goals, but we want to give more developers the opportunity to get involved with this effort, so we created the &lt;a href=&quot;https://mail.mozilla.org/listinfo/coding-stewards&quot;&gt;coding-stewards@mozilla.org mailing list&lt;/a&gt; for broader discussion. If you’re interested in growing our coding community, but you might not be interested in another weekly meeting, please join the list!&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 18:18:00 +0000</pubDate>
</item>
<item>
	<title>Michael Kaply: Setting Default Application Handlers</title>
	<guid isPermaLink="false">http://mike.kaply.com/?p=1753</guid>
	<link>http://mike.kaply.com/2013/05/15/setting-default-application-handlers/</link>
	<description>&lt;p&gt;
One of the questions I get asked a lot is how to set default application handlers in Firefox (the Applications page in preferences). Most companies have resorted to creating a default mimeTypes.rdf file and loading this into their default profile. I finally took the time to understand how these handlers work and can give you some code to use.
&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1753&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;   var handlerSvc = Components.classes[&quot;@mozilla.org/uriloader/handler-service;1&quot;].getService(Components.interfaces.nsIHandlerService)
  // Change &quot;image/tiff&quot; the mime type you want to set the preference for
  var realMIMEInfo = mimeService.getFromTypeAndExtension(&quot;image/tiff&quot;, &quot;&quot;);

  var file = Components.classes[&quot;@mozilla.org/file/local;1&quot;].createInstance(Components.interfaces.nsIFile);
  // This should be the path to the .app file on Mac or the EXE on Windows
  file.initWithPath(&quot;/Applications/Preview.app&quot;);
  var localHandlerApp = Components.classes[&quot;@mozilla.org/uriloader/local-handler-app;1&quot;].createInstance(Components.interfaces.nsILocalHandlerApp);
  localHandlerApp.executable = file;
  // The name that will be shown in preferences.
  // Not used on Mac
  localHandlerApp.name = &quot;Preview&quot;;
 
  realMIMEInfo.preferredApplicationHandler = localHandlerApp;

  // This says to always use the helper app 
  realMIMEInfo.preferredAction = 2; // useHelperApp
  // This says not to ask
  realMIMEInfo.alwaysAskBeforeHandling = false;

  handlerSvc.store(realMIMEInfo);
&lt;/pre&gt;
&lt;p&gt;You can add this code to your &lt;a href=&quot;http://mike.kaply.com/2012/03/22/customizing-firefox-advanced-autoconfig-files/&quot;&gt;autoconfig file&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 15:16:43 +0000</pubDate>
	<dc:creator>Mike Kaply</dc:creator>
</item>
<item>
	<title>Robert O'Callahan: Travel</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-71141318914133781.post-2465037456913808405</guid>
	<link>http://robert.ocallahan.org/2013/05/travel.html</link>
	<description>&lt;p&gt;Last week I was in California. It was my first time in the Mozilla SF office --- lovely view of the Bay from the roof. I always enjoy the free snacks and I'm always glad we don't have them in Auckland. I spent quality time with some of the people I know and love at Mozilla, and that's always exciting. &lt;/p&gt;&lt;p&gt;On Wednesday and Thursday I was at Half Moon Bay doing LEAD training. It was fun, but thinking about &quot;soft skills&quot; for two days straight is quite draining for me; my social skills are learned, not innate. &lt;/p&gt;&lt;p&gt;This cohort is different from previous cohorts --- most members are relatively new to Mozilla; of our cohort, Vlad and I have been at Mozilla the longest, by far. This gives me the honor and duty of representing the Mozilla old guard. I feel the power of the narrative that has me in the &quot;crusty old engineer, harping about the old days and resisting change&quot; role ... and I do my best to reject it :-). &lt;/p&gt;&lt;p&gt;One of the results of LEAD so far is that I perceive my relationships with other Mozilla staff to be warmer and stronger than they perceive them, on average. I suspect this may be related to the difficulty of maintaining deep relationships with remote employees I see a few times a year at best. I'm still trying to figure that out. &lt;/p&gt;&lt;p&gt;Plane movies: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Gangster Squad&lt;/em&gt;: Genre flick. OK. &lt;/li&gt;&lt;li&gt;&lt;em&gt;Zero Dark Thirty&lt;/em&gt;: Pretty good. Not exactly entertaining, but interesting. &lt;/li&gt;&lt;li&gt;&lt;em&gt;Live And Let Die&lt;/em&gt;: Some kind of cross between a Bond movie, a blaxploitation flick, and the Dukes Of Hazzard. Odd. &lt;/li&gt;&lt;li&gt;&lt;em&gt;The Town&lt;/em&gt;: Genre flick. Slightly better than average. &lt;/li&gt;&lt;li&gt;&lt;em&gt;I, Anna&lt;/em&gt;: Sort of noir-ish psychological thriller. OK. &lt;/li&gt;&lt;li&gt;&lt;em&gt;Les Miserable&lt;/em&gt;: The movie of the musical. Pretty good. I need to read the book sometime. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Interestingly, Air New Zealand &lt;a href=&quot;http://www.airnewzealandife.com/rc/main/may-2013/&quot;&gt;lets you see&lt;/a&gt; what movies they're showing on their routes. This Web interface is a pretty faithful mockup of the actual in-seat interface (which is pretty bad ... it would be great to be able to see more than one movie title at a time). &lt;/p&gt;&lt;p&gt;On Friday I leave for Taiwan for a week at the Mozilla office, a &quot;Web rendering&quot; work week. This should be even more fun than last week.&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 11:58:19 +0000</pubDate>
	<author>noreply@blogger.com (Robert)</author>
</item>
<item>
	<title>Robert O'Callahan: The Direct Route</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-71141318914133781.post-4936057240463809064</guid>
	<link>http://robert.ocallahan.org/2013/05/over-time-ive-become-increasingly.html</link>
	<description>&lt;p&gt;Over time I've become increasingly impressed with the broad applicability of &lt;a href=&quot;http://www.biblegateway.com/passage/?search=Matthew%2018&amp;amp;version=NIV&quot;&gt;Matthew 18:15-17&lt;/a&gt;: &lt;/p&gt;&lt;blockquote&gt;If your brother or sister sins, go and point out their fault, just between the two of you. If they listen to you, you have won them over. But if they will not listen, take one or two others along, so that ‘every matter may be established by the testimony of two or three witnesses.’ If they still refuse to listen, tell it to the church; and if they refuse to listen even to the church, treat them as you would a pagan or a tax collector.&lt;/blockquote&gt;&lt;p&gt;The first step is often difficult but crucial. The path of least resistance can be to go behind your antagonist's back --- to your friends, or their friends, or their manager. I've seen all kinds of negative consequences from following that path --- hurt, distrust, unnecessary escalation, confusion and fear. I feel my integrity depends on people knowing that whatever I say about them to others, they will not be surprised by because they've already heard it from me. &lt;/p&gt;&lt;p&gt;This applies in the other direction too, when people complain about third parties to me. If the third party is unaware of the issue, I don't want to know --- go away and talk to them first. &lt;/p&gt;&lt;p&gt;There are rare exceptions, usually involving time-critical emergencies or complex secrecy requirements.&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 11:20:13 +0000</pubDate>
	<author>noreply@blogger.com (Robert)</author>
</item>
<item>
	<title>Brandon Savage: Dealing with duplicated code</title>
	<guid isPermaLink="false">http://www.brandonsavage.net/?p=2460</guid>
	<link>http://www.brandonsavage.net/dealing-with-duplicated-code/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=dealing-with-duplicated-code</link>
	<description>We’ve all seen it: we’re working along, and we come across code that just has a feel to it. It’s like déjà vu. You’ve seen this code before. You open another file – sure enough, there it is. The same code. Almost line for line. In large code bases, it’s likely that there are dozens [...]</description>
	<pubDate>Wed, 15 May 2013 11:00:31 +0000</pubDate>
	<dc:creator>Brandon Savage</dc:creator>
</item>
<item>
	<title>Nikhil Marathe: Your Jabber ID as your Persona identity</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3665064696228706104.post-1002504104695809623</guid>
	<link>http://blog.nikhilism.com/2013/05/your-jabber-id-as-your-persona-identity.html</link>
	<description>&lt;p&gt;&lt;em&gt;(This is NOT an official Mozilla project and does not in any way reflect the views of my employer.)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://login.persona.org/about&quot;&gt;Mozilla Persona&lt;/a&gt; is a way for users to use their e-mail ID as their identity on the web. While cool, it will only really take off when existing services that people use become Identity Providers. XMPP (Jabber) is a widely deployed IM protocol whose IDs look like e-mail and it is a secure, federated system in alignment with Persona’s goals. I thought it would be really cool if I could log in to Persona enabled sites using Jabber IDs. I’d like to announce &lt;a href=&quot;https://github.com/nikhilm/browserid-xmpp&quot;&gt;browserid-xmpp&lt;/a&gt; which does just that.&lt;/p&gt; &lt;p&gt;It should work with any XMPP server that supports components and BOSH. That said I have only tested it on my VPS (with Prosody, ejabberd and Openfire), so any issues and pull requests are welcome, as is a quick comment if you deploy it on your server. You’ll also need a relatively sophisticated web server like Apache or nginx to serve the browserid file with the right Content-Type. &lt;a href=&quot;https://checkmyidp.org&quot;&gt;CheckMyIdP&lt;/a&gt; is a great way to check if everything is setup properly.&lt;/p&gt; &lt;p&gt;browserid-xmpp is two things. The first is a XMPP component that can plug into any XMPP server and answer a certificate signing query. This is a fork of the “official” &lt;a href=&quot;https://github.com/mozilla/browserid-certifier&quot;&gt;browserid-certifier&lt;/a&gt; with an Jabber-RPC front-end rather than a web service.&lt;/p&gt; &lt;p&gt;The second is the set of provisioning and sign in pages that can be re-used by any domain. The authentication is handled as a two stage process using BOSH. This was my first experience with BOSH and it is ridiculously cool how it works and supports session hand-off to another page, without which this would not be possible. On the sign in page, an XMPP stream is established and authentication is done using standard XMPP authentication. The established BOSH stream has a session ID and every message sent has an incrementing request ID. On successful sign in, the sign in page sticks these two, along with the JID into &lt;code&gt;sessionStorage&lt;/code&gt;. The provisioning page reads these out and ‘attaches’ to the existing BOSH stream. Due to the unpredictable nature of the SID and RID, there is a reasonable guarantee that someone who attached to the stream successfully knew about the stream before. The provisioning page then makes a Jabber-RPC call over the same stream to the XMPP component. This call is performed on behalf of the JID and a certificate is sent back to the browser. You are now signed in!&lt;/p&gt; &lt;p&gt;P.S. I’d like to thank Cory Benfield for an &lt;a href=&quot;http://lukasa.co.uk/2013/04/Writing_A_Persona_Identity_Provider/&quot;&gt;excellent guide&lt;/a&gt; to writing an IdP.&lt;/p&gt; &lt;p&gt;P.P.S. This post was published right before a 12-hour plane ride, so I’ll be back for tech support in a while.&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 09:45:38 +0000</pubDate>
	<author>noreply@blogger.com (Nikhil)</author>
</item>
<item>
	<title>Benjamin Kerensa: We should keep Firefox as default browser in Ubuntu</title>
	<guid isPermaLink="false">http://benjaminkerensa.com/?p=1770</guid>
	<link>http://feedproxy.google.com/~r/BenjaminKerensaDotComMozilla/~3/E_d6B_Lmhn8/we-should-keep-firefox</link>
	<description>&lt;p&gt;&lt;a class=&quot;thickbox no_icon&quot; href=&quot;http://static.benjaminkerensa.com/wp-content/uploads/2013/05/firefox_logo-only_RGB-300dpi.jpg&quot; title=&quot;firefox logo only RGB 300dpi 300x287 We should keep Firefox as default browser in Ubuntu&quot;&gt;&lt;img alt=&quot;firefox logo only RGB 300dpi 300x287 We should keep Firefox as default browser in Ubuntu&quot; class=&quot;aligncenter size-medium wp-image-1777&quot; height=&quot;287&quot; src=&quot;http://static.benjaminkerensa.com/wp-content/uploads/2013/05/firefox_logo-only_RGB-300dpi-300x287.jpg&quot; title=&quot;We should keep Firefox as default browser in Ubuntu&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think that Firefox should stay as the default browser in Ubuntu for the following reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mozilla has a vibrant open source community and many of our contributors are active in both Ubuntu and Mozilla.&lt;/li&gt;
&lt;li&gt;Mozilla’s mission is to &lt;a href=&quot;http://www.mozilla.org/en-US/mission/&quot;&gt;promote openness, innovation and opportunity&lt;/a&gt; and Firefox encompasses all of those goals.&lt;/li&gt;
&lt;li&gt;Chromium as a package has &lt;a href=&quot;http://askubuntu.com/a/159487&quot; target=&quot;_blank&quot;&gt;fell behind in the past&lt;/a&gt; while Firefox has team of &lt;a href=&quot;https://wiki.ubuntu.com/MozillaTeam&quot;&gt;contributors in the Ubuntu Community&lt;/a&gt; who keep it up-to date every cycle.&lt;/li&gt;
&lt;li&gt;Firefox is perhaps one of the &lt;a href=&quot;http://marketshare.hitslink.com/report.aspx?qprid=1&quot;&gt;most popular&lt;/a&gt; open source browsers.&lt;/li&gt;
&lt;li&gt;And most importantly in my opinion Mozilla by default respects &lt;a href=&quot;http://blog.mozilla.org/blog/2013/04/02/firefox-gives-you-more-control-over-your-privacy/&quot;&gt;user privacy&lt;/a&gt; and choice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why fix something if it’s not broken? If others &lt;a href=&quot;http://summit.ubuntu.com/uds-1305/meeting/21788/foundations-1305-chromium-default-browser/&quot;&gt;prefer Chromium&lt;/a&gt; well then “sudo apt-get install chromium-browser” and I guess that’s just my two-cents on the topic.&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/BenjaminKerensaDotComMozilla/~4/E_d6B_Lmhn8&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 15 May 2013 07:49:48 +0000</pubDate>
	<dc:creator>Benjamin Kerensa</dc:creator>
</item>
<item>
	<title>Jared Wein: Firefox OS – The Web is the Platform</title>
	<guid isPermaLink="false">http://msujaws.wordpress.com/?p=3210</guid>
	<link>http://msujaws.wordpress.com/2013/05/14/firefox-os-the-web-is-the-platform/</link>
	<description>&lt;p&gt;This past Monday I gave a presentation at the Mobile Monday Detroit meeting about Firefox OS. Thanks to &lt;a href=&quot;http://www.techsmith.com/camtasia-relay.html&quot;&gt;some great screen recording software by TechSmith&lt;/a&gt;, I also recorded it &lt;img alt=&quot;:)&quot; class=&quot;wp-smiley&quot; src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; /&gt; &lt;/p&gt;
&lt;span class=&quot;embed-youtube&quot; style=&quot;text-align: center; display: block;&quot;&gt;&lt;/span&gt;
&lt;p&gt;I’ve also made &lt;a href=&quot;http://msuja.ws/momo13&quot;&gt;the slides available online&lt;/a&gt; for those who just want to read (press ‘s’ on your keyboard to see my speaker notes, you may have to allow pop-ups).&lt;/p&gt;
&lt;p&gt;Mobile Monday Detroit is a monthly meetup that gets people together to talk about activity in the mobile space. Many topics cover Android and iOS, so it was really cool to snag a spot on the podium and give a talk about one of the ‘alternative’ operating systems. Also presenting this week was Randy Nunez from Ford who gave a talk about the various open source mobile operating systems and Chris Peplin from Ford who talked about the Open XC API for cars that Ford is working on.&lt;/p&gt;
&lt;p&gt;If you live in southeast Michigan you should try to make it out to one of the meetings. More information can be found at &lt;a href=&quot;http://www.meetup.com/Mobile-Monday-Detroit/&quot;&gt;the Mobile Monday Detroit Meetup page&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt; Tagged: &lt;a href=&quot;http://msujaws.wordpress.com/tag/detroit/&quot;&gt;detroit&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/firefox/&quot;&gt;firefox&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/firefoxos/&quot;&gt;firefoxos&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/mozilla/&quot;&gt;mozilla&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/planet-mozilla/&quot;&gt;planet-mozilla&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/presentation/&quot;&gt;presentation&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/msujaws.wordpress.com/3210/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/msujaws.wordpress.com/3210/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=msujaws.wordpress.com&amp;amp;blog=5511932&amp;amp;post=3210&amp;amp;subd=msujaws&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 15 May 2013 00:27:29 +0000</pubDate>
	<dc:creator>msujaws</dc:creator>
</item>
<item>
	<title>Lloyd Hilaiel: What Is Persona?</title>
	<guid isPermaLink="true">http://lloyd.io/what-is-persona</guid>
	<link>http://lloyd.io/what-is-persona</link>
	<description>&lt;p&gt;I've worked on the Persona service for over two years now.
My involvement began on a fateful airplane ride with the &lt;a href=&quot;http://www.open-mike.org/entry/verified-email-protocol&quot;&gt;father of the specification&lt;/a&gt; that would become Persona.
Shortly after, on April 6th 2011 I made the &lt;a href=&quot;https://github.com/mozilla/browserid/commit/1aa343&quot;&gt;first commit&lt;/a&gt;.
On July 1st 2011 &lt;a href=&quot;http://open-mike.org&quot;&gt;Mike Hanson&lt;/a&gt; and I had built a prototype, made some decisions, and &lt;a href=&quot;http://lloyd.io/how-browserid-works&quot;&gt;I wrote a post on what it is and how it works&lt;/a&gt;.
Shortly after, &lt;a href=&quot;http://adida.net&quot;&gt;Ben Adida&lt;/a&gt; joined me and we began carefully hiring wonderful people.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We've come a long way: over 20 people &lt;a href=&quot;https://github.com/mozilla/browserid/contributors&quot;&gt;directly contribute to persona&lt;/a&gt; on a regular basis,  it's supported by a community of thousands, and it's got an extremely hopeful growth curve.
The striking thing, the subject of this post, is how &lt;em&gt;Persona has always been guided by a consistent and clear vision&lt;/em&gt;.
The community passionately defends this vision, they know when a feature or change does not fit the vision, and despite being separated by continents and cultures - I believe this vision is what has held the project together and let it grow into what it is today:  An audacious attempt to change the world that actually has legs - an attempt to kill the password, to keep people safer, and to make trying new things online fun again.&lt;/p&gt;
&lt;p&gt;So what is this vision?
How succinctly can it be expressed?
Let's find out: this post is my personal attempt to express the Persona vision.
I would love to know how others find this, whether those who really care about Persona would empasize the same points.&lt;/p&gt;</description>
	<pubDate>Wed, 15 May 2013 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Christian Heilmann: A few questions and answers about “mobile web” and sites vs. apps</title>
	<guid isPermaLink="false">http://christianheilmann.com/?p=3456</guid>
	<link>http://christianheilmann.com/2013/05/15/a-few-questions-and-answers-about-mobile-web-and-sites-vs-apps/</link>
	<description>&lt;p&gt;I just got asked to provide a few answers for a survey amongst “mobile web experts” and thought it’d be good to re-use those here. So here goes:&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;What is the difference between a web site and a web application?&lt;/h3&gt;&lt;br /&gt;
There are a few differences. On a very basic level applications are catered for doing things whereas web sites are more catered for offering content for consumption. Web sites started as structured, interlinked academical documents. Later on we added multimedia content to make them much more engaging but all in all they are fixed in their state.&lt;br /&gt;
Applications are more dynamic. They allow for customisation of the interface and store the state of what happens so that when you get back to it you can go on from where you left off.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;The use case of an app should always be to do something with it. This could be as simple as voting on a how much you like a kitten photo and go as far as editing video content live in your browser or on your device. Basic examples would be a webmail client as an application and a pure image gallery to click through as a web site.&lt;/p&gt;

	&lt;p&gt;Web sites are static whereas web applications have atomic updates and in of themselves have a very small footprint as most of the content gets loaded subsequently and changes every time you use it.&lt;/p&gt;

	&lt;p&gt;All in all it is a sliding scale though as for example an image gallery can easily become an application if it allows you to upload your own images or edit and remix the existing ones in your browser. That is one of the main benefits of web technology – it is very flexible and allows for quick and simple changes to the final product without being hindered by a complex compilation, packaging and deployment process.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;What kind of features should a web site have to be qualified as a web application?&lt;/h3&gt;&lt;br /&gt;
Again, there are many things to consider. One main thing is that an app does one thing and one thing well. It is there to help you do something.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;Technically it should behave like the fat client apps of old: it should retain my state and settings, allow me to customise the interface to my needs and it needs to work offline. The latter is not a technical necessity in terms of definition but to me crucial usability. Seeing how flaky our connections are – I am writing this on a plane – our apps should make people as effective as possible and this means we shouldn’t be dependent on a connection. The interface should be usable whilst we are off the grid and sync as soon as we go online.&lt;/p&gt;

	&lt;p&gt;Customisation and personalisation of the interface and interactivity to me make an application. This could just mean a game where I can change my character and get extras the more I play. A proper “web” application to me also should use the web whenever it can. For example I am very frustrated with playing a game on my phone and when I go to my tablet playing the same game my score and achievements aren’t synced although the device knows who I am. Why be online then?&lt;/p&gt;

	&lt;p&gt;A lot of badly designed web apps are just wrappers for content like a news feed. For example turning a blog into an app is a pointless exercise. It just adds the overhead of having to install the wrapper, update and uninstall it when I am fed up with the blog but doesn’t give me the “do something” part that defines an app.&lt;/p&gt;

	&lt;p&gt;If I don’t interact with it other than reading there is no point in making it an app. You lose a lot of the flexibility of the web when packaging &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; as native apps with the most important thing being opaque updates. An app that is hosted on the web can be patched and upgraded without the end user having to download megabytes of data. That is incredibly useful on slow or flaky connections. Instead of the whole app you only download the changes.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;What is the difference between a mobile-friendly site and a mobile web app?&lt;/h3&gt;&lt;br /&gt;
A mobile-friendly site is a web site that detects the capabilities of the device it is displayed on and doesn’t make assumptions about how big my screen is and that I have a mouse and keyboard or not. It runs in the browser of the device and is thus hindered by its limitations – which in the case of older Android devices are quite limited indeed. It caters to the mobile space in terms of display changes – single column display, larger fonts, larger buttons.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;A mobile web app is an application built with web technologies running in an own, full-screen wrapper and not inside a browser. It takes advantage of all the things the current environment allows for. For example it stores content and itself locally instead of having to be online and requesting everything new every time you open it. It can access the special features of certain environments like swipe gestures, accelerometer for interaction or accessing the camera to get content in. Its purpose is for me to do things with it and not just visit it like I visit a web site.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;What would you consider is the key feature that made &lt;span class=&quot;caps&quot;&gt;HTML5 &lt;/span&gt;(as opposed to Flash and Java) the number 1 choice for developing mobile web apps?&lt;/h3&gt;&lt;br /&gt;
Flexibility is the super power of &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt;. It is easy to make an &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; app adapt to a new environment and to make an interface that shows and hides content and functionality dependent on the capability of the device or environment. Both Java and Flash are not “web native”, meaning you need to initiate and execute an own code environment inside a browser before you see the results. This hinders interactivity of the containing document and the content of the Flash movie or Java Applet. Whilst both Java and Flash have incredibly good development tools and capabilities once they are available they are very demanding to the hardware they run on. That’s why iOS devices don’t have Flash. There is already a fully capable environment available – the browser – and executing another one inside it means using a lot of resources. On mobile devices this means shorter battery life and the device heating up quickly.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;With &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; we have the opportunity to improve what mobile, web enabled devices already have to have – a browsing environment. These are available open source and for free (Firefox, Chromium and others) and developers can build apps without needing to sign up for one company and get their &lt;span class=&quot;caps&quot;&gt;SDK&lt;/span&gt; to get started.&lt;/p&gt;

	&lt;p&gt;All environments have their uses and there are things that are better done in Flash than in &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt;. Betting on open technologies and browsers means though that you are very likely to be flexible enough to cater to the next environment around the corner. The web has always evolved and mutated around the needs of the market. That’s why multimedia in &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; is just another element of the document and not a black hole that can not interact with the rest of the browser or the document.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Where would you say the mobile web is heading? Do you see a future for the mobile web?&lt;/h3&gt;&lt;br /&gt;
There is no mobile web. There is the web. Right now we start consuming it more and more on mobile devices. That is cool. And the web is totally ready for that as it is flexible enough to adapt.&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;If you use web standard technologies to build applications that expect a certain device, a fixed size of a screen, a special way of user interaction or expect a fast connection you are building a very limited and very quickly outdated piece of software.&lt;/p&gt;

	&lt;p&gt;Over the last years we should have learned that hardware is a commodity and susceptible to very sudden change. An amazing piece of hardware that is the hot new thing now can tomorrow be embarrassingly outdated.&lt;/p&gt;

	&lt;p&gt;When you build your web apps to only cater for that you try to be native code and that is a race you can not win. A lot of native apps are built to promote a new piece of hardware and to get people to upgrade. That is a very old technique of selling more products called in-built obsolescence.&lt;/p&gt;

	&lt;p&gt;Web apps should be beyond this. Our job is to give end users the best possible experience on the current devices but not make them a necessity. We did this mistake in the past which is why you see web applications that tell you that you need a “modern browser like Internet Explorer 6” and “at least 800×600 resolution”.&lt;/p&gt;

	&lt;p&gt;Native apps on high-end devices are doing really well right now, but I can foresee that people will get bored of having to buy a new phone every year just to get new functionality that is not that important when you consider the cost. The web will stay and always be the open alternative for those who want to consume and create on their own terms instead of being dependent on the success or goals of a certain company.&lt;/p&gt;
 &lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/chrisheilmann/~4/sFxTlNSMCa4&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 14 May 2013 23:00:28 +0000</pubDate>
	<dc:creator>Chris Heilmann</dc:creator>
</item>
<item>
	<title>Justin Wood: SeaMonkey 2.18 – Where are you?</title>
	<guid isPermaLink="false">http://blog.drapostles.org/?p=95</guid>
	<link>http://blog.drapostles.org/archives/95</link>
	<description>&lt;p&gt;Hey Everyone,&lt;/p&gt;
&lt;p&gt;So SeaMonkey 2.18 was supposed to be out today, so where is it?&lt;/p&gt;
&lt;p&gt;We have had a hardware error in the systems that allow us to reliably generate the release — Without these systems anything we create will be of unknown quality/stability.&lt;/p&gt;
&lt;p&gt;In order to meet our own quality and stability requirements we &lt;strong&gt;are NOT releasing SeaMonkey 2.18&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;While there is a chance we could have these systems back up in time to do an intermediate release (say something corresponding to a possible Gecko 21.0.1) we can not promise nor plan for it at this time.&lt;/p&gt;
&lt;p&gt;We are actively working on repairing the system and its data, once that is complete we will go forth with a new BETA based on the SeaMonkey 2.19 train, and we expect to release &lt;strong&gt;SeaMonkey 2.19 on time, on June 25′th&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We thank you for your understanding.&lt;/p&gt;</description>
	<pubDate>Tue, 14 May 2013 22:22:06 +0000</pubDate>
	<dc:creator>Callek</dc:creator>
</item>
<item>
	<title>Aza Raskin: Psychological Pitfalls And Lessons of A Designer-Founder</title>
	<guid isPermaLink="false">http://www.azarask.in/blog/?p=1451</guid>
	<link>http://www.azarask.in/blog/post/psychological-pitfalls-and-lessons-of-a-designer-founder/</link>
	<description>&lt;p&gt;It’s an exceptional time to be a product person and a founder: we are collectively responsible for—and a part of—inventing the future. In the last ten years, design has changed the face of consumer electronics. That change has impacted the way we live, from how we communicate to how we get around.&lt;/p&gt;
&lt;p&gt;I started Massive Health as a designer and a founder. These are the most important lessons and psychological pitfalls I learned. They apply to any founder or manager who is also a creative.&lt;/p&gt;
&lt;h4&gt;Your Job Isn’t To Make A Great Product&lt;/h4&gt;
&lt;p&gt;As a founder, your job isn’t to make a great product. It’s to build a great team that makes great products. You are who you hire.&lt;/p&gt;
&lt;p&gt;If you love doing something, under no condition should you start a VC-backed company to do more of it. You won’t. You are going to spend all of your time recruiting, fundraising, recruiting, aligning team vision, recruiting, and figuring out which fires you can safely ignore.&lt;span id=&quot;more-1451&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To maintain your psychological health, you’ll need to learn how to shift the fufillment you get from making to the fufillment of enabling a team to make. You’ll be making vicariously, not making directly. You’ll have to come to terms and internalize it or else your lack of emotional fufillment will trickle down to your team.&lt;/p&gt;
&lt;p&gt;Very early on, you’ll be able to make stuff. Enjoy it. It won’t last. In fact, making stuff as your team grows is often more harmful than helpful.&lt;/p&gt;
&lt;h4&gt;The Dangers of “Helping” &amp;amp; The Power of Words&lt;/h4&gt;
&lt;p&gt;Because you will spend your time building a great team that builds great product, the moments that you directly work on product will be rare. The rarity will make it insanely tempting—and it will feel insanely good—to get your hands dirty by fixing an interaction flow, pushing around some pixels, doing an information re-architecture, or whatever you may be passionate about. Here’s the thing: that can be insanely disruptive unless handled carefully.&lt;/p&gt;
&lt;p&gt;Here’s why:&lt;/p&gt;
&lt;h5&gt;1&lt;/h5&gt;
&lt;p&gt; You are a founder, which means each word you say lands like an anvil. Even in a very small company, and especially in a larger one, it takes fortitude and courage for a team member to honestly critique your work. The courage required isn’t a one-time cost. It’s incurred every single time. By nature of being a founder, you are used to saying things with charisma and force and you will undoubtedly be excited by your solution and argue for it. This just makes it worse. A final note: it doesn’t matter how nice you are, or how close you are to your team. As a founder, your words are always more powerful than you think.
&lt;/p&gt;&lt;h5&gt;2&lt;/h5&gt;
&lt;p&gt;It’s easy for a brainstorm to be taken as direction. I talked to &lt;a href=&quot;http://en.wikipedia.org/wiki/Tony_Fadell&quot;&gt;Tony Fadell&lt;/a&gt; of Nest and iPod fame about this topic: To this day, in every conversation he has—every—he tries to reiterate whether he is brainstorming or setting direction. Putting this into practice, you’ll feel like you are repeating yourself. That everyone gets it. Don’t stop. Keep saying it. Get used to saying it.&lt;/p&gt;
&lt;h5&gt;3&lt;/h5&gt;
&lt;p&gt;When you swoop in to help with complex problems, the person working on the problem has all the context and knows the pitfalls. You’ve hired this person because they are amazing at their job. Jumping in and then advocating for your ideas is often interpreted as a lack of trust in their ability. This can be a huge morale drain. Not only that, but your suggestions may be shortsighted. You’re jumping in—they’re living it.&lt;/p&gt;
&lt;p&gt;You are a founder because of your vision and ability. Your input is, in fact, critical.&lt;/p&gt;
&lt;p&gt;So what should you do? Define the problem and its constraints. Framing the problem is the most important step in helping your team find the right solution. You can and should point out what’s wrong with a design or product (sandwiching it with praise), just don’t prescribe how to fix it. Never give a solution unless a team member comes to you for help.&lt;/p&gt;
&lt;h4&gt;Hype can be psychologically compromising&lt;/h4&gt;
&lt;p&gt;Massive Health launched with a fair amount of hype. We were glad for it—it gave us good brand recognition while hiring, which is the most valuable outcome of PR for a pre-launch startup. But, it’ll hurt in ways you aren’t expecting. Think back to Color and how the hype overshadowed their product; it set expectations so high that whatever they made probably wouldn’t be good enough. When their product launched, the market thrashed them. That’s the obvious way hype hurts, and it’s not even the one I’m talking about.&lt;/p&gt;
&lt;p&gt;The more subtle (and more damaging) way that hype hurts is psychologically. The hype nestled in the back of your mind is constantly tugging, saying that your product is never good enough to launch. That it isn’t big enough. That it isn’t ground-breaking enough.&lt;/p&gt;
&lt;p&gt;The single most important thing a founder has to know is where to focus his team’s energy: what is and isn’t safe to ignore, which shortcuts are helpful or harmful, and where and when to invest in absolute perfection. &lt;/p&gt;
&lt;p&gt;Hype compromises that ability.&lt;/p&gt;
&lt;p&gt;Looking back, this was a major factor in launching only one of the awesome products we were working on at Massive. As a founder, I let perfect be the enemy of the good.&lt;/p&gt;
&lt;h4&gt;Ego And Reputation&lt;/h4&gt;
&lt;p&gt;A corollary to the psychological pressure of hype is ego. All product people learn the painful process of divorcing ideas from ego. That’s how great products are made. As a founder, you’ll have to learn how to divorce your ego from your company’s success.&lt;/p&gt;
&lt;p&gt;You’ll live with knowing that you are personally judged based upon your company’s performance. That your reputation is tied to your company’s reputation. You’ll no longer be judged on your own work, but your team’s work. It will make you want to get too directly involved in the design. And, as we know, that’s dangerous.&lt;/p&gt;
&lt;p&gt;Early on at Massive Health, I did not articulate these worries clearly or directly. It was just a fuzzy haze of emotion that confused my decision-making. Once I was able to articulate what was going on, it helped me mitigate its effects.&lt;/p&gt;
&lt;p&gt;Be aware that ego can and will get in the way and be ready to fight it.&lt;/p&gt;
&lt;h3&gt;So Being A Designer and A Founder Sucks?&lt;/h3&gt;
&lt;p&gt;Not at all. It gives you huge strategic advantages. The Designer Fund &lt;a href=&quot;http://designerfund.com/&quot;&gt;articulates that well&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I founded Massive Health because there was a storm brewing: just over the horizon health was about to become consumerized; that quantified self would escape its geeky beginings and morph to become mainstream; that the Apples and Googles of consumer health didn’t yet exist but were about to. At the center of it all was design; and that design-focus is enabling us, now as a part of Jawbone, to invent the future.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=GD6qtc2_AQA&quot;&gt;The more you know&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.azarask.in/blog/post/be-a-designer/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: So You Want To Be A Designer: Top 5 List&quot;&gt;So You Want To Be A Designer: Top 5 List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.azarask.in/blog/post/massive-health-funded-hiring/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Massive Health: Raised Money, Spending On New Hires&quot;&gt;Massive Health: Raised Money, Spending On New Hires&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 14 May 2013 19:23:43 +0000</pubDate>
	<dc:creator>Aza Raskin</dc:creator>
</item>
<item>
	<title>Alon Zakai: The Elusive Universal Web Bytecode</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-2681864008001569004.post-8107853398310775644</guid>
	<link>http://mozakai.blogspot.com/2013/05/the-elusive-universal-web-bytecode.html</link>
	<description>It's often said that the web needs a bytecode. For example, &lt;a href=&quot;http://arstechnica.com/information-technology/2013/05/are-video-codecs-written-in-javascript-really-the-future/?comments=1&amp;amp;post=24430209#comment-24430209&quot;&gt;the very first comment in a very recent article on video codecs on the web&lt;/a&gt; says&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;A proper standardized bytecode for browsers would (most likely) allow  developers a broader range of languages to choose from as well as hiding  the source code from the browser/viewer (if that's good or not is  subjective of course).&lt;/blockquote&gt; And other comments continue with&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;Just to throw a random idea out there: LLVM bytecode. That  infrastructure already exists, and you get to use the ton of languages  that already have a frontend for it (and more in the future, I'm sure).&lt;br /&gt;[..]&lt;br /&gt;I also despise javascript as a language and wish someone would hurry up  replacing it with a bytecode so we can use decent languages again.&lt;br /&gt;[..]&lt;br /&gt;Put a proper bytecode engine in the browser instead, and those people  that love javascript for some unknowable reason could still use it, and  the rest of us that use serious languages could use them too.&lt;br /&gt;[..]&lt;br /&gt;Honestly, .Net/Mono would probably be the best bet. It's mature, there  are tons of languages targeting it, and it runs pretty much everywhere  already as fast as native code&lt;/blockquote&gt;Ignoring the nonproductive JS-hating comments, basically the point is that people want to use various languages on the web, and they want those languages to run fast. Bytecode VMs have been very popular since Java in the 90's, and they show that multiple languages can run in a single VM while maintaining good performance, so asking for a bytecode for the web seems to make sense at first glance.&lt;br /&gt;&lt;br /&gt;But already in the quotes above we see the first problem: Some people want one bytecode, others want another, for various reasons. Some people just like the languages on one VM more than another. Some bytecode VMs are proprietary or patented or tightly controlled by a single corporation, and some people don't like some of those things. So we don't actually have a &lt;b&gt;candidate&lt;/b&gt; for a single universal bytecode for the web. What we have is a hope for an ideal bytecode - and multiple potential candidates.&lt;br /&gt;&lt;br /&gt;Perhaps though not all of the candidates are relevant? We need to pin down the criteria for determining what is a &quot;web bytecode&quot;. The requirements as mentioned by those requesting it include&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Support all the languages&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;/b&gt;&lt;li&gt;&lt;b&gt;Run code at high speed &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;To those we can add two additional requirements that are not mentioned in the above quotations, but are often heard: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Be a convenient compiler target&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Have a compact format for transfer&lt;/b&gt; &lt;/li&gt;&lt;/ul&gt;In addition we must add the requirements that anything that runs on the web must fulfill,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Be standardized&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;/b&gt;&lt;li&gt;&lt;b&gt;Be platform-independent&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;/b&gt;&lt;li&gt;&lt;b&gt;Be secure&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;JavaScript can already do the last three (it's already on the web, so it has to). Can it do the first four? I would say yes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Support all the languages: &lt;/b&gt;A &lt;a href=&quot;https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS&quot;&gt;huge list of languages&lt;/a&gt; can compile into JavaScript, and that includes major ones like C, C++, Java, C#, LLVM bytecode, and so forth. There are some rough edges - often porting an app requires changing some amount of code - but nothing that can't be improved on with more work, if the relevant communities focus on it. C++ compilers into JavaScript like &lt;a href=&quot;http://emscripten.org/&quot;&gt;Emscripten&lt;/a&gt; and &lt;a href=&quot;http://mandreel.com/&quot;&gt;Mandreel&lt;/a&gt; have years of work put into them and are fairly mature (for example see the &lt;a href=&quot;https://github.com/kripken/emscripten/wiki&quot;&gt;Emscripten list of demos&lt;/a&gt;). &lt;a href=&quot;https://developers.google.com/web-toolkit/&quot;&gt;GWT&lt;/a&gt; (for Java) has likewise been used in production for many years; the situation for C# is perhaps not quite as good, but improving, and even things like &lt;a href=&quot;http://vps2.etotheipiplusone.com:30176/redmine/projects/emscripten-qt/wiki/Demos&quot;&gt;Qt&lt;/a&gt; can be compiled into JavaScript. For C#, Qt, etc., it really just depends on the relevant community being focused on the web as one of its targets: We know how to do this stuff, and we know it can work.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Run code at high speed: &lt;/b&gt;It turns out that C++ compiled to JavaScript can run at &lt;a href=&quot;http://kripken.github.io/mloc_emscripten_talk/#/27&quot;&gt;about half the speed of native code&lt;/a&gt;, which in some cases &lt;a href=&quot;http://j15r.com/blog/2013/04/25/Box2d_Revisited&quot;&gt;outperforms Java&lt;/a&gt;, and is &lt;a href=&quot;https://blog.mozilla.org/luke/2013/03/21/asm-js-in-firefox-nightly/&quot;&gt;expected to get better still&lt;/a&gt;. Those numbers are when using the &lt;a href=&quot;http://asmjs.org/&quot;&gt;asm.js&lt;/a&gt; subset of JavaScript, which basically structures the compiler output into something that is easier for a JS engine to optimize. It's still JavaScript, so it runs everywhere and has full backwards compatibility, but it can be run at near-native speed already today.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Be a convenient compiler target:&lt;/b&gt; First of all, the long list of languages from before shows that many people have successfully targeted JavaScript. That's the best proof that JavaScript is a practical compiler target. Also, there are many languages that compile into either C or LLVM bytecode, and we have more than one compiler capable of compiling those to the web, and one of them is open source, so all those languages have an easy path. Finally, while compiling into a &quot;high-level&quot; language like JavaScript is quite convenient, there are downsides, in particular the lack of support for low-level control flow primitives like goto; however, this is addressed by reusable open source libraries like the &lt;a href=&quot;https://github.com/kripken/emscripten/tree/master/src/relooper&quot;&gt;Relooper&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Have a compact format for transfer:&lt;/b&gt; It seems intuitive that a high-level language like JavaScript cannot be compact - it's human-readable, after all. But it turns out though that JS as a compiler target is&lt;a href=&quot;http://mozakai.blogspot.com/2011/11/code-size-when-compiling-to-javascript.html&quot;&gt; already quite small&lt;/a&gt;, in fact comparable to native code when both are gzipped. Also, even in the largest and most challenging examples, like &lt;a href=&quot;http://www.unrealengine.com/html5/&quot;&gt;Unreal Engine 3&lt;/a&gt;, the time spent to parse JS into an AST does not need to be high. For example, in that demo it takes just 10 seconds on my machine to both parse &lt;b&gt;and&lt;/b&gt; fully optimize the output of over 1 million lines of C++ (remember that much of that optimization time would need to be done no matter what format the code is in, because it has to be a portable one). &lt;/li&gt;&lt;/ul&gt;So arguably &lt;b&gt;JavaScript is already very close to providing what a bytecode VM is supposed to offer&lt;/b&gt;, as listed in the 7 requirements above. And of course this is not the first time that has been said, see &lt;a href=&quot;http://www.aminutewithbrendan.com/pages/20101122&quot;&gt;here&lt;/a&gt; for a previous discussion from November 2010. In the 2.5 years since that link, the case for that approach has gotten significantly stronger, for example, JavaScript's performance on compiled code has improved substantially, and compilers to JavaScript can compile very large C++ applications like Unreal Engine 3, both as mentioned before. At this point the main missing pieces are, first (as already mentioned) improving language support for ones not yet fully mature, and second, a few platform limitations that affect performance, notably lack of SIMD and threads with shared state.&lt;br /&gt;&lt;br /&gt;Can JavaScript fill the gaps of SIMD and mutable-memory threads? Time will tell, and I think these things would take significant effort, but I believe it is clear that to standardize them would be orders of magnitude simpler and more realistic than to standardize a completely new bytecode. So a bytecode has no advantage there.&lt;br /&gt;&lt;br /&gt;Some of the motivation for a new bytecode appears to come from an &lt;b&gt;elegance&lt;/b&gt; standpoint: &quot;JavaScript is hackish&quot;, &quot;asm.js is a hack&quot;, and so forth, but a new from-scratch bytecode would be (presumably) a thing of perfection. That's an understandable sentiment, but technology has plenty of such things, witness the persistence of x86, C++, and so forth (some would add imperative programming to that list). It's not only true of technology but human civilization as well, for example no natural language has the elegance of Esperanto, and our currently-standing legal and political systems are far from what a from-scratch redesign would arrive at. But large long-standing institutions are easier to improve continuously rather than to completely replace. I think it's not surprising that that's true for the web as well.&lt;br /&gt;&lt;br /&gt;(Note that I'm not saying we shouldn't try. We should. But we shouldn't stop trying at the same time to also improve the current situation in a gradual way. My point is that the latter is more likely to succeed.)&lt;br /&gt;&lt;br /&gt;Elegance aside, could a from-scratch VM be better than JavaScript? In some ways of course it could, like any redesign from scratch of anything. But I'm not sure that it could fundamentally be better in substantial ways. The main problem is that we just don't know how to create a &lt;b&gt;perfect&lt;/b&gt; &quot;one bytecode to rule them all&lt;b&gt;&quot;&lt;/b&gt; that is&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fast&lt;/b&gt; - runs all languages at their &lt;b&gt;maximal&lt;/b&gt; speed&lt;/li&gt;&lt;li&gt;&lt;b&gt;Portable&lt;/b&gt; - runs on all CPUs and OSes&lt;/li&gt;&lt;li&gt;&lt;b&gt;Safe&lt;/b&gt; - sandboxable so it cannot be used to get control of users' machines&lt;/li&gt;&lt;/ul&gt;The elusive perfect universal bytecode would need to do all three, but it seems to me that we can only pick two.&lt;br /&gt;&lt;br /&gt;Why is this so, when supposedly the CLR and JVM show that the trifecta is possible? The fact is that they do not, if you really take &quot;fast&quot; to mean what I wrote above, which is &quot;runs all languages at their maximal speed&quot; - that's what I mean by &quot;perfect&quot; in the context of the last paragraph. For example, you can run JavaScript on the JVM, but it won't come close to the speed of a modern JS VM. (There are examples of promising work like &lt;a href=&quot;http://research.microsoft.com/pubs/121449/techreport2.pdf&quot;&gt;SPUR&lt;/a&gt;, but that was done before the leaps in JS performance that came with CrankShaft, TypeInference, IonMonkey, DFG, etc.).&lt;br /&gt;&lt;br /&gt;The basic problem is that to run a dynamic language at full speed, you need to do the things that JavaScript engines, LuaJIT, etc. do, which includes self-modifying code (architecture-specific PICs), or even things like entire interpreters in handwritten optimized assembly. Making those things portable and safe is quite hard - when you make them portable and safe, you make them more generic pretty much by definition. But CPUs have significant-enough differences that doing generic things can lead to slower performance.&lt;br /&gt;&lt;br /&gt;The problems don't stop there. A single &quot;bytecode to rule them all&quot; must make some decisions as to its basic types. LuaJIT and several JavaScript VMs represent numbers using a form of NaNboxing, which uses invalid values in doubles to store other types of values. Deciding to NaNbox (and in what way) or not NaNbox is typically a design desicion for an entire VM. NaNboxing might be well and good for JS and Lua, but it might slow down other languages. Another example is how strings are implemented: IronPython, Python on .NET, ran into issues with how Python expects strings to work as opposed to .NET.&lt;br /&gt;&lt;br /&gt;Yet another area where decisions must be made is garbage collection. Different languages have different patterns of usage, both determined by the language itself and the culture around the language. For example, &lt;a href=&quot;http://wiki.luajit.org/New-Garbage-Collector&quot;&gt;the new garbage collector planned for LuaJIT 3.0&lt;/a&gt;, a complete redesign from scratch, is not going to be a copying GC, but in other VMs there are copying GCs. Another concern is finalization: Some languages allow hooking into object destruction, either before or after the object is GC'd, while others disallow such things entirely. A design decision on that matter has implications for performance. So it is doubtful that a single GC could be truly optimal for all languages, in the sense of being &quot;perfect&quot; and letting everything run at maximal speed.&lt;br /&gt;&lt;br /&gt;So any VM must make decisions and tradeoffs about fundamental features. There is no obvious optimal solution that is right for everything. If there were, all VMs would look the same, but they very much do not. Even relatively similar VMs like the JVM and CLR (which are similar for obvious historic reasons) have fundamental differences.&lt;br /&gt;&lt;br /&gt;Perhaps a single VM could include all the possible basic types - both &quot;normal&quot; doubles and ints, and NaNboxed doubles? Both Pascal-type strings and C-type strings? Both asynchronous and synchronous APIs for everything? Of course all these things are possible, but they make things much more complicated. If you really want to squeeze every last ounce of performance out of your VM, you should keep it simple - that's what LuaJIT does, and very well. Trying to support all the things will lead to compromises, which goes against the goal of a VM that &quot;runs all languages at their maximal speed&quot;.&lt;br /&gt;&lt;br /&gt;(Of course there is one way to support all the things at maximal speed: Use a native platform as your VM. x86 can run Java, LuaJIT and JS all at maximal speed almost by definition. It can even be sandboxed in various ways. But it has lost the third property of being platform-independent.)&lt;br /&gt;&lt;br /&gt;Could we perhaps just add another VM like the CLR alongside JavaScript,  and get the best of both worlds that way, instead of putting everything we need in one VM? That sounds like an interesting idea at first, but &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev/2011-December/018811.html&quot;&gt;it has technical difficulties and downsides&lt;/a&gt;, is complex, and would likely regress existing performance.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Do we actually need &quot;maximal speed&quot;?&lt;/b&gt; How about just &quot;reasonable speed&quot;? Definitely, we can't hold out for some perfect VM that can do it all. In the last few paragraphs I've been talking about a &quot;perfect&quot; bytecode VM that can run everything at maximal speed. My point is that it's important to realize that there is no such VM. But, with some compromise we definitely can have a VM that runs many things at very high speeds. Examples of such VMs are the JVM, CLR, and as mentioned before JavaScript VMs as well, since they can run one very popular dynamic language at maximal speed, and they can run statically typed code compiled from C++ about as well or even better than some bytecode VMs (with the already-discussed caveats of SIMD and shared-mutable threads).&lt;br /&gt;&lt;br /&gt;For that reason, switching from JavaScript to another VM would not be a strictly better solution in all respects, but instead just shift us to another compromise. For example, JavaScript itself would be slower on the CLR, but C# would be faster, and I'm not sure which of the two can run C++ faster, but my bet is that both can run it at about the same speed.&lt;br /&gt;&lt;br /&gt;So I don't think there is much to gain, technically speaking, from considering a &lt;b&gt;new&lt;/b&gt; bytecode for the web. The only clear advantage such an approach could give is perhaps a more elegant solution, if we started from scratch and designed a new solution with less baggage. That's an appealing idea, and &lt;b&gt;in general&lt;/b&gt; elegance often leads to better results, but as argued earlier there would likely be no significant technical advantages to elegance in &lt;b&gt;this&lt;/b&gt; particular case - so it would be elegance for elegance's sake.&lt;br /&gt;&lt;br /&gt;I purposefully said we don't need a &lt;i&gt;&lt;b&gt;new&lt;/b&gt;&lt;/i&gt; bytecode in the last paragraph. We already have JavaScript, which I have claimed is quite close to providing all the advantages that a bytecode VM could. Note that this wasn't entirely expected - not any language can in a straightforward way be transformed into a more general target for other languages. It just so happens though that JavaScript did have just enough low-level support (bitwise operations being 32-bit, for example) to make it a practical C/C++/LLVM IR compiler target, which made it worth investing in projects like the Relooper that work around some of its other limitations. Combined with the already ongoing speed competition among JavaScript engines, the result is that we now have JavaScript VMs that can run multiple languages at high speed. &lt;br /&gt;&lt;br /&gt;In summary, &lt;b&gt;we already have what practically amounts to a bytecode VM in our browsers. &lt;/b&gt;Work is not complete, though: While we can port many languages very well right now, support for other languages is not quite there yet. If you like a language that is not yet supported on the web, and you want it to run on the web, please contribute to the relevant open source project working on doing that (or start one if there isn't one already). There is no silver bullet here - no other bytecode VM that if only we decided on it, we would have all the languages and libraries we want on the web, &quot;for free&quot; - there is work that needs to be done. But in recent years we have made huge amounts of progress in this area, both in infrastructure for compiling code to JavaScript and in improvements to JavaScript VMs themselves. Let's work together to finish that for all languages.</description>
	<pubDate>Tue, 14 May 2013 18:09:16 +0000</pubDate>
	<author>noreply@blogger.com (azakai)</author>
</item>
<item>
	<title>Niko Matsakis: Procedures, continued</title>
	<guid isPermaLink="false">http://smallcultfollowing.com/babysteps/blog/2013/05/14/procedures</guid>
	<link>http://smallcultfollowing.com/babysteps/blog/2013/05/14/procedures/</link>
	<description>&lt;p&gt;So, I didn’t actually &lt;em&gt;mean&lt;/em&gt; to post that previous post, I had
intended to think more on the idea. But oh well, cat’s out of the
bag. In any case, I’ve been thinking about the “closures” vs
“procedures” idea that I jotted down there and decided to try and
elaborate on it a bit more, since I find it has a lot of appeal. In
particular I think that the current collection of closure types is
addressing too many distinct use cases and the result is confusing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE 2013.05.14:&lt;/em&gt; Edited to tweak various errors and to
add some variations at the end that I prefer.&lt;/p&gt;

&lt;h3&gt;Today: by-reference vs copying closures&lt;/h3&gt;

&lt;p&gt;Today we offer three different kinds of closures (&lt;code&gt;&amp;amp;fn&lt;/code&gt;, &lt;code&gt;@fn&lt;/code&gt;, and
&lt;code&gt;~fn&lt;/code&gt;), but these closures can really be divided into two basic
categories: by-reference and copying closures. A by-reference closure
is the usual kind: it is allocated on the stack and has full access to
the variables in the creating stack frame. It can read them, write
them, and borrow them. These are used with for loops and the like.&lt;/p&gt;

&lt;p&gt;Copying closures, on the other hand, are somewhat different. They are
not tied to any particular stack frame. Instead, they &lt;em&gt;copy&lt;/em&gt; the
current values of the variables which they close over into their
environment (like all the default Rust copies, this is a shallow copy,
so if the value being closed over contains &lt;code&gt;~&lt;/code&gt; pointers, it will no
longer be accessible from the creator). These closures are used
primarily as task bodies and for futures. There are some scattered
uses of &lt;code&gt;@fn&lt;/code&gt; closures in the compiler but as far as I can tell they
are all legacy code that should eventually be purged and rewritten to
use traits (i.e., the visitor, the AST folder).&lt;/p&gt;

&lt;p&gt;Loosely speaking, a &lt;code&gt;&amp;amp;fn&lt;/code&gt; closure is by-reference and &lt;code&gt;@fn&lt;/code&gt; and &lt;code&gt;~fn&lt;/code&gt;
closures are copying closures. But this is not strictly true. In fact,
an the &lt;code&gt;&amp;amp;fn&lt;/code&gt; type can be either a by-reference closure &lt;em&gt;or&lt;/em&gt; a copying
closure, because you are permitted to borrow a &lt;code&gt;@fn&lt;/code&gt; or &lt;code&gt;~fn&lt;/code&gt; to a
&lt;code&gt;&amp;amp;fn&lt;/code&gt;.  So the type in isolation does not tell you whether a closure
is by-reference or not. In fact, there is no explicit indication at
all—instead, when you create a closure today (i.e., with a &lt;code&gt;|x, y|
...&lt;/code&gt;) expression, the compiler infers based on the expected types
whether this should be a by-reference closure or a copying
closure. Because the semantics of these two vary greatly, I find this
potentially quite confusing and unfortunate.&lt;/p&gt;

&lt;h3&gt;Tomorrow (perhaps): closures and procedures&lt;/h3&gt;

&lt;p&gt;In general, I would prefer to draw a starker line between copying and
by-reference closures. I propose to use the term &lt;em&gt;closure&lt;/em&gt; to refer
only to by-reference, stack-allocated closures. We could then use
another term, perhaps &lt;em&gt;procedure&lt;/em&gt;, to refer to the copying
closures. This would mean that our type hierarchy would look like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;T = S               // sized types
  | U               // unsized types
S = fn(S*) -&amp;gt; S     // closures (*)
  | &amp;amp;'r T           // region ptr
  | @T              // managed ptr
  | ~T              // unique ptr
  | [S, ..N]        // fixed-length array
  | uint            // scalars
  | ...
U = [S]             // vectors
  | str             // string
  | Trait           // existential (&quot;exists S:Trait.S&quot;)
  | proc(S*) -&amp;gt; S   // procedures (*)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This chart is basically the same as the one you will find in the
&lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2013/04/30/dynamically-sized-types/&quot;&gt;dynamically sized types&lt;/a&gt; post from before with one crucial
difference: closure types have been split from procedures, and closure
types have moved into the category of &lt;em&gt;sized types&lt;/em&gt;, meaning that you
no longer write an explicit sigil when you use one. This is because
the representation of a closure would always be a pair of a borrowed
pointer into the stack and a function pointer: the type has a fixed
size (two words) and requires no memory allocation.&lt;/p&gt;

&lt;p&gt;I have chosen to leave procedures as unsized, since a procedure must
allocate memory on the heap, and this allows the user to select which
heap is used; in earlier drafts of this idea, I had modified
procedures to implicit use the exchange heap, meaning that a type like
&lt;code&gt;proc()&lt;/code&gt; always represented an exchange heap allocation. But I think
it’s more consistent to have that type be written &lt;code&gt;~proc&lt;/code&gt;, and it
maintains the general Rust invariant “you don’t have allocation unless
you see a sigil”.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE:&lt;/em&gt; bstrie on IRC asked about fn items, which never have any
environment. As today, these would continue to be coercable to either
a closure or a procedure.&lt;/p&gt;

&lt;h3&gt;Closure and procedure expressions&lt;/h3&gt;

&lt;p&gt;Closures would still be created with the form &lt;code&gt;|x, y|
expr&lt;/code&gt;. Procedures would be created using the keyword &lt;code&gt;proc&lt;/code&gt;: &lt;code&gt;proc(x,
y) expr&lt;/code&gt;. If desired, we could integrate procedures into &lt;code&gt;do&lt;/code&gt; using
some syntax like one of the following, depending on whether we wish
to make the sigil explicit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;do spawn proc { ... }   // sigil inferred

do spawn ~proc { ... }  // sigil explicit
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Closure and procedure types in more detail&lt;/h3&gt;

&lt;p&gt;The full function or procedure type would look something like this
(&lt;code&gt;[]&lt;/code&gt; indicates optional content):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; [once] (fn|proc) [:['r] [Bounds]] &amp;lt;'a...&amp;gt; (S*) -&amp;gt; S
 ^~~~~^           ^~~~~~~~~~~~~~~^ ^~~~~~^ ^~~^    ^
   |                     |            |     |      |
   |                     |            |     |  Return type
   |                     |            |    Argument types
   |                     |          Bound lifetime names
   |               Lifetime and trait bounds
Onceness
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here the “onceness” indicates whether the closure/procedure can be
called more than once. The “lifetime and trait bounds” indicate
constraints on the environment. The lifetime bound &lt;code&gt;'r&lt;/code&gt; indicates the
minimum lifetime of the variables that the closure/procedure closes
over, and the “bounds” (if any) would give bounds on the types of
those variables. Finally, you have the argument and return types.&lt;/p&gt;

&lt;p&gt;If omitted, the default bounds for a closure would be a fresh lifetime
and no type bounds. The default bounds for a procedure would be the
static lifetime and &lt;code&gt;Owned&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Use cases&lt;/h3&gt;

&lt;p&gt;Let’s look briefly at the use cases I listed before.&lt;/p&gt;

&lt;h4&gt;Higher-order and once functions&lt;/h4&gt;

&lt;p&gt;Typical uses for higher-order and once functions look much the same as
before, but minus a sigil.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;impl&amp;lt;T:Sized&amp;gt; for [T] {
    pub fn map&amp;lt;U:Sized&amp;gt;(f: fn(&amp;amp;T) -&amp;gt; U) -&amp;gt; ~[U] { ... }
                        // ^~~~~~~~~~~
}

impl&amp;lt;T:Sized&amp;gt; for Option&amp;lt;T&amp;gt; {
    // `each` on an option type can only execute at most once:
    pub fn each(f: once fn(&amp;amp;T) -&amp;gt; bool) -&amp;gt; bool { ... }
                // ^~~~~~~~~~~~~~~~~~~
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For contrast, these are &lt;code&gt;&amp;amp;fn(&amp;amp;T) -&amp;gt; U&lt;/code&gt; and &lt;code&gt;&amp;amp;once fn(&amp;amp;T) -&amp;gt; bool&lt;/code&gt; today.&lt;/p&gt;

&lt;h4&gt;Sendable functions and sendable once functions&lt;/h4&gt;

&lt;p&gt;Here is an example of a sendable once function:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fn spawn(f: ~once proc()) {...}
         // ^~~~~~~~~~
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As we saw before, one would write one of the following to call this
function:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;do spawn proc { ... }
spawn(proc { ... })
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Creating a future would look like &lt;code&gt;future(proc expr)&lt;/code&gt; (vs &lt;code&gt;future(||
expr)&lt;/code&gt; today).&lt;/p&gt;

&lt;h4&gt;Const closures&lt;/h4&gt;

&lt;p&gt;One could still use const closures to achieve lightweight parallelism:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;impl&amp;lt;T:Sized&amp;gt; for [T] {
    pub fn par_map&amp;lt;U:Sized&amp;gt;(f: fn:Const(&amp;amp;T) -&amp;gt; U) -&amp;gt; bool { ... }
                            // ^~~~~~~~~~~~~~~~~
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, I have been thinking that we’ll have to be careful here, we
need some way to guarantee that the closure does not move from its
environment and then replace the moved value. Today this is illegal,
but if we can prevent closures from recursing (which we must do
anyhow) then we could make such moves legal, and it would be useful
sometimes. On simple solution is to stay that if the closure type has
a &lt;code&gt;Const&lt;/code&gt; bound, moves are illegal, but it’s a bit…ad-hoc, since the
bounds are only supposed to be constraining the &lt;em&gt;types&lt;/em&gt; of the
variables that are closed over. Still, it might be good enough.&lt;/p&gt;

&lt;h4&gt;Sendable const functions and combinators&lt;/h4&gt;

&lt;p&gt;As I argued before, I think these are not important use cases, but
with procedures they actually work out fine (though not with
variations 2 and 3 below). A sendable const function can be expressed
with the type &lt;code&gt;~proc:Owned+Const()&lt;/code&gt;, which is complex, but then it
&lt;em&gt;is&lt;/em&gt; a complex idea. Combinator types would likely look like &lt;code&gt;@proc&lt;/code&gt;
or &lt;code&gt;@proc:'r&lt;/code&gt;, in the case where the combinator closes over borrowed
data.&lt;/p&gt;

&lt;h3&gt;Variation #1: Leaving procedures out of the core language&lt;/h3&gt;

&lt;p&gt;In fact, I think &lt;code&gt;proc&lt;/code&gt; types need not be built into the language, you
could model them with traits, though you’d probably want a macro like
&lt;code&gt;proc!(...)&lt;/code&gt; for defining the proc body. This would also mean the
procedures can’t be used with &lt;code&gt;do&lt;/code&gt; form.&lt;/p&gt;

&lt;h3&gt;Variation #2: Limit procedures to execute once&lt;/h3&gt;

&lt;p&gt;I don’t know of any (good) uses cases for non-once procedures.  I
think they should just always be &lt;code&gt;once&lt;/code&gt;. This would mean that the only
closure types that are commonly needed would be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;fn(T)&lt;/code&gt; – normal higher-order functions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;once fn(T)&lt;/code&gt; – higher-order functions that execute at most once&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~proc(T)&lt;/code&gt; – procedures&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Because procedures can always be desugared into a struct and a trait,
this would not lose no expressiveness.&lt;/p&gt;

&lt;h3&gt;Variation #3: Limit procedures to execute once and use exchange heap&lt;/h3&gt;

&lt;p&gt;For maximum streamlining, we could make &lt;code&gt;proc&lt;/code&gt; implicitly use &lt;code&gt;~&lt;/code&gt;,
in which case it would be written:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;fn(T)&lt;/code&gt; – normal higher-order functions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;once fn(T)&lt;/code&gt; – higher-order functions that execute at most once&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proc(T)&lt;/code&gt; – procedures&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;These types read pretty well, I think.&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;I have long been unsatisfied with the implicit and confusing divide
between “by reference” and “copying” closures. Splitting them into two
concepts seems to address a lot of issues and be an overall win to me.&lt;/p&gt;</description>
	<pubDate>Tue, 14 May 2013 13:20:00 +0000</pubDate>
</item>
<item>
	<title>Tim Taubert: Scotland.JS 2013 in Edinburgh</title>
	<guid isPermaLink="false">http://timtaubert.de/blog/2013/05/scotland-js-2013-in-edinburgh</guid>
	<link>http://timtaubert.de/blog/2013/05/scotland-js-2013-in-edinburgh/</link>
	<description>&lt;p&gt;I got to spend Wednesday through Friday in Edinburgh last week to attend
&lt;a href=&quot;http://www.scotlandjs.com/&quot;&gt;Scotland.JS&lt;/a&gt;. Edinburgh is a lovely city and I will
definitely return to get to know it better. It has great people, beers, food and
even a castle - what could one want more?&lt;/p&gt;

&lt;p&gt;I arrived on Wednesday, just in time for the
&lt;a href=&quot;http://techmeetup.co.uk/&quot;&gt;TechMeetup&lt;/a&gt;. It took place in the Appleton Tower and
had about 70-80 attendees with quite diverse technical backgrounds. I had a very
interesting talk to a freelance patent attorney and also met a couple of people
I knew from recent conferences and meetups in Berlin. After we were out of free
pizza and beers we met most of the Scotland.JS attendees in a pub right next to
the Appleton Tower. Cue more beers and tech conversations.&lt;/p&gt;

&lt;p&gt;Thursday was the first day of Scotland.JS that started with
&lt;a href=&quot;http://decadecity.net/blog/2013/05/09/jan-lehnardt-scotlandjs-opening-keynote&quot;&gt;a great keynote&lt;/a&gt;
from &lt;a href=&quot;https://twitter.com/janl&quot;&gt;Jan Lehnardt&lt;/a&gt;. The most memorable talk of the
day was about
&lt;a href=&quot;http://decadecity.net/blog/2013/05/09/philip-roberts-enemy-state-introduction-functional-reactive-programming-and-baconjs&quot;&gt;Functional Reactive Programming using Bacon.js&lt;/a&gt;
by &lt;a href=&quot;https://twitter.com/philip_roberts&quot;&gt;Philip Roberts&lt;/a&gt;. There of course were a
lot more great talks but the possibilities of creating and combining event
streams kept my head spinning the most. At the end of the day we again went to a
neat pub near the venue and I headed to bed rather early, still a little tired
from travel and the day before.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://timtaubert.de/images/scotlandjs.jpg&quot; title=&quot;Scotland.JS organizer Peter Aitken on stage&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Friday started with a short 20-minute walk through Edinburgh’s old town that I
needed to pass on my way to the venue. My favorite talk of the second and last
day was held by &lt;a href=&quot;https://twitter.com/dominictarr&quot;&gt;Dominic Tarr&lt;/a&gt; that tought us
about
&lt;a href=&quot;http://decadecity.net/blog/2013/05/10/dominic-tarr-database-future-leveldb&quot;&gt;the internals of leveldb&lt;/a&gt;.
I also really enjoyed &lt;a href=&quot;https://twitter.com/maboa&quot;&gt;Mark Boas&lt;/a&gt; talking about
&lt;a href=&quot;http://happyworm.com/slides/scotlandjs2013/&quot;&gt;making audio a first-class citizen of the web&lt;/a&gt;
- a very entertaining and impressive mix of technologies. A GitHub drinkup in
the venue’s own pub was a great way to end the conference - lots of good
conversations with Scotland.JS attendees and speakers as well as people from the
local tech community and visitors of the Scottish Ruby Conf.&lt;/p&gt;

&lt;p&gt;I flew home the very next day and already miss Edinburgh with its neat little
alleys and pubs everywhere. The JavaScript community has once again shown its
value as a very interesting mix of nice welcoming people coming from so many
different technical backgrounds. Like after most conferences I feel a little
exhausted and my head is full of ideas for future or current (side-)projects. I
will try my best to return next year, it has been a lot of fun!&lt;/p&gt;</description>
	<pubDate>Tue, 14 May 2013 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Niko Matsakis: Mutable fn alternatives</title>
	<guid isPermaLink="false">http://smallcultfollowing.com/babysteps/blog/2013/05/13/mutable-fn-alternatives</guid>
	<link>http://smallcultfollowing.com/babysteps/blog/2013/05/13/mutable-fn-alternatives/</link>
	<description>&lt;p&gt;I’ve been thinking about what I wrote in my last post regarding
closures and I am beginning to change my opinion about the correct
solution. &lt;code&gt;fn~&lt;/code&gt; just seems so unfortunate. So, besides writing &lt;code&gt;fn~&lt;/code&gt;,
what are the other options?  I just thought I’d write down a few of
the other ideas I’ve come up with for later reference.  Not saying any
of the ideas in this post are good yet.&lt;/p&gt;

&lt;h3&gt;Just write &lt;code&gt;&amp;amp;mut fn()&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Maybe it’s not so bad. It is advertising the possibility that the
closure may mutate its environment. This would mean that while &lt;code&gt;&amp;amp;fn()&lt;/code&gt;
is a valid type, it is a type that does not permit the function to be
called, much as &lt;code&gt;&amp;amp;&amp;amp;mut&lt;/code&gt; (pointer to a mutable borrowed pointer) does
not permit the mutable borrowed pointer to be used.&lt;/p&gt;

&lt;p&gt;At first I was thinking that there is also a valid interpretation for
&lt;code&gt;&amp;amp;fn&lt;/code&gt;, meaning a function that does not mutate the variable in its
environment, but then I realize that per the DST proposal any &lt;code&gt;&amp;amp;mut
fn&lt;/code&gt; could be borrowed to &lt;code&gt;&amp;amp;fn&lt;/code&gt;, and so that would not be sound.&lt;/p&gt;

&lt;h3&gt;Remove everything but borrowed closures&lt;/h3&gt;

&lt;p&gt;We could just &lt;em&gt;only have&lt;/em&gt; borrowed closures. The type would be written
&lt;code&gt;fn[:bounds]()&lt;/code&gt; or &lt;code&gt;once fn[:bounds]()&lt;/code&gt;. There’d be no need to notate
the kind of environment pointer: it’s always a borrowed pointer. All
other uses of closures would be expressed using traits and impls.&lt;/p&gt;

&lt;p&gt;Mainly this means that code which spawns traits would get somewhat
verbose, because you would need to create a struct or some other type
to capture all of the upvars. For larger tasks, this is not a big
deal, but for some code it could be rather annoying. I imagine futures
in particular would become much more verbose; enough so as to be
nearly unusable.&lt;/p&gt;

&lt;p&gt;On the upside, there’d be no more confusion about whether a closure
copies its environment or not (no, it never does). Closure types would
be simpler (no need to worry about sigils). You’d write &lt;code&gt;fn()&lt;/code&gt; or
&lt;code&gt;once fn()&lt;/code&gt; in all but the most esoteric cases. The code to manage
closures would become much simpler.&lt;/p&gt;

&lt;h3&gt;Add a new keyword for what is now called an “owned closure”&lt;/h3&gt;

&lt;p&gt;This is basically the &lt;code&gt;fn~&lt;/code&gt; solution with another name. Rather than
writing &lt;code&gt;fn~&lt;/code&gt; to indicate a closure value that owns its environment,
we could write &lt;code&gt;proc&lt;/code&gt; (for procedure) or something like that.  This
avoids the annoying “sigil after the name”, at the cost of a new
keyword.&lt;/p&gt;

&lt;p&gt;Procedures could probably &lt;em&gt;always&lt;/em&gt; be single-shot (that is, &lt;code&gt;once&lt;/code&gt;).
Almost all use cases for them (futures, tasks, etc) are single-shot,
and the others could probably be accommodated with traits instead. But
we could also distinguish between a &lt;code&gt;proc&lt;/code&gt; and a &lt;code&gt;once proc&lt;/code&gt; if we
wanted.&lt;/p&gt;

&lt;p&gt;Procedures would probably be less interoperable with functions, since
the name does not particularly suggest interoperability. For example,
I imagine you could not use a &lt;code&gt;proc&lt;/code&gt; where a &lt;code&gt;fn&lt;/code&gt; is expected. I don’t
know of any time that this is actually important.&lt;/p&gt;

&lt;p&gt;Using a different name also helps to draw a clear line between between
“closures” (which reference the variables in the stack frame that
created them) and “procedures” (which copy out from that stack frame).
I personally would prefer to designate procedures with a different
syntax, e.g., &lt;code&gt;proc(x, y) { ... }&lt;/code&gt; in place of &lt;code&gt;|x, y| ...&lt;/code&gt;, but this
is not &lt;em&gt;necessary&lt;/em&gt; (as an aside, I had hoped to write some today about
why I think our current use of &lt;code&gt;||&lt;/code&gt; to designate any kind of closure
is troublesome and should be changed, before I realized that we’d have
to address this problem I’m thinking over instead).&lt;/p&gt;

&lt;h3&gt;More ideas?&lt;/h3&gt;

&lt;p&gt;Ok, that’s most of the more radical ideas I’ve had so far. I’ll have
to keep thinking on it.&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 21:31:00 +0000</pubDate>
</item>
<item>
	<title>Gregory Szorc: Build System Status Update 2013-05-14</title>
	<guid isPermaLink="true">http://gregoryszorc.com/blog/2013/05/13/build-system-status-update-2013-05-14</guid>
	<link>http://gregoryszorc.com/blog/2013/05/13/build-system-status-update-2013-05-14</link>
	<description>&lt;p&gt;I'd like to make an attempt at delivering regular status updates on the
Gecko/Firefox build system and related topics. Here we go with the
first instance. I'm sure I missed awesomeness. Ping me and I'll add it
to the next update.&lt;/p&gt;
&lt;h3&gt;MozillaBuild Windows build environment updated&lt;/h3&gt;
&lt;p&gt;Kyle Huey
&lt;a href=&quot;https://groups.google.com/d/msg/mozilla.dev.platform/XRecAHF-H28/aSbrdKJLUNoJ&quot;&gt;released version 1.7&lt;/a&gt;
of our Windows build environment. It contains a newer version of Python
and a modern version of Mercurial among other features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I highly recommend every Windows developer update ASAP.&lt;/strong&gt; Please note
that you will likely encounter Python errors unless you clobber your
build.&lt;/p&gt;
&lt;h3&gt;New submodule and peers&lt;/h3&gt;
&lt;p&gt;I used my power as module owner to create a submodule of the build
config module whose scope is the (largely mechanical) transition of
content from Makefile.in to moz.build files. I granted Joey Armstrong
and Mike Shal peer status for this module. I would like to eventually
see both elevated to build peers of the main build module.&lt;/p&gt;
&lt;h3&gt;moz.build transition&lt;/h3&gt;
&lt;p&gt;The following progress has been made:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mike Shal has converted variables related to defining XPIDL files in
  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=818246&quot;&gt;bug 818246&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mike Shal converted MODULE in
  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=844654&quot;&gt;bug 844654&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mike Shal converted EXPORTS in
  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=846634&quot;&gt;bug 846634&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Joey Armstrong converted xpcshell test manifests in
  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=844655&quot;&gt;bug 844655&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Brian O'Keefe converted PROGRAM in
  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862986&quot;&gt;bug 862986&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mike Shal is about to land conversion of CPPSRCS in
  &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=864774&quot;&gt;bug 864774&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Non-recursive XPIDL generation&lt;/h3&gt;
&lt;p&gt;In &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=850380&quot;&gt;bug 850380&lt;/a&gt;
I'm trying to land non-recursive building of XPIDL files. As part of
this I'm trying to combine the generation of .xpt and .h for each input
.idl file into a single process call because profiling revealed that
parsing the IDL consumes most of the CPU time. This shaves a few dozen
seconds off of build times.&lt;/p&gt;
&lt;p&gt;I have encounterd multiple pymake bugs when developing this patch, which
is the primary reason it hasn't landed yet.&lt;/p&gt;
&lt;h3&gt;WebIDL refactoring&lt;/h3&gt;
&lt;p&gt;I was looking at my build logs and noticed WebIDL generation was taking
longer than I thought it should. I filed
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861587&quot;&gt;bug 861587&lt;/a&gt; to
investigate making it faster. While my initial profiling turned out to
be wrong, Boris Zbarsky looked into things and discovered that the
serialization and deserialization of the parser output was extremely
slow. He is currently trying to land a refactor of how WebIDL bindings
are handled. The early results look &lt;strong&gt;very&lt;/strong&gt; promising.&lt;/p&gt;
&lt;p&gt;I think the bug is a good example of the challenges we face improving
the build system, as Boris can surely attest.&lt;/p&gt;
&lt;h3&gt;Test directory reorganization&lt;/h3&gt;
&lt;p&gt;Joel Maher is injecting sanity into the naming scheme of test
directories in
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=852065&quot;&gt;bug 852065&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Manifests for mochitests&lt;/h3&gt;
&lt;p&gt;Jeff Hammel, Joel Maher, Ted Mielczarek, and I are working out using
manifests for mochitests (like xpcshell tests) in
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=852416&quot;&gt;bug 852416&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Mach core is now a standalone package&lt;/h3&gt;
&lt;p&gt;I extracted the mach core to a
&lt;a href=&quot;https://github.com/indygreg/mach&quot;&gt;standalone repository&lt;/a&gt; and
&lt;a href=&quot;https://pypi.python.org/pypi/mach/&quot;&gt;added it to PyPI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mach now &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=856392&quot;&gt;categorizes&lt;/a&gt;
commands in its help output.&lt;/p&gt;
&lt;h3&gt;Requiring Python 2.7.3&lt;/h3&gt;
&lt;p&gt;Now that the Windows build environment ships with Python 2.7.4, I've
filed &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=870420&quot;&gt;bug 870420&lt;/a&gt;
to require Python 2.7.3+ to build the tree. We already require
Python 2.7.0+. I want to bump the point release because there are
&lt;a href=&quot;http://hg.python.org/cpython/file/d46c1973d3c4/Misc/NEWS&quot;&gt;many&lt;/a&gt; small
bug fixes in 2.7.3, especially around Python 3 compatibility.&lt;/p&gt;
&lt;p&gt;This is currently blocked on RelEng rolling out 2.7.3 to all the
builders.&lt;/p&gt;
&lt;h3&gt;Eliminating master xpcshell manifest&lt;/h3&gt;
&lt;p&gt;Now that xpcshell test manifests are defined in moz.build files, we
theoretically don't need the master manifest. Joshua Cranmer is working
on removing them in
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=869635&quot;&gt;bug 869635&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Enabling GTests and dual linking libxul&lt;/h3&gt;
&lt;p&gt;Benoit Gerard and Mike Hommey are working in
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=844288&quot;&gt;bug 844288&lt;/a&gt; to
dual link libxul so GTests can eventually be enabled and executed as
part of our automation.&lt;/p&gt;
&lt;p&gt;This will regress build times since we need to link libxul twice. But,
giving C++ developers the ability to write unit tests with a real
testing framework is worth it, in my opinion.&lt;/p&gt;
&lt;h3&gt;ICU landing&lt;/h3&gt;
&lt;p&gt;ICU was briefly enabled in
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=853301&quot;&gt;bug 853301&lt;/a&gt; but
then backed out because it broke cross-compiling. It should be on track
for enabling in Firefox 24.&lt;/p&gt;
&lt;h3&gt;Resource monitoring in mozbase&lt;/h3&gt;
&lt;p&gt;I &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=802420&quot;&gt;gave mozbase&lt;/a&gt;
a class to record system resource usage. I plan to eventually hook this
up to the build system so the build system records how long it took to
perform key events. This will give us better insight into slow and
inefficient parts of the build and will help us track build system speed
improvements over time.&lt;/p&gt;
&lt;h3&gt;Sorted lists in moz.build files&lt;/h3&gt;
&lt;p&gt;I'm working on requiring lists in moz.build be sorted. Work is happening
in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=863069&quot;&gt;bug 863069&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This idea started as a suggestion on the dev-platform list. If anyone
has more great ideas, don't hold them back!&lt;/p&gt;
&lt;h3&gt;Smartmake added to mach&lt;/h3&gt;
&lt;p&gt;Nicholas Alexander
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=677452&quot;&gt;taught mach&lt;/a&gt; how
to build intelligently by importing some of Josh Matthews' smartmake
tool's functionality into the tree.&lt;/p&gt;
&lt;h3&gt;Source server fixed&lt;/h3&gt;
&lt;p&gt;Kyle Huey and Ted Mielczarek
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=846864&quot;&gt;collaborated&lt;/a&gt; to
fix the source server.&lt;/p&gt;
&lt;h3&gt;Auto clobber functionality&lt;/h3&gt;
&lt;p&gt;Auto clobber functionality was added to the tree. After flirting briefly
with on-by-default, we changed it to opt-in. When you encounter it, it
will tell you how to enable it.&lt;/p&gt;
&lt;h3&gt;Faster clobbers on automation&lt;/h3&gt;
&lt;p&gt;I was looking at build logs and identified we were inefficiently
performing clobber.&lt;/p&gt;
&lt;p&gt;Massimo Gervasini and Chris AtLee
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=851270&quot;&gt;deployed changes&lt;/a&gt;
to automation to make it more efficient. My measurements showed a
Windows try build that took 15 fewer minutes to start - a &lt;em&gt;huge&lt;/em&gt;
improvement.&lt;/p&gt;
&lt;h3&gt;Upgrading to Mercurial 2.5.4&lt;/h3&gt;
&lt;p&gt;RelEng is &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=741353&quot;&gt;tracking&lt;/a&gt;
the global deployment of Mercurial 2.5.4. hg.mozilla.org is
currently running 2.0.2 and automation is all over the map. The upgrade
should make Mercurial operations faster and more robust across the
board.&lt;/p&gt;
&lt;p&gt;I'm considering adding code to mach or the build system that prompts the
user when her Mercurial is out of date (since an out of date Mercurial
can result in a sub-par user experience).&lt;/p&gt;
&lt;h3&gt;Parallelize reftests&lt;/h3&gt;
&lt;p&gt;Nathan Froyd is
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=813742&quot;&gt;leading an effort&lt;/a&gt;
to parallelize reftest execution. If he pulls this off, it could shave
hours off of the total automation load per checkin. Go Nathan!&lt;/p&gt;
&lt;h3&gt;Overhaul of MozillaBuild in the works&lt;/h3&gt;
&lt;p&gt;I am mentoring a pair of interns this summer. I'm still working out the
final set of goals, but I'm keen to have one of them overhaul the
MozillaBuild Windows development environment. Cross your fingers.&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 19:35:00 +0000</pubDate>
</item>
<item>
	<title>J. Paul Reed: Eulogy for a Founding Father</title>
	<guid isPermaLink="false">http://soberbuildengineer.com/blog/?p=1250</guid>
	<link>http://soberbuildengineer.com/blog/2013/05/eulogy-for-a-founding-father/</link>
	<description>&lt;p&gt;About a month ago, I noticed &lt;a href=&quot;https://twitter.com/ccooper/status/319138753404891136&quot;&gt;a tweet&lt;/a&gt; from &lt;a href=&quot;http://coop.deadsquid.com/&quot;&gt;Coop&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Pouring out a little liquor for tinderbox today. Drinking the rest, because, you know, tinderbox.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It linked to a &lt;tt&gt;mozilla.dev.planning&lt;/tt&gt; post &lt;a href=&quot;https://groups.google.com/forum/#!msg/mozilla.dev.planning/Y6LuxDRfv20/y26IX7IrhWYJ&quot;&gt;describing the plan&lt;/a&gt; to end-of-life Tinderbox&lt;sup&gt;&lt;a name=&quot;reffn_1&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;As one of a handful of people who was required in an employment-capacity to support Tinderbox in production&lt;sup&gt;&lt;a name=&quot;reffn_2&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_2&quot;&gt;2&lt;/a&gt;,&lt;a name=&quot;reffn_3&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;, I can certainly understand the elation at getting rid of the aged continuous integration system. It hasn’t changed much (or seen much maintenance for that matter) since its original open source release fifteen years ago and certainly had plenty of warts&lt;sup&gt;&lt;a name=&quot;reffn_4&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Having said that, part of me is sad at the… glee, for lack of a better word, at its demise.&lt;/p&gt;
&lt;p&gt;Tinderbox is certainly antiquated by any modern standard, but it should not be forgotten that, having been released &lt;i&gt;in 1998&lt;/i&gt;, it is very much the grandfather of continuous integration systems.&lt;/p&gt;
&lt;p&gt;It may have “sucked,” but it facilitated a workflow and nurtured an ethos that is not only extremely important, but taken for granted today: namely the notion that individual developers should be “on the hook” when checking in, and have a responsibility to their peers to monitor the build and make sure the tree “stays green.”&lt;/p&gt;
&lt;p&gt;It was Tinderbox that was largely responsible for introducing a generation of software engineers to this now-commonplace concept, and helping to get a previous generation of engineers to care about such things. Mozilla was the poster-child user for Tinderbox, but I know of at least VMware and Yahoo who used it years before Hudson/Jenkins and Buildbot existed.&lt;/p&gt;
&lt;p&gt;Beyond that, it sports features that those systems &lt;b&gt;TO THIS DAY&lt;/b&gt; do not:&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1250&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tinderbox put its build logic in the clients, and had them report to the server via email; this may seem odd now, but the asynchronous nature of that data flow meant that Tinderbox was surprisingly tolerant to network failures, something Jenkins and (especially) Buildbot both continue to handle horribly.&lt;/li&gt;
&lt;li&gt;Tinderbox supported JSON output&lt;sup&gt;&lt;a name=&quot;reffn_5&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_5&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; that allowed the development of its successor, &lt;a href=&quot;https://tbpl.mozilla.org/&quot;&gt;tbpl&lt;/a&gt;, and other tools; it was one of the first CI systems to make its collection of data consumable in such a transparent format.&lt;/li&gt;
&lt;li&gt;As mentioned above, Tinderbox was modular, separating out the logic of the client from the server, and using a simple API to communicate between them. This meant it was trivial to write a Tinderbox client in whatever language you preferred to write one in, as long as it output something the Tinderbox server expected; this is &lt;i&gt;&lt;b&gt;huge&lt;/b&gt;&lt;/i&gt;, and a major distinction between today’s systems, which follow a command-and-control model. I personally know Jenkins users who tell horror stories about 40+ minute startup times when tens-of-thousands of clients were involved. Tinderbox, by design, never had this problem.&lt;/li&gt;
&lt;li&gt;Tinderbox facilitated continuous integration for open source projects in a way that still has yet to be replicated; say what you will about using email as a communication mechanism, but it allowed outside parties to set up and maintain “weird” platforms corporate sponsors of an open source project didn’t feel like investing in&lt;sup&gt;&lt;a name=&quot;reffn_6&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_6&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;, and yet still provide those CI results to the community in a highly-visible, inclusive way&lt;sup&gt;&lt;a name=&quot;reffn_7&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_7&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;. Good luck getting those Jenkins and Buildbot ports open through the corporate firewall today. And for all the hype about Git’s decentralization, there isn’t a continuous integration tool today built around a decentralized model like Tinderbox was.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s easy to hate on tools like Tinderbox when you purposefully ignore the context in which they were created&lt;sup&gt;&lt;a name=&quot;reffn_8&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_8&quot;&gt;8&lt;/a&gt;&lt;/sup&gt;: Richard Stallman’s venerable GCC compiler was “a pile of crap”… if you forget it was the most widely used compiler before the &lt;a href=&quot;http://en.wikipedia.org/wiki/Egcs#EGCS_fork&quot;&gt;EGCS fork&lt;/a&gt;, over a decade before “&lt;a href=&quot;http://en.wikipedia.org/wiki/Clang&quot;&gt;Clang&lt;/a&gt;” was more than a Klingon General&lt;sup&gt;&lt;a name=&quot;reffn_9&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#fn_9&quot;&gt;9&lt;/a&gt;&lt;/sup&gt;. “CVS sucks!” … yeah, compared to Git, Subversion, and Perforce. But not compared to RCS or Microsoft Source Safe. “Shell scripts are old-school garbage!”… except if you were trying to automate something in the 80s and early 90s, and didn’t want to have to learn about C pointers to do it.&lt;/p&gt;
&lt;p&gt;It’s unfortunate that it seems unlikely Tinderbox will ever get the respect it truly deserves as one of the founding fathers of this idea of continuous integration that most of us take for granted today.&lt;/p&gt;
&lt;p&gt;But perhaps that’s merely another example of Alan Kay’s indictment of our industry for its “&lt;a href=&quot;http://www.drdobbs.com/architecture-and-design/interview-with-alan-kay/240003442&quot;&gt;disdain of history&lt;/a&gt;.”&lt;/p&gt;
&lt;p&gt;In any event, to paraphrase Apollo 13 Mission control: “Farewell Tinderbox… and we thank you.”&lt;/p&gt;
&lt;p&gt;&lt;small&gt;_______________&lt;br /&gt;
&lt;sup&gt;1&lt;/sup&gt;&lt;a name=&quot;fn_1&quot;&gt;&lt;/a&gt; And the &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=843383&quot;&gt;requisite bug&lt;/a&gt;, which you can conveniently find find by searching for keyword “tinderbox-death”&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_1&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;2&lt;/sup&gt;&lt;a name=&quot;fn_2&quot;&gt;&lt;/a&gt; Coop also holds this distinction&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_2&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;3&lt;/sup&gt;&lt;a name=&quot;fn_3&quot;&gt;&lt;/a&gt; And as one who also has a number of (now embarrassing) checkins into that code base&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_3&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;4&lt;/sup&gt;&lt;a name=&quot;fn_4&quot;&gt;&lt;/a&gt; Including some &lt;a href=&quot;http://bugzilla.mozilla.org/show_bug.cgi?id=823923&quot;&gt;pretty bad ones&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_4&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;5&lt;/sup&gt;&lt;a name=&quot;fn_5&quot;&gt;&lt;/a&gt; And possibly others&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_5&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;6&lt;/sup&gt;&lt;a name=&quot;fn_6&quot;&gt;&lt;/a&gt; Firefox on AIX, anyone?&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_6&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;7&lt;/sup&gt;&lt;a name=&quot;fn_7&quot;&gt;&lt;/a&gt; It’s telling that the last few projects still using Mozilla’s Tinderbox instance fall pretty squarely into this category: Camino and Bugzilla&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_7&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;8&lt;/sup&gt;&lt;a name=&quot;fn_8&quot;&gt;&lt;/a&gt; Especially when they’re (merely) broadly used for fifteen years, but not actively maintained&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_8&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;sup&gt;9&lt;/sup&gt;&lt;a name=&quot;fn_9&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Chang_%28Star_Trek%29&quot;&gt;Not really&lt;/a&gt;&lt;a href=&quot;http://soberbuildengineer.com/blog/category/planetmoz/feed/#reffn_9&quot;&gt;↵&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 18:52:48 +0000</pubDate>
	<dc:creator>preed</dc:creator>
</item>
<item>
	<title>Eric Shepherd: Documentation reviews in a snap on MDN</title>
	<guid isPermaLink="false">http://www.bitstampede.com/?p=3164</guid>
	<link>http://www.bitstampede.com/2013/05/13/documentation-reviews-in-a-snap-on-mdn/</link>
	<description>&lt;p&gt;A key step in the documentation process is the review. The &lt;a href=&quot;https://www.mozilla.org/?src=wp-promote-mdn&quot; title=&quot;Mozilla&quot;&gt;Mozilla&lt;/a&gt; Developer Network (&lt;a href=&quot;https://developer.mozilla.org/?src=wp-promote-mdn&quot; title=&quot;MDN&quot;&gt;MDN&lt;/a&gt;) developer documentation team aspires to perform two types of review on each article on the wiki:&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;technical review&lt;/strong&gt; involves having someone with technical expertise in the article’s subject area read the article and ensure that it’s factually and technically accurate. This means making sure our explanations of the subject matter are right and make sense to the developers, as well as ensuring that any code samples are implemented correctly.&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;editorial review&lt;/strong&gt; is where someone reads the article and corrects any typos, grammatical mistakes, or stylistic or layout problems they can find.&lt;/p&gt;
&lt;p&gt;When writing an article (or editing an existing article), there are checkboxes that let you request each of these types of review on your article; indeed, both of these flags are enabled by default for any newly-created page. Yellow banners are displayed at the top of the page to let readers know that these flags are set, as appropriate.&lt;/p&gt;
&lt;p&gt;In the past, the only way to remove the review requests (for example, if you’ve read the article and didn’t see any factual errors) was to click the Edit button, scroll to the checkbox for the editorial review, toggle it off, and save the article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now there’s a better way!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, on pages with one or both of these review flags set, you’ll see a new “Quick review” box at the bottom of the article. This box looks like this:&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_3165&quot; style=&quot;width: 447px;&quot;&gt;&lt;a href=&quot;http://www.bitstampede.com/wp-content/uploads/2013/05/quick-review.png&quot;&gt;&lt;img alt=&quot;Screenshot of the quick review box on MDN&quot; class=&quot;size-full wp-image-3165&quot; height=&quot;215&quot; src=&quot;http://www.bitstampede.com/wp-content/uploads/2013/05/quick-review.png&quot; width=&quot;437&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The MDN Quick Review box.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;All you have to do if you’ve completed a review is to turn on the appropriate checkbox(es) and click “Confirm Reviews.” The review is recorded and you have our gratitude for your help!&lt;/p&gt;
&lt;p&gt;If you’d like to actually hunt down and take care of articles in need of review, there’s an easy way to find them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/needs-review/editorial&quot;&gt;Articles that need editorial review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/needs-review/technical&quot;&gt;Articles that need technical review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m hopeful that this streamlined approach to reviews will help encourage subject-matter experts to review content, and will help casual users of MDN get involved by reviewing content as well. We have some improvements planned for future updates to MDN that will make this even better, but this is a great start, and I’m grateful to our development team for putting this together!&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 17:42:53 +0000</pubDate>
	<dc:creator>sheppy</dc:creator>
</item>
<item>
	<title>Gregory Szorc: Mozilla Build System Brain Dump</title>
	<guid isPermaLink="true">http://gregoryszorc.com/blog/2013/05/13/mozilla-build-system-brain-dump</guid>
	<link>http://gregoryszorc.com/blog/2013/05/13/mozilla-build-system-brain-dump</link>
	<description>&lt;p&gt;I hold a lot of context in my head when it comes to the future of
Mozilla's build system and the interaction with it. I wanted to
perform a brain dump of sorts so people have an idea of where I'm
coming from when I inevitably propose radical changes.&lt;/p&gt;
&lt;h3&gt;The sad state of build system interaction and the history of mach&lt;/h3&gt;
&lt;p&gt;I believe that Mozilla's build system has had a poor developer
experience for as long as there has been a Mozilla build system.
Getting started with Firefox development was a rite of passage. It
required following (often out-of-date) directions on MDN. It
required finding pages through MDN search or asking other people
for info over IRC. It was the kind of process that turned away
potential contributors because it was just too damn hard.&lt;/p&gt;
&lt;p&gt;mach - while born out of my initial efforts to radically change
the build system proper - morphed into a generic command
dispatching framework by the time it landed in mozilla-central.
It has one overarching purpose: provide a single gateway point for
performing common developer tasks (such as building the tree and
running tests). The concept was nothing new - individual developers
had long coded up scripts and tools to streamline workflows. Some
even published these for others to use. What set mach apart was a
unified interface for these &lt;em&gt;commands&lt;/em&gt; (the mach script in the
top directory of a checkout) and that these productivity gains
were &lt;strong&gt;in the tree&lt;/strong&gt; and thus easily discoverable and usable by
&lt;em&gt;everybody&lt;/em&gt; without significant effort (just run &lt;em&gt;mach help&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;While mach doesn't yet satisfy everyone's needs, it's slowly
growing new features and making developers' lives easier with
every one. All of this is happening despite that there
is not a single person tasked with working on mach full time.
Until a few months ago, mach was largely my work. Recently, Matt
Brubeck has been contributing a flurry of enhancements - thanks
Matt! Ehsan Akhgari and Nicholas Alexander have contributed a
few commands as well! There are also a few people with a single
command to their name. This is fulfilling my original vision of
facilitating developers to scratch their own itches by
contributing mach commands.&lt;/p&gt;
&lt;p&gt;I've noticed more people referencing mach in IRC channels. And,
more people get angry when a mach command breaks or changes
behavior. So, I consider the mach experiment a success. Is it
perfect, no. If it's not good enough for you, please file a bug
and/or code up a patch. If nothing else, please tell me: I love to
know about everyone's subtle requirements so I can keep them in
mind when refactoring the build system and hacking on mach.&lt;/p&gt;
&lt;h3&gt;The object directory is a black box&lt;/h3&gt;
&lt;p&gt;One of the ideas I'm trying to advance is that the object directory
should be considered a black box for the majority of developers. In
my ideal world, developers don't need to look inside the object
directory. Instead, they interact with it through condoned and
supported tools (like mach).&lt;/p&gt;
&lt;p&gt;I say this for a few reasons. First, as the build config module owner
I would like the ability to massively refactor the &lt;em&gt;internals&lt;/em&gt; of
the object directory without disrupting workflows. If people are
interacting directly with the object directory, I get significant
push back if things change. This inevitably holds back much-needed
improvements and triggers resentment towards me, build peers, and
the build system. Not a good situation. Whereas if people are
indirectly interacting with the object directory, we simply need to
maintain a consistent interface (like mach) and nobody should care
if things change.&lt;/p&gt;
&lt;p&gt;Second, I believe that the methods used when directly interacting
with the object directory are often sub-par compared with going
through a more intelligent tool and that productivity suffers as a
result. For example, when you type &lt;em&gt;make&lt;/em&gt; in inside the object
directory you need to know to pass &lt;em&gt;-j8&lt;/em&gt;, use make vs pymake,
and that you also need to build &lt;em&gt;toolkit/library&lt;/em&gt;, etc.
Also, by invoking make directly, you bypass other handy features,
such as automatic compiler warning aggregation (which only happens
if you invoke the build system through mach). If you go through a
tool like &lt;em&gt;mach&lt;/em&gt;, you &lt;em&gt;should&lt;/em&gt; automatically get the most ideal
experience possible.&lt;/p&gt;
&lt;p&gt;In order for this vision to be realized, we need massive
improvements to tools like mach to cover the missing workflows that
still require direct object directory interaction. We also need people
to start using mach. I think increased mach usage comes after mach
has established itself as obviously superior to the alternatives
(I already believe it offers this for tasks like running tests).&lt;/p&gt;
&lt;h3&gt;I don't want to force mach upon people but...&lt;/h3&gt;
&lt;p&gt;Nobody likes when they are forced to change a process that has been
familiar for years. Developers especially. I get it. That's why
I've always attempted to position mach as an alternative to
existing workflows. If you don't like mach, you can always fall
back to the previous workflow. Or, you can improve mach (patches
more than welcome!). Having gone down the
please-use-this-tool-it's-better road before at other
organizations, I strongly believe that the best method to incur
adoption of a new tool is to gradually sway people through
obvious superiority and praise (as opposed to a mandate to switch).
I've been trying this approach with mach.&lt;/p&gt;
&lt;p&gt;Lately, more and more people have been saying things like
&lt;em&gt;we should have the build infrastructure build through mach
instead of client.mk&lt;/em&gt; and &lt;em&gt;why do we need testsuite-targets.mk when
we have mach commands.&lt;/em&gt; While I personally feel that client.mk
and testsuite-targets.mk are antiquated as a developer-facing
interface compared to mach, I'm reluctant to eliminate them because
I don't like forcing change on others. That being said, there are
compelling reasons to eliminate or at least refactor how they work.&lt;/p&gt;
&lt;p&gt;Let's take &lt;em&gt;testsuite-targets.mk&lt;/em&gt; as an example. This is the make
file that provides the targets to run tests (like &lt;em&gt;make xpcshell-test&lt;/em&gt;
and &lt;em&gt;make mochitest-browser-chrome&lt;/em&gt;). What's interesting about this
file is that it's only used in local builds: our automation
infrastructure does not use &lt;em&gt;testsuite-targets.mk&lt;/em&gt;! Instead,
&lt;em&gt;mozharness&lt;/em&gt; and the old buildbot configs manually build up the
command used to invoke the test harnesses. Initially, the mach
commands for running tests simply invoked make targets defined
in &lt;em&gt;testsuite-targets.mk&lt;/em&gt;. Lately, we've been converting the mach
commands to invoke the Python test runners directly. I'd argue that
the logic for &lt;em&gt;invoke the test runner&lt;/em&gt; only needs to live in one
place in the tree. Furthermore as a build module peer, I have little
desire to support multiple implementations. Especially considering
how fragile they can be.&lt;/p&gt;
&lt;p&gt;I think we're trending towards an outcome where mach (or the code
behind mach commands) transitions into the authoratitive invocation
method and &lt;em&gt;legacy&lt;/em&gt; interfaces like &lt;em&gt;client.mk&lt;/em&gt; and
&lt;em&gt;testsuite-targets.mk&lt;/em&gt; are reimplemented to either call mach
commands or the same routine that powers them. Hopefully this
will be completely transparent to developers.&lt;/p&gt;
&lt;h3&gt;The future of mozconfigs and environment configuration&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;mozconfig&lt;/em&gt; files are shell scripts used to define variables consumed
by the build system. They are the only officially supported mechanism
for configuring how the build system works.&lt;/p&gt;
&lt;p&gt;I'd argue mozconfig files are a mediocre solution at best. First,
there's the issue of mozconfig statements that don't actually do
anything. I've seen no-op mozconfig content cargo culted into the
in-tree mozconfigs (used for the builder configurations)! Oops.
Second, doing things in mozconfig files is just awkward. Defining
the object directory requires &lt;em&gt;mk_add_options MOZ_OBJDIR=some-path&lt;/em&gt;.
What's &lt;em&gt;mk_add_options&lt;/em&gt;? If &lt;em&gt;some-path&lt;/em&gt; is relative, what is it
relative &lt;em&gt;to&lt;/em&gt;? While certainly addressable, the documentation on
how mozconfig files work is not terrific and fails to explain many
pitfalls. Even with proper documentation, there's still the issue
of the file format allowing no-op variable assignments to persist.&lt;/p&gt;
&lt;p&gt;I'm very tempted to reinvent build configuration as something not
mozconfigs. What exactly, I don't know. mach has support for ini-like
configuration files. We could certainly have mach and the build
system pull configs from the same file.&lt;/p&gt;
&lt;p&gt;I'm not sure what's going to happen here. But deprecating mozconfig
files as they are today is part of many of the options.&lt;/p&gt;
&lt;h3&gt;Handling multiple mozconfig files&lt;/h3&gt;
&lt;p&gt;A lot of developers only have a single mozconfig file (per source tree
at least). For these developers, life is easy. You simply install
your mozconfig in one of the default locations and it's automagically
used when you use mach or client.mk. Easy peasy.&lt;/p&gt;
&lt;p&gt;I'm not sure what the relative numbers are, but many developers
maintain multiple mozconfig files per source tree. e.g. they'll
have one mozconfig to build desktop Firefox and another one for
Android. They may have debug variations of each.&lt;/p&gt;
&lt;p&gt;Some developers even have a single mozconfig file but leverage the
fact that mozconfig files are shell scripts and have their
mozconfig dynamically do things depending on the current working
directory, value of an environment variable, etc.&lt;/p&gt;
&lt;p&gt;I've also seen wrapper scripts that glorify setting environment
variables, changing directory, etc and invoke a command.&lt;/p&gt;
&lt;p&gt;I've been thinking a lot about providing a common and well-supported
solution for switching between active build configurations.
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Developer_Guide/mach#Adding_mach_to_your_shell%27s_search_path&quot;&gt;Installing mach on $PATH&lt;/a&gt;
goes a long way to facilitate this. If you are in an object
directory, the mozconfig used when that object directory was
created is automatically applied. Simple enough. However, I want
people to start treating object directories as black boxes. So, I'd
rather not see people have their shell inside the object directory.&lt;/p&gt;
&lt;p&gt;Whenever I think about solutions, I keep arriving at a
virtualenv-like solution. Developers would potentially need to
&lt;em&gt;activate&lt;/em&gt; a Mozilla build environment (similar to how Windows
developers need to launch MozillaBuild). Inside this environment,
the shell prompt would contain the name of the current build
configuration. Users could switch between configurations using
&lt;em&gt;mach switch&lt;/em&gt; or some other magic command on the $PATH.&lt;/p&gt;
&lt;p&gt;Truth be told, I'm skeptical if people would find this useful. I'm
not sure it's that much better than exporting the MOZCONFIG
environment variable to define the active config. This one requires
more thought.&lt;/p&gt;
&lt;h3&gt;The integration between the build environment and Python&lt;/h3&gt;
&lt;p&gt;We use Python extensively in the build system and for common
developer tasks. mach is written in Python. moz.build processing
is implemented in Python. Most of the test harnesses are written in
Python.&lt;/p&gt;
&lt;p&gt;Doing practically anything in the tree requires a Python
interpreter that knows about all the Python code in the tree and
how to load it.&lt;/p&gt;
&lt;p&gt;Currently, we have two very similar Python environments. One is
a virtualenv created while running configure at the beginning of
a build. The other is essentially a cheap knock-off that mach
creates when it is launched.&lt;/p&gt;
&lt;p&gt;At some point I'd like to consolidate these Python environments.
From any Python process we should have a way to automatically
bootstrap/activate into a well-defined Python environment. This
certainly sounds like establishing a unified Python virtualenv
used by both the build system and mach.&lt;/p&gt;
&lt;p&gt;Unfortunately, things aren't straightforward. The virtualenv today
is constructed in the object directory. How do we determine the
current object directory? By loading the mozconfig file. How do we
do that? Well, if you are mach, we use Python. And, how does mach
know where to find the code to load the mozconfig file? You can
see the dilemma here.&lt;/p&gt;
&lt;p&gt;A related issue is that of portable build environments. Currently, a
lot of our automation recreates the build system's virtualenv from
its own configuration (not that from the source tree). This has
and will continue to bite us. We'd &lt;em&gt;really&lt;/em&gt; like to package up the
virtualenv (or at least its config) with tests so there is no
potential for discrepancy.&lt;/p&gt;
&lt;p&gt;The inner workings of how we integrate with Python should be
invisible to most developers. But, I figured I'd capture it
here because it's an annoying problem. And, it's also related
to an &lt;em&gt;activated&lt;/em&gt; build environment. What if we required all
developers to &lt;em&gt;activate&lt;/em&gt; their shell with a Mozilla build
environment (like we do on Windows)? Not only would this solve
Python issues, but it would also facilitate simpler config
switching (outlined above). Hmmm...&lt;/p&gt;
&lt;h3&gt;Direct interaction with the build system considered harmful&lt;/h3&gt;
&lt;p&gt;Ever since there was a build system developers have been typing
&lt;em&gt;make&lt;/em&gt; (or &lt;em&gt;make.py&lt;/em&gt;) to build the tree. One of the goals of the
transition to &lt;em&gt;moz.build&lt;/em&gt; files is to facilitate building the tree
with Tup. &lt;em&gt;make&lt;/em&gt; will do nothing when you're not using Makefiles!
Another goal of the &lt;em&gt;moz.build&lt;/em&gt; transition is to start
derecursifying the make build system such that we build things in
parallel. It's likely we'll produce monolithic make files and then
process &lt;em&gt;all&lt;/em&gt; targets for a related class &lt;em&gt;IDLs&lt;/em&gt;, &lt;em&gt;C++ compilation&lt;/em&gt;,
etc in one invocation of &lt;em&gt;make&lt;/em&gt;. So, uh, what happens during a partial
tree build? If a .cpp file from &lt;em&gt;/dom/src/storage&lt;/em&gt; is being handled by
a monolithic make file invoked by the Makefile at the top of the
tree, how does a partial tree build pick that up? Does it build just
that target or every target in the monolithic/non-recursive make file?&lt;/p&gt;
&lt;p&gt;Unless the build peers go out of our way to install redundant targets
in leaf Makefiles, directly invoking &lt;em&gt;make&lt;/em&gt; from a subdirectory of
the tree won't do what it's done for years.&lt;/p&gt;
&lt;p&gt;As I said above, I'm sympathetic to forced changes in procedure, so
it's likely we'll provide backwards-compatibile behavior. But, I'd
prefer to not do it. I'd first prefer partial-tree builds are not
necessary and a full tree build finishes quickly. But, we're not going
to get there for a bit. As an alternative, I'll take people building
through &lt;em&gt;mach build&lt;/em&gt;. That way, we have an easily extensible interface
on which to build partial tree logic. We saw this recently when
dumbmake/smartmake landed. And, going through &lt;em&gt;mach&lt;/em&gt; also reinforces my
ideal that the object directory is a black box.&lt;/p&gt;
&lt;h3&gt;Semi-persistent state&lt;/h3&gt;
&lt;p&gt;Currently, most state as it pertains to a checkout or build is in the
object directory. This is fine for artifacts from the build system.
However, there is a whole class of state that arguably shouldn't be in
the object directory. Specifically, it shouldn't be clobbered when you
rebuild. This includes logs from previous builds, the warnings database,
previously failing tests, etc. The list is only going to grow over time.&lt;/p&gt;
&lt;p&gt;I'd like to establish a location for semi-persistant state related to
the tree and builds. Perhaps we change the clobber logic to ignore a
specific directory. Perhaps we start storing things in the user's home
directory. Perhaps we could establish a second &lt;em&gt;object directory&lt;/em&gt; named
the &lt;em&gt;state directory&lt;/em&gt;? How would this interact with &lt;em&gt;build environments&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;This will probably sit on the backburner until there is a compelling use
case for it.&lt;/p&gt;
&lt;h3&gt;The battle against C++&lt;/h3&gt;
&lt;p&gt;Compiling C++ consumes the bulk of our build time. Anything we can do to
speed up C++ compilation will work wonders for our build times.&lt;/p&gt;
&lt;p&gt;I'm optimistic things like precompiled headers and compiling multiple
.cpp files with a single process invocation will drastically decrease
build times. However, no matter how much work we put in to make C++
compilation faster, we still have a giant issue: dependency hell.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;http://gregoryszorc.com/presentations/2012-11-29-firefox-build-system/#34&quot;&gt;shown&lt;/a&gt; in my
build system presentation a few months back, we have dozens of header
files included by hundreds if not thousands of C++ files. If you change
one file: you invalidate build dependencies and trigger a rebuild. This
is why whenever files like mozilla-config.h change you are essentially
confronted with a full rebuild. ccache may help if you are lucky. But, I
fear that as long as headers proliferate the way they do, there is
little the build system by itself can do.&lt;/p&gt;
&lt;p&gt;My attitude towards this is to wait and see what we can get out of
precompiled headers and the like. Maybe that makes it good enough. If
not, I'll likely be making a lot of noise at Platform meetings
requesting that C++ gurus brainstorm on a solution for reducing
header proliferation.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Belive it or not, these are only some of the topics floating around in
my head! But I've probably managed to bore everyone enough so I'll
call it a day.&lt;/p&gt;
&lt;p&gt;I'm always interested in opinions and ideas, especially if they are
different from mine. I encourage you to leave a comment if you have
something to say.&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 17:25:00 +0000</pubDate>
</item>
<item>
	<title>Rob Campbell: Firefox 23 Developer Tools Fixes</title>
	<guid isPermaLink="false">http://robcee.net/?p=93</guid>
	<link>http://robcee.net/2013/new-features-in-firefox-developer-tools-episode-23/</link>
	<description>&lt;div class=&quot;csv2table-div&quot; id=&quot;view1&quot; style=&quot;padding: 0px; margin: 1px;&quot;&gt;
&lt;table class=&quot;csv2table-table&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th class=&quot;csv2table-table-th&quot; id=&quot;view1-th-0&quot; style=&quot;border-color: #eeeeee #999999 #777777 #bbbbbb; border-style: solid; border-width: 1px; background-color: #cccccc; font-size: 12px; padding: 4px; text-align: center;&quot;&gt;Bug ID&lt;/th&gt;
&lt;th class=&quot;csv2table-table-th&quot; id=&quot;view1-th-1&quot; style=&quot;border-color: #eeeeee #999999 #777777 #bbbbbb; border-style: solid; border-width: 1px; background-color: #cccccc; font-size: 12px; padding: 4px; text-align: center;&quot;&gt;Summary&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=581352&quot;&gt;581352&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Console HTTP output should make JSON viewable as objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=586125&quot;&gt;586125&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;“””Copy”” “”Select All”” etc. popup menu item in the Web Console displays keyboard shortcuts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=587757&quot;&gt;587757&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Implement Browser Console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=638953&quot;&gt;638953&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Cannot copy keys or values in web console object inspector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=640225&quot;&gt;640225&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Make Property Panels Editable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=688400&quot;&gt;688400&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Web Console throws a TypeError when trying to display objects with no toString method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=688401&quot;&gt;688401&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Web Console displays “”[null]“” for [Object.create(null)]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=711846&quot;&gt;711846&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_webconsole_bug_595934_message_categories.js | Test timed out (mostly on WinXP PGO)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=725771&quot;&gt;725771&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;xpath use in console returns null elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=744741&quot;&gt;744741&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;console.dir tree is empty with cached messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=748851&quot;&gt;748851&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Web Developer Console incorrectly displays escaped hex/unicode characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=757897&quot;&gt;757897&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;All code in the web console is considered to be at line 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=774365&quot;&gt;774365&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Web Console setTimeout can’t find declared functions by name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=783499&quot;&gt;783499&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Web Console should use the debugger API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=808370&quot;&gt;808370&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Use the VariablesView in webconsole&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=809424&quot;&gt;809424&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_webconsole_bug_611795.js | The unknown CSS property warning is displayed only once – Got 1, expected 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=831400&quot;&gt;831400&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent devtools/webconsole/test/browser_webconsole_bug_764572_output_open_url.js| Timed out while waiting for: complete to initialize the opening tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=836720&quot;&gt;836720&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;“”InternalError: too much recursion”” not correctly caught&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=840093&quot;&gt;840093&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Text in object inspector can’t be copied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=841129&quot;&gt;841129&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_repeated_messages_accuracy.js | two repeats for the second css warning – Got 1, expected 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=843287&quot;&gt;843287&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;UI improvements for the variables view and sidebar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=847349&quot;&gt;847349&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Variables View should have left arrow do collapse and navigate in separate steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=853568&quot;&gt;853568&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittentbrowser_webconsole_bug_599725_response_headers.js | we do not have the Content-Type header | Content-Length != 60 – Didn’t expect 60, but got it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855058&quot;&gt;855058&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser/dom/tests/browser/browser_ConsoleAPITests.js | timer duration is positive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=857441&quot;&gt;857441&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Autocompletion popup is very jumpy while typing text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859170&quot;&gt;859170&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Trying to select [...] for a very long message printed to the web console will hang Firefox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859818&quot;&gt;859818&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;ConsoleAPIStorage.jsm tries to delete var-declared _consoleStorage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859858&quot;&gt;859858&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_bug664688_sandbox_update_after_navigation.js | Timed out while waiting for: window.location.href result is displayed after goBack(), browser_repeated_messages_accuracy.js | Timed out while waiting for: messages displayed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862024&quot;&gt;862024&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Warning about replaced window.console API shows when content scripts do not change the object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=863943&quot;&gt;863943&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittentbrowser_webconsole_bug_602572_log_bodies_checkbox.js | Test timed out, browser_webconsole_bug_603750_websocket.js | uncaught exception – ReferenceError: ok is not defined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865288&quot;&gt;865288&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;console.log with different object logged from same line number are grouped together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865792&quot;&gt;865792&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Firefox for Android remote console doesn’t evaluate JS expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865871&quot;&gt;865871&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Object inspector can’t be closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=677930&quot;&gt;677930&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Style Inspector: make URLs clickable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=777681&quot;&gt;777681&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;[rule view] Abbreviate long CSS file names source links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=777877&quot;&gt;777877&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Switch CssRuleView.jsm back to WeakMaps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=854948&quot;&gt;854948&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;GCLI context.environment.contentDocument points to doc from when GCLI first opened&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855502&quot;&gt;855502&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;we need a proper design for the new checkboxes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855520&quot;&gt;855520&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;“”No element selected”” in the inspector sidebar could use some margins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861908&quot;&gt;861908&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Destroying Inspector without destroying Toolbox fails.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=866381&quot;&gt;866381&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Inspector shouldn’t break if target is a chrome document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=679364&quot;&gt;679364&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Use either content/devtools/* or content/browser/devtools/* for aliases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=851231&quot;&gt;851231&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Output console.jsm API calls to the browser console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855544&quot;&gt;855544&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Implement a network monitor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855763&quot;&gt;855763&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;[ResponsiveMode] Intermittent browser_responsiveuiaddcustompreset.js | Test timed out, | Found a tab after previous test timed out: data:text/html,foo,browser_Services.js | Services.prompt is an nsIPromptService&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855914&quot;&gt;855914&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Start using the jetpack loader in devtools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859089&quot;&gt;859089&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;[netmonitor] Under very constrained sizes text in the timeline view is sometimes not rendered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859221&quot;&gt;859221&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;[netmonitor] Sizes are displayed in KB not kb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861197&quot;&gt;861197&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;chrome.manifest files created by the devtools loader should be ignored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=723923&quot;&gt;723923&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Debugger ‘breakpoint list’ GCLI command should have extra nice output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=792815&quot;&gt;792815&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Update promise usage in gcli commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=831720&quot;&gt;831720&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;GCLI needs an appcache command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861192&quot;&gt;861192&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;gcli addon command shows [object Object] instead of a list of addons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865680&quot;&gt;865680&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;devtools.gcli.allowSet is in firefox.js twice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=869233&quot;&gt;869233&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;TEST-UNEXPECTED-FAIL | browser_cmd_appcache_valid.js | html output for appcache validate should match successfully. Actual textContent: “”Manifest URI…””&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=739031&quot;&gt;739031&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Check for unused strings not used in translation (e.g. scoped.label) and remove them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=740541&quot;&gt;740541&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Style sheets in iframes are not listed in the style editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=816967&quot;&gt;816967&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Remotable Style Editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=866264&quot;&gt;866264&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent devtools/styleeditor/test/browser_styleeditor_new.js | new editor shows 1 rule after modification – Got 2, expected 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=772119&quot;&gt;772119&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;expose source mapped sources over the remote debugging protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=818134&quot;&gt;818134&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Allow multiple debuggers in toolboxes to debug separate tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=832231&quot;&gt;832231&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;After a reload, breakpoints require multiple resumes to allow execution to continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=837723&quot;&gt;837723&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;[jsdbg2] Debugger should provide a way to get Debugger.Object referents directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=840292&quot;&gt;840292&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;The debugger’s xpcshell tests should use listTabs/attachTab instead of listContexts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=843187&quot;&gt;843187&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Variables view: going down through the properties via keyboard is really broken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=849069&quot;&gt;849069&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;relative source map URLs should be resolved according to the spec’s rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=849071&quot;&gt;849071&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Create some kind of chrome to turn source mapping on/off in the debugger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=850738&quot;&gt;850738&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Add a crap load of telemetry tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=851836&quot;&gt;851836&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;breakpoints[aLocation.line] is undefined after bug 820012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=853787&quot;&gt;853787&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Report errors in nested event loops in xpcshell tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=856232&quot;&gt;856232&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;initialize globalActorFactories upon declaring DebuggerServer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859181&quot;&gt;859181&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Variables view closes immediately on first open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=860349&quot;&gt;860349&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_dbg_createChrome.js | application timed out after 330 seconds with no output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861783&quot;&gt;861783&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Removing watch expression of large object not possible via mouse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861817&quot;&gt;861817&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Stop using Ctrl+Shift+O shortcut for function searching.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861852&quot;&gt;861852&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Telemetry data from the remote protocol always appear in the remote buckets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862142&quot;&gt;862142&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;remote debugger doesn’t find any sources for simulator on nightly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862186&quot;&gt;862186&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;remove unused FileUtils import in DebuggerUI.jsm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862360&quot;&gt;862360&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Use the exported Promise.all instead of reimplementing it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=863571&quot;&gt;863571&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Enable source map xpcshell tests on B2G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=864802&quot;&gt;864802&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;The _store on each variables view instance is redundant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=864900&quot;&gt;864900&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;The listTabs protocol request can fail if made immediately after a tab is closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865073&quot;&gt;865073&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;remote debugging protocol: handlers should systematically catch and log exceptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865328&quot;&gt;865328&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;JS debugger: clean up DebuggerClient.prototype.close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865509&quot;&gt;865509&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;JS debugger: UnsolicitedPauses in dbg-client.jsm should mention ‘exception’&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=866278&quot;&gt;866278&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;remote debugging protocol: number packets when dumping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=867481&quot;&gt;867481&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Remote debugging connection screen is broken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=839515&quot;&gt;839515&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Tiny fonts in the remote connection screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=849500&quot;&gt;849500&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;navigate and will-navigate events for remoted targets carry payload that is incompatible with the non-remoted case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=851546&quot;&gt;851546&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Create an Options panel for the toolbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=857082&quot;&gt;857082&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;TabTarget.makeRemote doesn’t need any arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859569&quot;&gt;859569&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Target.makeRemote should attachTab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=860101&quot;&gt;860101&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;payload._navPayload is a Window in ‘will-navigate’ event handler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862294&quot;&gt;862294&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Sidebar should be responsive in docked Toolbox.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862363&quot;&gt;862363&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Sync the killswitch upon (un)registering of a tool and respect it in Options Panel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862398&quot;&gt;862398&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Maintain the order of tools in the tab and the options panel list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=863600&quot;&gt;863600&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_toolbox_options.js on Windows PGO builds | Test timed out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=851381&quot;&gt;851381&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Make the Scratchpad evaluate asynchronously&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865803&quot;&gt;865803&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Unable to save Scratchpads, Style Editor, about:memory, … on OS X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=852777&quot;&gt;852777&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Make Tilt more extensible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862435&quot;&gt;862435&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Tilt doesn’t open if the Inspector was opened beforehand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=855244&quot;&gt;855244&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Profiler hangs after pressing “”Stop”” if it was started in multiple profiles in different tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=856797&quot;&gt;856797&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Typo in “”profilerNotStarted”” in gclicommands.properties&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=858759&quot;&gt;858759&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;profiler.css in browser/devtools/ should actually be in browser/themes instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859062&quot;&gt;859062&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Hide right arrow in the SideMenuWidget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859085&quot;&gt;859085&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Add tooltips to all labels in the UI that may have cropped values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859308&quot;&gt;859308&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Hide Blocked in Timings tab until we know what that’s doing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859968&quot;&gt;859968&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;JSONP requests are not parsed into a tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=859980&quot;&gt;859980&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;JSON request not parsed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=860055&quot;&gt;860055&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;SideMenuWidget shouldn’t scroll back to the selected item when new requests are coming in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=860175&quot;&gt;860175&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;On netmonitor examining the specific details of a network action leads to bad overlapping display&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=860232&quot;&gt;860232&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Function callbacks in jsonp responses should be displayed in the Response tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861487&quot;&gt;861487&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Sizes are displayed with non-localized decimal separator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862198&quot;&gt;862198&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittent browser_net_json-long.js | Test timed out, found a tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=864176&quot;&gt;864176&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Details pane should remember its height when docked on the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=864519&quot;&gt;864519&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Several Netmonitor tests fail when ECMAScript Internationalization API is enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;csv2table-table-td csv2table-hoboNum&quot;&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=866091&quot;&gt;866091&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;csv2table-table-td&quot;&gt;Intermittentdevtools/netmonitor/test/browser_net_prefs-reload.js | Test timed out | Found a tab after previous test timed out: http://example.com/browser/browser/devtools/netmonitor/test/html_simple-test-page.html and tons of fallout&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://bugzilla.mozilla.org/buglist.cgi?list_id=6499762&amp;amp;resolution=FIXED&amp;amp;classification=Client%20Software&amp;amp;chfieldto=2013-05-13&amp;amp;chfield=target_milestone&amp;amp;query_format=advanced&amp;amp;chfieldfrom=2013-03-20&amp;amp;chfieldvalue=Firefox%2023&amp;amp;bug_status=RESOLVED&amp;amp;bug_status=VERIFIED&amp;amp;component=Developer%20Tools&amp;amp;component=Developer%20Tools%3A%203D%20View&amp;amp;component=Developer%20Tools%3A%20Console&amp;amp;component=Developer%20Tools%3A%20Debugger&amp;amp;component=Developer%20Tools%3A%20Framework&amp;amp;component=Developer%20Tools%3A%20Graphic%20Commandline%20and%20Toolbar&amp;amp;component=Developer%20Tools%3A%20Inspector&amp;amp;component=Developer%20Tools%3A%20Netmonitor&amp;amp;component=Developer%20Tools%3A%20Profiler&amp;amp;component=Developer%20Tools%3A%20Responsive%20Mode&amp;amp;component=Developer%20Tools%3A%20Scratchpad&amp;amp;component=Developer%20Tools%3A%20Source%20Editor&amp;amp;component=Developer%20Tools%3A%20Style%20Editor&amp;amp;product=Firefox&quot;&gt;Firefox 22 – 23.&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 16:40:51 +0000</pubDate>
	<dc:creator>rob</dc:creator>
</item>
<item>
	<title>Jared Wein: We’re Jamun!</title>
	<guid isPermaLink="false">http://msujaws.wordpress.com/?p=3196</guid>
	<link>http://msujaws.wordpress.com/2013/05/13/were-jamun/</link>
	<description>&lt;p&gt;&lt;img alt=&quot;2013-05-10_1511&quot; class=&quot;aligncenter size-medium wp-image-3197&quot; height=&quot;177&quot; src=&quot;http://msujaws.files.wordpress.com/2013/05/2013-05-10_1511.png?w=300&amp;amp;h=177&quot; style=&quot;border-radius: 5px;&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Well, we &lt;em&gt;were&lt;/em&gt; “jamun”. This past week we shut off the Jamun project branch of Australis and moved our focus to the UX branch.&lt;/p&gt;
&lt;h3&gt;What does all this mean?&lt;/h3&gt;
&lt;p&gt;In a nutshell, this means that the Australis customization rewrite has progressed enough to the point that we feel it is ready to start getting much broader testing. We’re in the final stretch of the project, and we want our changes to reach testers at a faster pace.&lt;/p&gt;
&lt;p&gt;Here’s where we stand today:&lt;br /&gt;
* Most customization workflows are possible. Not all UI migrations are complete.&lt;br /&gt;
* Most polish on the edges isn’t there. It does however look pretty close on Windows and Mac now.&lt;br /&gt;
* Some final graphics are missing, but they’re not far away.&lt;/p&gt;
&lt;h3&gt;Wait, wait, what are we talking about here?&lt;/h3&gt;
&lt;p&gt;Ah, okay, I’ll take a step back. A while back, in fact, a looooong time ago… there was a presentation from the Firefox UX team about a new browser UI refresh and rewrite of our customization workflows. It turns out that many users don’t know that Firefox is customizable. Some users accidentally customize their browser and don’t know what went wrong. Then, there’s this super-tiny super-expert user group that has figured out how to customize Firefox and they *adore* it.&lt;/p&gt;
&lt;h3&gt;So, what are we doing about it?&lt;/h3&gt;
&lt;p&gt;Well, the first thing that we’re doing is making entering and exiting customization of Firefox much easier. No longer will a user have to right-click on a special portion of a toolbar and choose “Customize…”. This was &lt;em&gt;way&lt;/em&gt; too hard to find for the vast majority of users. We’ve left that same entry point there, but we’ve also created a very visible “Customize” button.&lt;/p&gt;
&lt;h3&gt;Sounds good, where is this Customize button though?&lt;/h3&gt;
&lt;p&gt;Great question! Another goal of Australis is to unify the user experience between Windows, OS X, and Linux. On Windows and Linux, Firefox has an “Application Menu” in the top-left corner of the browser. We’ve moved this menu to the right-side of the navigation toolbar and it will now be visible on all three platforms. We’ve also been hard at work trying to make this menu easy to use and navigate. The Customize button is located at the bottom of this menu.&lt;/p&gt;
&lt;p&gt;Another really cool thing about this menu is that it will be customizable. When you enter Customization mode, you’ll be able to add, remove, and rearrange items in the menu as well as items on the toolbars.&lt;/p&gt;
&lt;p&gt;Here’s a screenshot of what the Customization mode looks like today on Windows:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://msujaws.files.wordpress.com/2013/05/2013-05-08_1343.png&quot;&gt;&lt;img alt=&quot;2013-05-08_1343&quot; class=&quot;aligncenter size-large wp-image-3199&quot; src=&quot;http://msujaws.files.wordpress.com/2013/05/2013-05-08_1343.png?w=480&quot; style=&quot;border: 4px solid rgb(34,34,34); margin: 1em auto; width: 460px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned earlier, all of this is still very much a “work-in-progress”, so it’s expected that people will find bugs and rough edges. If you’d like to play with it today, you can &lt;a href=&quot;http://msuja.ws/ux&quot;&gt;download the UX Nightly builds and give it a run&lt;/a&gt;. The UX Nightly builds will update daily with new changes to the customization.&lt;/p&gt;
&lt;p&gt;Please let us know about any bugs that you find by filing a bug in Bugzilla in the Firefox::Theme or Firefox::Toolbars component (and mark the bug as blocking bug 770135). If you don’t feel comfortable doing the above, then just leave a comment on this blog post and I or someone else will file the bug for you.&lt;/p&gt;
&lt;br /&gt; Tagged: &lt;a href=&quot;http://msujaws.wordpress.com/tag/australis/&quot;&gt;australis&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/firefox/&quot;&gt;firefox&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/mozilla/&quot;&gt;mozilla&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/planet-mozilla/&quot;&gt;planet-mozilla&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/usability/&quot;&gt;usability&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/msujaws.wordpress.com/3196/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/msujaws.wordpress.com/3196/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=msujaws.wordpress.com&amp;amp;blog=5511932&amp;amp;post=3196&amp;amp;subd=msujaws&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 13 May 2013 16:00:02 +0000</pubDate>
	<dc:creator>msujaws</dc:creator>
</item>
<item>
	<title>Niko Matsakis: Recurring closures and dynamically sized types</title>
	<guid isPermaLink="false">http://smallcultfollowing.com/babysteps/blog/2013/05/13/recurring-closures-and-dynamically-sized-types</guid>
	<link>http://smallcultfollowing.com/babysteps/blog/2013/05/13/recurring-closures-and-dynamically-sized-types/</link>
	<description>&lt;p&gt;I realized today that there is an unfortunate interaction between the
proposal for &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2013/04/30/dynamically-sized-types/&quot;&gt;dynamically sized types&lt;/a&gt; and closure types. In
particular, in the &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2013/04/30/the-case-of-the-recurring-closure/&quot;&gt;case of the recurring closure&lt;/a&gt;, I described
the soundness issues that arise in our language when closures are able
to recurse.&lt;/p&gt;

&lt;p&gt;My solution for this was to make the type system treat a &lt;code&gt;&amp;amp;fn()&lt;/code&gt; value
the same way it treats &lt;code&gt;&amp;amp;mut T&lt;/code&gt; pointers: they would be non-copyable,
and when you invoke them, that would be effectively like a “mutable
borrow”, meaning that for the duration of the call the original value
would become inaccessible. So in short the type system would guarantee
that when you call a closure, that same closure is not accessible from
any other path in the system, just as we now guarantee that when you
mutate a value, that same value is not accessible from any other path
in the system.&lt;/p&gt;

&lt;p&gt;This is all well and good, and I think this treatment would be largely
invisible to the user under common access patterns. However, it does
not play well with the proposal for &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2013/04/30/dynamically-sized-types/&quot;&gt;dynamically sized types&lt;/a&gt;,
because under this proposal all things written &lt;code&gt;&amp;amp;T&lt;/code&gt; must behave the
same, no matter what &lt;code&gt;T&lt;/code&gt; is. This is in fact &lt;em&gt;the whole point&lt;/em&gt; of the
proposal! But here I want to treat &lt;code&gt;&amp;amp;fn&lt;/code&gt; specially.&lt;/p&gt;

&lt;p&gt;I’ve been pondering various solutions this morning. I have come up
with two possible avenues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Instead of writing &lt;code&gt;&amp;amp;fn()&lt;/code&gt; you could write &lt;code&gt;&amp;amp;mut fn()&lt;/code&gt;. This is
perhaps the “principled” solution, but I consider it rather a
non-starter.  Writing &lt;code&gt;&amp;amp;fn()&lt;/code&gt; for a closure is…tolerable, but &lt;code&gt;&amp;amp;mut
fn()&lt;/code&gt; is not. It’s verbose and it seems sort of nonsensical (although
there is some logic to it, when you consider that calls to the
function may mutate the environment and so forth).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We go back to the older notation and move sigils for closures
&lt;em&gt;after&lt;/em&gt; the fn. This actually has some notational perks. For example,
rather than writing &lt;code&gt;&amp;amp;fn()&lt;/code&gt; we can just write &lt;code&gt;fn()&lt;/code&gt; (if there is no
sigil, we can default to &lt;code&gt;&amp;amp;&lt;/code&gt;). On the minus side, a sendable closure
would be written &lt;code&gt;fn~()&lt;/code&gt;—but, then again, under the dynamically
sized types proposal, sendable closures were going to be written
&lt;code&gt;~fn:Owned()&lt;/code&gt;, so is &lt;code&gt;fn~()&lt;/code&gt; really so bad?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;More details after the fold.&lt;/p&gt;




&lt;p&gt;OK, let’s dig into the details a bit more. As anyone who has been
following my blog posts probably knows by now, there are many, many
use cases for closures. I want to dive into the use cases that are on
my mind and elaborate on them. I also want to take this case to write
up a bit more thoroughly how I think closures should work, including a
few unrelated issues.&lt;/p&gt;

&lt;h3&gt;Syntax and use cases&lt;/h3&gt;

&lt;p&gt;Here is a list of use cases to be accommodated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;“Higher-order functions”: simple functions like &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;fold&lt;/code&gt;
and so forth. By far the most common use case.&lt;/li&gt;
&lt;li&gt;“Once functions”: functions that can only execute once. This means
that they can move values out of their environment.&lt;/li&gt;
&lt;li&gt;“Sendable functions”: functions that can be sent between tasks.
This means that they only close over “sendable” values (no
garbage-collected data or borrowed pointers).&lt;/li&gt;
&lt;li&gt;“Sendable once functions”: sendable functions that can only execute
once. This is what a task body will be.&lt;/li&gt;
&lt;li&gt;“Const functions”: functions that do not close over mutable state.
We don’t make much use of this yet, but I plan to do so in order to
achieve lightweight fork-join parallelism a la &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/categories/pjs&quot;&gt;PJS&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The use cases above seem to me to be the “bread and butter” cases that
will arise frequently. I will go over the syntax and give an example
for each of those use cases shortly. Interestingly, I think that all
of them actually read reasonably well if the sigils are moved after
the &lt;code&gt;fn&lt;/code&gt; keyword, and in some cases the examples read much better.&lt;/p&gt;

&lt;p&gt;However, there are two additional use cases that I have considered in
the past which I left out. These use cases become significantly harder
to read under the new proposal (though they were always hard to read).
Interestingly, I realized while writing this blog post that I think
these use cases are no longer terribly important, since both of them
can be expressed equally well using objects instead of closures, as I
will explain shortly. The two use cases are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;“Sendable const functions”: functions that can be sent between tasks
&lt;em&gt;and&lt;/em&gt; do not close over mutable state. You could safely share such
functions between tasks in an ARC (atomically referenced counted
container) and execute them multiple times in parallel.&lt;/li&gt;
&lt;li&gt;“Combinators”: combinator libraries create &lt;em&gt;and return&lt;/em&gt; closures that
closure over their arguments, which may include borrowed values.&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;Higher-order functions&lt;/h4&gt;

&lt;p&gt;Here is an example of a simple higher-order function (with the closure
type highlighted):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;impl&amp;lt;T:Sized&amp;gt; for [T] {
    pub fn map&amp;lt;U:Sized&amp;gt;(f: fn(&amp;amp;T) -&amp;gt; U) -&amp;gt; ~[U] { ... }
                        // ^~~~~~~~~~~
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For contrast, this is &lt;code&gt;&amp;amp;fn(&amp;amp;T) -&amp;gt; U&lt;/code&gt; today.&lt;/p&gt;

&lt;h4&gt;Once functions&lt;/h4&gt;

&lt;p&gt;Here is an example of a higher-order function that executes at most
once:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;impl&amp;lt;T:Sized&amp;gt; for Option&amp;lt;T&amp;gt; {
    pub fn each(f: once fn(&amp;amp;T) -&amp;gt; bool) -&amp;gt; bool { ... }
                // ^~~~~~~~~~~~~~~~~~~
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For contrast, this is &lt;code&gt;&amp;amp;once fn(&amp;amp;T) -&amp;gt; U&lt;/code&gt; today.&lt;/p&gt;

&lt;h4&gt;Sendable functions and sendable once functions&lt;/h4&gt;

&lt;p&gt;Here is an example of a sendable once function:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fn spawn(f: once fn~()) {...}
         // ^~~~~~~~~~
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;~&lt;/code&gt; after the &lt;code&gt;fn&lt;/code&gt; tells the type system that the environment for
this function is allocated using an owned pointer. It also implies a
default bound of &lt;code&gt;Owned&lt;/code&gt;. The &lt;code&gt;once&lt;/code&gt; tells the type system that the
function will only execute once.&lt;/p&gt;

&lt;p&gt;For contrast, this is &lt;code&gt;~once fn()&lt;/code&gt; today.&lt;/p&gt;

&lt;h4&gt;Const functions&lt;/h4&gt;

&lt;p&gt;Here is an example of how I would use a const function to achieve
lightweight parallelism:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;impl&amp;lt;T:Sized&amp;gt; for [T] {
    pub fn par_map&amp;lt;U:Sized&amp;gt;(f: fn:Const(&amp;amp;T) -&amp;gt; U) -&amp;gt; bool { ... }
                            // ^~~~~~~~~~~~~~~~~
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is a parallel map function. It is similar to the regular map
except that its iterations execute in parallel. As a consequence, it
demands a &lt;code&gt;fn:Const&lt;/code&gt; rather than a &lt;code&gt;fn&lt;/code&gt;—the &lt;code&gt;Const&lt;/code&gt; bound specifies
that all the environmental state must be immutable. This is exactly
the “patient parent” or “parallel closures” model that is used in
&lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/categories/pjs&quot;&gt;PJS&lt;/a&gt; and described in &lt;a href=&quot;https://www.usenix.org/conference/hotpar12/parallel-closures-new-twist-old-idea&quot;&gt;this HotPar paper I wrote&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For contrast, this is &lt;code&gt;&amp;amp;fn:Const()&lt;/code&gt; today.&lt;/p&gt;

&lt;h4&gt;Sendable const functions&lt;/h4&gt;

&lt;p&gt;Sendable const functions are one of the two cases that I said would
become less attractive under the new proposal. They would look
something like &lt;code&gt;fn~:Const&lt;/code&gt; (vs &lt;code&gt;~fn:Const&lt;/code&gt; today). The newer syntax
works and should be available, but it’s hard to read, due I think to
the juxtaposition of &lt;code&gt;~&lt;/code&gt; (which specifies the kind of pointer used for
the environment) and the &lt;code&gt;:&lt;/code&gt; that begins the bound specifier &lt;code&gt;:Const&lt;/code&gt;.
If this use case were important, I might be worried that the syntax is
too ugly, but when I tried to come up with an example for where this
use case would be needed, I realize that time has left the use case
behind to some extent.&lt;/p&gt;

&lt;p&gt;The primary use case for a sendable const function initially was to
allow hashtables to be placed in ARCs—the reason for this was that a
&lt;code&gt;HashMap&lt;/code&gt; requires closures for for computing the hash function of its
argument, and those to share the hashmap (and perform parallel
lookups) we had to be sure that the closures would not mutate any
state. However, this is somewhat outdated, because hashing and
equality comparison today is based on traits rather than closures.&lt;/p&gt;

&lt;p&gt;Now, using traits is somewhat limited, because due to coherence it
means that any one type can only be hashed in one way, and sometimes
you would like to have specialized hashing for specific circumstances.
But these use cases can easily be accommodated in three ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using newtyped keys (&lt;code&gt;struct MyKey(key)&lt;/code&gt;) and defining different
implementations for the hashing and equality traits on &lt;code&gt;MyKey&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If a newtyped key is not acceptable, you can write a hash table
that takes a simple function pointer (&lt;code&gt;extern &quot;Rust&quot; fn&lt;/code&gt;) rather
than a closure. Function pointers carry no state, but state is
rarely needed for equality comparisons.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you really need state, then you can write a specialized trait
in lieu of a closure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;trait HashFuncs&amp;lt;K&amp;gt; {
    fn hash(&amp;amp;self, k: &amp;amp;K) -&amp;gt; uint;
    fn eq(&amp;amp;self, k1: &amp;amp;K, k2: &amp;amp;K) -&amp;gt; bool;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now your hashtable can either take a &lt;code&gt;~HashFuncs&lt;/code&gt; object to use
for hashing and equality comparison or, if you wish to avoid
dynamic dispatch for performance reasons, you can parameterize
your hashtable type by the instance of &lt;code&gt;HashFuncs&lt;/code&gt; that it should use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;struct MyHashMap&amp;lt;K,V,F:HashFuncs&amp;lt;K&amp;gt;&amp;gt; {
    f: F,
    ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;Combinators&lt;/h4&gt;

&lt;p&gt;General purpose combinators are the other case that (might) get less
attractive. This is less clear cut. The idea of a combinator library
is that you have functions that return functions, and then you can
compose these functions into bigger functions. The most common example
is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Parser_combinator&quot;&gt;parser combinator&lt;/a&gt;, which is a simple way to create
inefficient and buggy parsers (ok, that’s unfair, but I couldn’t
resist; I’ve had some bad experiences trying to scale up parser
combinators—truth is, they are super nice to work with, at least
until things go wrong).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Anyway,&lt;/em&gt; a typical parser combinator library would begin with a primitive
like the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fn expect(c: char) -&amp;gt; fn@(&amp;amp;mut ParseState) -&amp;gt; Result&amp;lt;(), Err&amp;gt; { ... }
                   // ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that the function returns a closure. We used &lt;code&gt;fn@&lt;/code&gt; because this
closure must be allocated on some heap in order for us to return it,
and because using the type &lt;code&gt;fn@&lt;/code&gt; (vs say &lt;code&gt;fn~&lt;/code&gt;) would allow us to
close over managed and other task-local data. So far, I think this
example works out fine.&lt;/p&gt;

&lt;p&gt;Where things get more complex is if we want to close over borrowed
pointers.  For example, imagine an &lt;code&gt;expect&lt;/code&gt; function that takes a
slice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fn expect_string&amp;lt;'a&amp;gt;(s: &amp;amp;'a str)
                     -&amp;gt; fn@:'a(&amp;amp;mut ParseState) -&amp;gt; Result&amp;lt;(), Err&amp;gt; {...}
                     // ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here the type system will require that the lifetime &lt;code&gt;'a&lt;/code&gt; of the input
slice &lt;code&gt;s&lt;/code&gt; appear in the resulting function type, so that it can be
sure that the function is not used after the slice is no longer valid.
This makes the type more complicated: &lt;code&gt;fn@:'a&lt;/code&gt; (vs the
also-not-especially-intuitive notation of &lt;code&gt;@'a fn&lt;/code&gt; today).&lt;/p&gt;

&lt;p&gt;Of course, one could address this problem by having &lt;code&gt;expect_string&lt;/code&gt;
take a &lt;code&gt;~str&lt;/code&gt; or &lt;code&gt;@str&lt;/code&gt; instead of a borrowed string, but in some use
cases borrowed pointers may perfect sense. For example, I had once
thought to use this pattern to create a combinator library for
expressing iteration primitives like &lt;code&gt;enumerate&lt;/code&gt; and so forth
(similar, experimental work is now underway in the &lt;code&gt;iter&lt;/code&gt; module).&lt;/p&gt;

&lt;p&gt;Interestingly, just as with sendable const closures, objects and
traits can provide an alternative that is ultimately (I think) a
better and more readable design anyway. We could rewrite the return
type from a closure into a trait:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;trait Parser&amp;lt;R&amp;gt; {
    fn parse(&amp;amp;mut ParseState) -&amp;gt; Result&amp;lt;R,Error&amp;gt;;
}

fn expect(c: char) -&amp;gt; @Parser&amp;lt;()&amp;gt;;
fn expect_string&amp;lt;'a&amp;gt;(s: &amp;amp;'a str) -&amp;gt; @Parser:'a&amp;lt;()&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here in the &lt;code&gt;expect_string&lt;/code&gt; case I have taken advantage of the fact
that object types will also carry bounds similar to closure types.  An
advantage of this design is that using a trait allows the &lt;code&gt;Parser&lt;/code&gt;
objects to carry more methods as well.&lt;/p&gt;

&lt;p&gt;If we were to extend the example to include an actual &lt;em&gt;combinator&lt;/em&gt;,
I imagine it would look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fn or&amp;lt;'a, R&amp;gt;(p1: @Parser:'a&amp;lt;R&amp;gt;, p2: @Parser:'a&amp;lt;R&amp;gt;) -&amp;gt; @Parser:'a&amp;lt;R&amp;gt; {...}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Of course, for maximum efficiency, one would avoid using object types
altogether. Then you would just implement &lt;code&gt;Parser&lt;/code&gt; directly on
the &lt;code&gt;char&lt;/code&gt; and &lt;code&gt;&amp;amp;str&lt;/code&gt; types, and perhaps write the &lt;code&gt;or&lt;/code&gt; combinator
like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;struct or&amp;lt;P1,P2&amp;gt;(P1, P2);

impl&amp;lt;R,P1:Parser&amp;lt;R&amp;gt;,P2:Parser&amp;lt;R&amp;gt;&amp;gt; Parser for or&amp;lt;P1,P2&amp;gt; {
  fn parse(&amp;amp;self, state: &amp;amp;mut ParseState) -&amp;gt; Result&amp;lt;R,Error&amp;gt; {
    let (ref p1, ref p2) = *self;
    state.try(); // (*)
    match p1.parse(state) {
      Ok(r) =&amp;gt; { state.confirm(); Ok(r) }
      Err(_) =&amp;gt; { state.backtrack(); p2.parse() }
    }
  }
}

// (*) Here you see my imperative roots. A true functional
// programmer would not use in-place mutation here but rather
// clone and return a new parser state.
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;Another long post mostly targeted at rust devs and myself. Sorry about
that. I think the bottom line is that we should move sigils for
closures and have them appear after the &lt;code&gt;fn&lt;/code&gt; keyword. This makes me
sad, because this is how things used to be, and in fact one of the
main goals of the &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2013/04/30/dynamically-sized-types/&quot;&gt;dynamically sized types (DST)&lt;/a&gt; proposal was to
move the sigils in closure types in front. But of course soundness
comes first, and I think the general wins of the DST proposal
(consistent behavior for all &lt;code&gt;&amp;amp;T&lt;/code&gt;, &lt;code&gt;@T&lt;/code&gt;, &lt;code&gt;~T&lt;/code&gt; etc) outweigh the need
to write &lt;code&gt;fn~&lt;/code&gt; on occasion (I don’t really see much use for &lt;code&gt;fn@&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;There is also one final solution I didn’t mention in my initial
paragraphs. We could adopt the “principled” solution of using &lt;code&gt;&amp;amp;mut&lt;/code&gt;
for closures but change the way we notate &lt;code&gt;&amp;amp;mut&lt;/code&gt;. I have largely
avoided thinking about because I want to avoid destabilizing syntax
changes. However, I have toyed around occasion with an idea for
reorganizing our types to emphasize ownership and de-emphasize
mutability, which goes in this direction.  I may indulge myself and
write it up at some point. Still, I largely consider this a
non-starter.&lt;/p&gt;

&lt;p&gt;Adopting the “move sigils in back” proposal does have another
casualty, though. There has been some talk of figuring out ways to
make &lt;code&gt;@&lt;/code&gt; and &lt;code&gt;~&lt;/code&gt; less special (as in, allowing user-defined pointer
types like &lt;code&gt;RefCounted&amp;lt;T&amp;gt;&lt;/code&gt; that are on equal footing). The DST
proposal is clearly a step in that direction. Moving the sigils
backwards on &lt;code&gt;fn&lt;/code&gt; types is, well, a step backward, because closures
would always be allocated using a limited set of allocators (stack,
&lt;code&gt;~&lt;/code&gt;, or &lt;code&gt;@&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;In an odd way, finding this interaction makes me feel good. I’ve been
concerned that the DST proposal seemed too easy, which meant we
weren’t thinking hard enough about it. But there is another reason as
well: I have also been concerned that closure types were becoming a
bit too…  special, particularly with regard to
copyability. Basically I’ve been concerned that although the syntax
for a borrowed closure was &lt;code&gt;&amp;amp;fn&lt;/code&gt;, borrowed closures didn’t really
behave like &lt;code&gt;&amp;amp;&lt;/code&gt; pointers—without the DST proposal, this was something
that we could safely enforce as part of the type system, but it’s
still confusing for users. So I think the DST proposal forces us to be
more honest, and that’s a good thing all around.&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 14:35:00 +0000</pubDate>
</item>
<item>
	<title>Michael Kaply: More MAJOR changes coming in Firefox 21</title>
	<guid isPermaLink="false">http://mike.kaply.com/?p=1832</guid>
	<link>http://mike.kaply.com/2013/05/13/more-major-changes-coming-in-firefox-21/</link>
	<description>&lt;p&gt;
In my &lt;a href=&quot;http://mike.kaply.com/2013/04/24/major-changes-coming-in-firefox-21/&quot;&gt;previous post&lt;/a&gt;, I talked about the moving of some files for Firefox 21. Due to some major bugs related to partner builds, the distribution directory was moved back. So you no longer need to move distribution files into the browser directory. So here's a summary of what has changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;defaults/preferences -&amp;gt; browser/defaults/preferences&lt;/li&gt;
&lt;li&gt;defaults/profile -&amp;gt; browser/defaults/profile&lt;/li&gt;
&lt;li&gt;extensions -&amp;gt; browser/extensions&lt;/li&gt;
&lt;li&gt;searchplugins -&amp;gt; browser/searchplugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've also been asked about the file override.ini - this file should now be placed in the browser subdirectory as well.
&lt;/p&gt;
&lt;p&gt;
Remember, Firefox 21 is scheduled to be released tomorrow.&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 13:56:21 +0000</pubDate>
	<dc:creator>Mike Kaply</dc:creator>
</item>
<item>
	<title>Gregory Szorc: The State of Mercurial at Mozilla</title>
	<guid isPermaLink="true">http://gregoryszorc.com/blog/2013/05/13/the-state-of-mercurial-at-mozilla</guid>
	<link>http://gregoryszorc.com/blog/2013/05/13/the-state-of-mercurial-at-mozilla</link>
	<description>&lt;p&gt;I have an opinion on the usage of Mercurial at Mozilla: it stinks.&lt;/p&gt;
&lt;p&gt;Here's why.&lt;/p&gt;
&lt;h3&gt;The server is configured poorly&lt;/h3&gt;
&lt;p&gt;Our Mozilla server, hg.mozilla.org, is currently running Mercurial 2.0.2.
In terms of Mercurial features, stability, and performance, we are light
years behind.&lt;/p&gt;
&lt;p&gt;You know that annoying phases configuration you need to set when pushing
to Try? That's because the server isn't new enough to tell the client the
same thing the configuration option does. It
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=725362&quot;&gt;will be fixed&lt;/a&gt;
when the server is upgraded to 2.1+.&lt;/p&gt;
&lt;p&gt;Furthermore, we are running the server over NFS, which introduces known
badness, including slowness.&lt;/p&gt;
&lt;p&gt;I believe we blame Mercurial for issues that would go away if we
configured the Mercurial server properly.&lt;/p&gt;
&lt;p&gt;Fortunately, it appears the
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=781012&quot;&gt;upgrade to 2.5&lt;/a&gt;
is near and I've heard we're moving from NFS to local disk storage as
part of that. This should go a long way to making the server better.
The upgrade can't happen soon enough.&lt;/p&gt;
&lt;h3&gt;User education is poor&lt;/h3&gt;
&lt;p&gt;I think a lot of people are ignorant on the features and abilities of
Mercurial.&lt;/p&gt;
&lt;p&gt;I commonly hear people are dissatisfied with the behavior of their
Mercurial client. They encounter performance issues, bugs, corruption,
etc. Nine times out of ten this is due to running an old Mercurial
release. Just last Friday someone on my team asked me about
weird behavior involving file case. My first question: &lt;em&gt;what version
of Mercurial are you using?&lt;/em&gt; He was running 2.0.2. I told him to
upgrade to 2.5+. It fixed his problem. &lt;strong&gt;If you aren't running
Mercurial 2.5 or newer, upgrade immediately.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've heard people say we should switch to Git because Git has feature X.
Most of the time, Mercurial has these features. Unfortunately, people
just don't realize it. When I point them at
&lt;a href=&quot;http://mercurial.selenic.com/wiki/UsingExtensions&quot;&gt;Mercurial's extensions list&lt;/a&gt;
their eyes light up and they thank me for making their lives easier.&lt;/p&gt;
&lt;p&gt;I think a problem is a lot of new Mozilla contributors knew Git
before and only pick up the bare essentials of Mercurial that allow them
to land patches. They prefer Git because it is familiar and just don't
bother to pick up Mercurial. The potential of Mercurial is thus lost on
them.&lt;/p&gt;
&lt;p&gt;Perhaps we should have a brown bag and/or better documentation on
getting the most out of Mercurial?&lt;/p&gt;
&lt;h3&gt;The branching model is far from ideal&lt;/h3&gt;
&lt;p&gt;For Gecko/Firefox development, we maintain separate repositories for the
trunk and release branches. This introduces all kinds of annoying.&lt;/p&gt;
&lt;p&gt;We should not have separate repositories for &lt;em&gt;central&lt;/em&gt;, &lt;em&gt;inbound&lt;/em&gt;,
&lt;em&gt;aurora&lt;/em&gt;, &lt;em&gt;beta&lt;/em&gt;, &lt;em&gt;release&lt;/em&gt;, etc. We should be using some combination of
branches and bookmarks and have all the release heads in one
repository, just like how the
&lt;a href=&quot;https://github.com/mozilla/mozilla-central/&quot;&gt;GitHub mirror&lt;/a&gt; is
configured.&lt;/p&gt;
&lt;p&gt;As an experiment, I created a
&lt;a href=&quot;https://hg.mozilla.org/users/gszorc_mozilla.com/gecko&quot;&gt;unified Mercurial repository&lt;/a&gt;.
Each current repository is tracked as a bookmark (there are
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Developer_Guide/Source_Code/Mercurial&quot;&gt;instructions&lt;/a&gt;
for reproducing this). Unfortunately, the web interface isn't showing
bookmarks (perhaps because the version of Mercurial is too old?), so
you'll have to clone the repository to play around. Just run
&lt;em&gt;hg bookmarks&lt;/em&gt; and e.g. &lt;em&gt;hg up aurora&lt;/em&gt; after cloning.
&lt;em&gt;Warning: I'm not actively synchronizing this repository, so don't rely
on it being up to date&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A Mercurial contributor (who is familiar with Mozilla's
development model) suggested we use Mercurial branches for every Gecko
release (20, 21, 22, etc). I think this and other uses of branches and
bookmarks are ideas worth exploring.&lt;/p&gt;
&lt;h3&gt;We're failing to harness the extensibility&lt;/h3&gt;
&lt;p&gt;Gecko/Firefox has a complicated code lifecycle and landing process.
This could be significantly streamlined if we fully harnessed and
embraced the extensibility of Mercurial. While there are some
Mozilla-centric extensions (details in my
&lt;a href=&quot;http://gregoryszorc.com/blog/2013/05/12/thoughts-on-mercurial-%28and-git%29/&quot;&gt;recent post&lt;/a&gt;),
I don't think they are well known nor used.&lt;/p&gt;
&lt;p&gt;I think Mozilla should embrace the functionality of extensions like
these (whether they be for Mercurial, Git, or something else) and invest
resources in improving the workflows for all developers. Until these
tools are obviously superior and advertised, I believe many developers
will unknowingly continue to toil without them. And, it's likely hurting
our ability to attract and retain new contributors as well.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Mozilla's current usage of Mercurial is far from ideal. It's no wonder
people don't like Mercurial (and why some want to switch to Git).&lt;/p&gt;
&lt;p&gt;Fortunately, little has to do with shortcomings of Mercurial itself (at
least with newer versions). If you want to know why Mercurial isn't
working too well for Gecko/Firefox development, most of the problems
are self-inflicted or the solutions reside within each of us. Time
will tell if we as a community have the will to address these issues.&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 13:25:00 +0000</pubDate>
</item>
<item>
	<title>Axel Hecht: git-merge 2013</title>
	<guid isPermaLink="false">http://blog.mozilla.org/axel/?p=527</guid>
	<link>http://blog.mozilla.org/axel/2013/05/13/git-merge-2013/</link>
	<description>&lt;p&gt;I spent Friday and Saturday on &lt;a href=&quot;http://git-merge.com/&quot;&gt;git-merge&lt;/a&gt;, an unconference on git. Thursday was developer day, for core contributors to git itself, and libgit2/jgit. I didn’t go there. Friday was “user” day, and Saturday was hackday. I figured it might be useful to go to the userday, and turned out, it was. It wasn’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.&lt;/p&gt;
&lt;p&gt;The rest of Friday was actually library and tool hackers talking about what they’re doing. There are notes on &lt;a href=&quot;https://github.com/git-merge/user-day/blob/master/docs/01-index.md&quot;&gt;github.com/git-merge/user-day&lt;/a&gt;, but I do want to hightlight a few.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mhagger/git-imerge&quot;&gt;imerge&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Much debate on java vs not, actually. And Cmd-F1. Little conflict between git and hg.&lt;/p&gt;
&lt;p&gt;I also got to enjoy the github backend talk by &lt;a href=&quot;https://github.com/vmg&quot;&gt;vmg&lt;/a&gt;, with Ernie, Bert, and smoke through chimneys. I had seen a recording of it before, but it was well worth it seeing it live.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://github.com/schacon&quot;&gt;Scott Schacon&lt;/a&gt; about localized version of the git book, and localized github docs, too.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Saturday was great. I only got 20 lines of code written, but I finally understood what git is about in the back-end. There’s loads of hackery that you can do, and funny enough, both I and &lt;a href=&quot;https://github.com/ben&quot;&gt;Ben&lt;/a&gt; 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 &lt;a href=&quot;https://github.com/libgit2/libgit2sharp/pull/429&quot;&gt;PR&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;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’s sad that many people claimed tickets and didn’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.&lt;/p&gt;
&lt;p&gt;Thanks to all the folks at git-merge for making it a great event. See you in Berlin…&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 12:36:49 +0000</pubDate>
	<dc:creator>Axel Hecht</dc:creator>
</item>
<item>
	<title>Brandon Savage: Compiling PHP 5.5 From Scratch</title>
	<guid isPermaLink="false">http://www.brandonsavage.net/?p=2450</guid>
	<link>http://www.brandonsavage.net/compiling-php-5-5-from-scratch/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=compiling-php-5-5-from-scratch</link>
	<description>There’s always a lag behind new releases of PHP and releases of packages for operating systems such as Ubuntu. This lag time means that you could be kept from upgrading to the latest and greatest PHP for a year or more, unless you use an outside repository like Dotdeb. Of course, even when using one [...]</description>
	<pubDate>Mon, 13 May 2013 11:00:06 +0000</pubDate>
	<dc:creator>Brandon Savage</dc:creator>
</item>
<item>
	<title>Doug Belshaw: Reading, feeding and seeding</title>
	<guid isPermaLink="false">http://dougbelshaw.com/blog/?p=35807</guid>
	<link>http://dougbelshaw.com/blog/2013/05/13/reading-feeding-and-seeding/</link>
	<description>&lt;p&gt;After several days of migraines and with an upcoming intense week in the form of a Mozilla All-Hands meeting, this week I’m going to be focusing on &lt;em&gt;inputs&lt;/em&gt; rather than outputs.&lt;/p&gt;
&lt;p&gt;This is likely to be my only blog post of the week (apart from my &lt;a href=&quot;http://dougbelshaw.com/blog/category/weeknotes/&quot;&gt;weeknote&lt;/a&gt;) and I’ll be a lot lighter in my use of &lt;a href=&quot;http://twitter.com/dajbelshaw&quot;&gt;Twitter&lt;/a&gt; / &lt;a href=&quot;http://gplus.to/dajbelshaw&quot;&gt;Google+&lt;/a&gt; / &lt;a href=&quot;http://www.facebook.com/DougBelshawsBlog&quot;&gt;Facebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to make me smile while I’m ensuring I don’t get burned out, how about donating to &lt;a href=&quot;http://justgiving.com/letting-grow&quot;&gt;#LettingGrow&lt;/a&gt;? That would be awesome.&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;em&gt;Image CC BY &lt;a href=&quot;http://www.flickr.com/photos/pinksherbet/3370498053/in/photostream/&quot;&gt;Pink Sherbert Photography&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 10:16:06 +0000</pubDate>
	<dc:creator>Doug Belshaw</dc:creator>
</item>
<item>
	<title>Gervase Markham: 3D Printing A Replacement Cot Clip</title>
	<guid isPermaLink="false">http://blog.gerv.net/?p=2568</guid>
	<link>http://feedproxy.google.com/~r/HackingForChrist/~3/abYkMEDID_U/</link>
	<description>&lt;p&gt;Some things made with 3D printers could possibly be made more easily using other manufacturing methods – although printing them yourself is often more fun. But sometimes you come across something which would be fairly tricky to make otherwise, unless perhaps you had high-end equipment like a laser cutter.&lt;/p&gt;
&lt;p&gt;Cots, in the UK at least, often have a “drop side” – a side which is normally at the standard height, but can be lowered to make it easier to insert or remove a child. The side is usually held up by some kind of safety clip at each end, such that when you raise the side, the clips automatically engage, and when you want to lower it, you need to lift the side a little and pull both clips out of the way from the outside. This prevents a child pulling off an escape :-)&lt;/p&gt;
&lt;p&gt;One of the two cots we have used to belong to my wife’s brother. It has such clips, and long ago one of them broke. He made a flat replacement out of cut perspex, but it has also recently broken. This is a problem because our changing table fits on top of the cot, and if the sides aren’t the same height, the table can’t be used and we are having to change William and John with the mat on the floor! So I thought I’d try and print one.&lt;/p&gt;
&lt;p&gt;As you can see from the right of the photo below, the existing clip is a rather specific shape, and would have been hard to produce by many other methods without a lot of trial and error. Many parts have to be exactly the right angle and length or it won’t open, or close, or pass the cot side, or whatever. I took a scan of the existing clip (which was a bit blurry, as the clip is not flat) and traced around it in LibreCAD. I then saved that trace as a DXF file, and wrote an OpenSCAD file to make a new clip, based on a linear extrusion of the outline, plus (on later attempts) two extra blocks for a stop and a handle. Here are my efforts:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.gerv.net/files/2013/05/attempts-small.jpg&quot;&gt;&lt;img alt=&quot;4 attempts to make the clip&quot; class=&quot;alignnone size-medium wp-image-2569&quot; src=&quot;http://blog.gerv.net/files/2013/05/attempts-small.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first was too small, the second marginally too big (and the blocks not aligned right), and the third, like Little Bear’s porridge, was just right :-) Well, it suffices anyway, although the hook could do with being 1mm smaller for easy passage of the side.&lt;/p&gt;
&lt;p&gt;Here’s the clip in situ, supporting the side of the cot:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.gerv.net/files/2013/05/in-situ-small.jpg&quot;&gt;&lt;img alt=&quot;Clip supporting cot side&quot; class=&quot;alignnone size-medium wp-image-2571&quot; src=&quot;http://blog.gerv.net/files/2013/05/in-situ-small.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And this photo, beautifully modelled by my wife, shows how it fits when the side is down:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.gerv.net/files/2013/05/demo-small.jpg&quot;&gt;&lt;img alt=&quot;Clip being used&quot; class=&quot;alignnone size-medium wp-image-2570&quot; src=&quot;http://blog.gerv.net/files/2013/05/demo-small.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/HackingForChrist/~4/abYkMEDID_U&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 13 May 2013 07:00:08 +0000</pubDate>
	<dc:creator>gerv</dc:creator>
</item>
<item>
	<title>Eitan Isaacson: GNOME Workstation OS</title>
	<guid isPermaLink="false">http://blog.monotonous.org/?p=513</guid>
	<link>http://blog.monotonous.org/2012/08/07/gnome-workstation-os/</link>
	<description>&lt;p&gt;I wanted to give my one cent about the GNOME project, and where I think it could be successful. It would be two cents if I were actually involved in any constructive manner, but I am not. So it is one cent.&lt;/p&gt;
&lt;p&gt;Ever since I started contributing to GNOME, the looming questions have been mobile, web, and social. Every keynote at GUADEC has tugged us in that direction, or promised to “reboot” the effort. If it is Big Board and Mugshot, Pyro Desktop, Telepathy and the collaboration it was supposed to bring, the countless OpenedHand and Nokia innovations, etc. We have all been running around like a chicken with its head cut off ever since I remember, trying to capture the essence of these new trends and remain relevant.&lt;/p&gt;
&lt;p&gt;We failed.&lt;/p&gt;
&lt;p&gt;Apple revolutionized not just mobile, but reinvented the mainstream computing form factor. Facebook made “social” ubiquitous, and Google is doing what it is doing to the web. In the meantime, I never gained any following on Last.fm from all those years of scrobbling music with Rhythmbox and Banshee, I never got an opportunity to use Telepathy tubes with any real live person, and apparently my Mugshot profile is gone. My eyes also got tired of squinting at XTerm on my N900.&lt;/p&gt;
&lt;p&gt;Last year in Berlin, the lack of direction was apparent. Almost every keynote that I remember was given by one kind of designer or &lt;a href=&quot;http://ranklogix.net/&quot;&gt;seo company&lt;/a&gt;. Somewhere along the line we confused design with leadership. At least there wasn’t as much self delusion about our bright future on mobile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But there is a way out of this rut.&lt;/strong&gt; And it requires acknowledging our weaknesses and exploiting our strengths.&lt;/p&gt;
&lt;p&gt;Our weak areas are apparent: We are not mobile and we are very far from it. We will never achieve any significant social critical mass, we have had limited successes in embracing web technologies, but the web will always be a better web. Deploying “apps” is a nightmare.&lt;/p&gt;
&lt;p&gt;Our strengths are pretty obvious too: In the last few years we successfully refreshed the desktop work flow and our entire framework. We support many productivity and authoring tools. We created a distraction free environment that lets users get work done. We run on commodity hardware. We are free. We have a windowed multitasking environment. We work really well with a screen, mouse and keyboard (not to be taken for granted, look at all the awkward Android tablet keyboard combos out there). More than one web browser supports us. There is a more than fully functional office suite that works well with us. Etc.&lt;/p&gt;
&lt;p&gt;So instead of aspiring to be in every consumer gadget out there, I think we should aspire to be the &lt;strong&gt;work horse of choice&lt;/strong&gt; for every content creator out there. This includes mobile/web developers, graphic designers, artists, bloggers, video bloggers, authors, journalists, podcast producers, and every other kind of &lt;strong&gt;content creator&lt;/strong&gt; that makes the mobile web and social such a vital space for the rest of the world. We need to refocus on the desktop.&lt;/p&gt;
&lt;p&gt;Let’s leave the mission of bringing free software to mobile and the web to others. Other groups are doing a great job there. They are in their element; let’s remain in ours. &lt;strong&gt;We should focus on the production end of the New Media pipeline.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Projects such as The GIMP, PiTiVi, Anjuta, Blender and Libre Office should be our bread and butter. We should strive to stay ahead of the curve on the authoring end. We should document and support Android and Unity development. The Wacom tablet support that landed recently is a good example of what we could be doing.&lt;/p&gt;
&lt;p&gt;It feels like GNOME is being maintained by a skeleton crew, and a shrinking set of corporate stakeholders. I think it is time to be realistic about what we could excel at, and go there. We don’t have to be on every existing form factor to achieve world domination. The cloud, and all these cheap new gadgets have lowered the barrier to access. We could lower the barrier of authorship, and enable people to create new and rich content.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/blogdotmonotonousdotorg.wordpress.com/513/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/blogdotmonotonousdotorg.wordpress.com/513/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.monotonous.org&amp;amp;blog=34885741&amp;amp;post=513&amp;amp;subd=blogdotmonotonousdotorg&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 13 May 2013 00:40:35 +0000</pubDate>
	<dc:creator>Eitan</dc:creator>
</item>
<item>
	<title>John O'Duinn: “Brag! The art of tooting your own horn without blowing it” by Peggy Klaus</title>
	<guid isPermaLink="false">http://oduinn.com/blog/?p=3291</guid>
	<link>http://oduinn.com/blog/2013/05/12/brag-the-art-of-tooting-your-own-horn-without-blowing-it-by-peggy-klaus/</link>
	<description>&lt;p&gt;Normally, a small book like this (193 pages) would be a quick read for me, but this book took me literally &lt;strong&gt;months&lt;/strong&gt;. Not, I hasten to add, because of any problems with the book or the writing style, that was all fine. The problem was that this book uncovered a bunch of things I am personally working through. I found myself reading a few pages, highlighting some lines, then walking away thinking. Repeat a few times a week. Occasionally, I’d go back and re-read entire chapters. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0446692786/ref=as_li_ss_il?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0446692786&amp;amp;linkCode=as2&amp;amp;tag=johnswebs-20&quot;&gt;&lt;img align=&quot;right&quot; border=&quot;0&quot; src=&quot;http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=0446692786&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=johnswebs-20&quot; /&gt;&lt;/a&gt;For me, bragging has negative connotations and is something I avoid like the plague. Stereotypes of obnoxious, pretentious people, loudly telling all within range just how great they are. The very last thing I ever want to be. Whether that is cultural, learned from family, something I developed myself growing up, or a mixture, I don’t know. But it is part of who I am. This book is all about encouraging people to find a comfortable place in between these extremes. As Peggy is quick to note, this means different things to different people, so you need to pay attention to what is authentic for &lt;strong&gt;you&lt;/strong&gt;, as that authenticity is important. People have generations of experience spotting fakes, and worst of all, deep down, you’ll know you are faking it too. &lt;/p&gt;
&lt;p&gt;Because of the book title, it took several people pushing to get me to even start reading this book. Chapter#1 opened with a line that stopped me dead in my tracks. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Myth#1: A job well done speaks for itself.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve always thought that if I did a good job, or handled a tricky situation well, people would notice. If I solved some complex problem, that people would understand the complexity, understand the importance of the achievement and appreciate the work. In those circumstances, having others recognize and complement the achievement was fine, but any attempt on my part to “brag” about my work would in some way “cheapen the victory”. After reading this book, I now think that is *sometimes* true but not always true. While the people working beside me in the same trenches, working side-by-side with me on the problem might understand the scale of the accomplishment, most people simply don’t know the details. Over time, people might eventually notice that a recurring problem hasn’t happened in a while, or they might simply forget about a previously-annoying problem because it hasn’t happened in a while… but they’d never stop and wonder why. Another common trend is for people to not notice one problem is fixed, but instead notice that a different problem has “appeared”. Oh, and meanwhile, people don’t know what you are working on. Over time, this becomes frustrating for everyone. After reading this book, I’ve learned that I need to make sure I inform people of the work I’m doing, and why it’s important to them. I don’t need to go into all the complexities of the project, unless they ask for more details, but it’s important to make sure others are aware of my work, and the impact it has on them and their work. &lt;/p&gt;
&lt;p&gt;I found this a tough read, yet super worth the time. And, yes, I strongly recommend it.&lt;/p&gt;
&lt;p&gt;“It ain’t bragging if you done it” (&lt;a href=&quot;https://en.wikipedia.org/wiki/Dizzy_Dean&quot;&gt;Dizzy Dean&lt;/a&gt;)&lt;/p&gt;</description>
	<pubDate>Mon, 13 May 2013 00:14:54 +0000</pubDate>
	<dc:creator>John</dc:creator>
</item>
<item>
	<title>Christian Heilmann: “just use technology $x” is a terrible answer to a question</title>
	<guid isPermaLink="false">http://christianheilmann.com/?p=3447</guid>
	<link>http://christianheilmann.com/2013/05/13/just-use-technology-x-is-a-terrible-answer-to-a-question/</link>
	<description>&lt;p&gt;A few days ago a &lt;a href=&quot;http://www.youtube.com/watch?v=Bt9zSfinwFA&quot;&gt;vertical video&lt;/a&gt; went viral of &lt;a href=&quot;http://www.youtube.com/watch?v=3bYv2AKPZOk&quot;&gt;the student Jeff Bliss telling his teacher off for being a bad teacher&lt;/a&gt; who just hands out materials without explaining anything.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;And we all applauded him for his gall and his eagerness to learn and to point out the obvious flaws in the education system. Teachers are not paid enough, are under more stress to be seen as someone who has students with good grades rather than understanding and have to deliver course materials they don’t believe in but are forced to go through as those are the ones that are easy to mark.&lt;/p&gt;

	&lt;p&gt;Terrible, isn’t it? So why do people in our little world of web development constantly and voluntarily become this bad, bored and ineffective teacher?&lt;/p&gt;

	&lt;p&gt;What am I talking about? The thing I mentioned in &lt;a href=&quot;http://devslovebacon.com/conferences/bacon-2013/talks/helping-or-hurting&quot;&gt;large detail in my talk at BaconConf this year&lt;/a&gt; but here it is for the generation who wants things in 140 chars or as a cute image with large letters on it:&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;Whenever you answer a question of another developer with “just use $x” you breed an expert idiot.&lt;/strong&gt; You did not teach them anything, you showed a way out of learning.&lt;/p&gt;

	&lt;p&gt;In my ongoing task to de-clutter my life I just un-subscribed from several communities on Google+, namely the &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; community and the JavaScript one. Not because I am not interested in these matters any more, quite the opposite: because I care much about these communities and all I found there is frustration and annoyance. Nearly every single question new developers have is answered in three ways:&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use jQuery – here is a plugin&lt;/li&gt;&lt;li&gt;Just Google for it&lt;/li&gt;&lt;li&gt;You’ll need to use framework $x / JavaScript and/or &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; is not good enough for that&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;None of these answers are satisfactory if you really want to help someone who needs to solve a problem and learn how to repeat the solution in the future. The latter in most cases is a plain lie and shows that you are blaming a technology for your lack of interest in it.&lt;/p&gt;

	&lt;p&gt;What gets answered far too quickly is the “how” – how to achieve a massively complex result (which yet has to be proven to be really necessary) without thinking about it or understanding the solution that you apply. We assume that is enough and that we are doing something good – we let a new developer have a positive experience of having something achieved very quickly and that will obviously entice him or her to learn more and go explore in more detail later on.&lt;/p&gt;

	&lt;p&gt;That is not necessarily the case. We showed people a shortcut and how to focus on the outcome and hope the step where they understand what they are doing comes later. Sadly in a lot of cases this never comes but it fills people with fake confidence that gets shattered once they have their first job interview in a real company who cares about what they build.&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;If you want to teach people, make them understand the “why” and let them find their own “how”&lt;/strong&gt;. That is much harder work, but also much more rewarding when you see them grow and explore.&lt;/p&gt;

	&lt;p&gt;We do not teach people how to write by copying and pasting the style of other authors. We tell them about similes, metaphors, rhetoric devices, orthography and grammar rules. Why bother with that? We could just show them &lt;span class=&quot;caps&quot;&gt;TXTSPK&lt;/span&gt; and explain that anyone who knows English will understand what they try to convey. The reason why we do it is that we teach the fun of playing with language and finding your own style.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;“But I don’t have time for that – I just want to help someone solving their problem”&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;Is a very common, admirable, but misguided idea. What you do is advertise the solution that made most sense to you as you already solved the problem. You steal the learning experience away from the other person and the way we learn is our most personal asset and differs vastly from person to person.&lt;/p&gt;

	&lt;p&gt;If you don’t want to really teach and see people grow and learn on their own terms, please stop spouting truisms and “best quick solutions” in places where people come to learn. If all they want is for you to solve their issue, they should hire you to do so for them.&lt;/p&gt;

	&lt;p&gt;Don’t be the grumpy teacher you learned to first despise and later on pity. We can do better on the web.&lt;/p&gt;
 &lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/chrisheilmann/~4/DaW3t2-Lk4k&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 12 May 2013 23:55:51 +0000</pubDate>
	<dc:creator>Chris Heilmann</dc:creator>
</item>
<item>
	<title>Peter Bengtsson: What stumped me about AngularJS</title>
	<guid isPermaLink="true">http://www.peterbe.com/plog/what-stumped-me-about-angularjs</guid>
	<link>http://www.peterbe.com/plog/what-stumped-me-about-angularjs</link>
	<description>&lt;p&gt;So I've now built my first real application using &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt;. It's a fun side-project which my wife and I use to track what we spend money on. It's not a &lt;a href=&quot;https://www.mozilla.org&quot;&gt;work&lt;/a&gt; project but it's also not another Todo list application. In fact, the application existed before as a typical jQuery app. So, I knew exactly what I needed to build but this time trying to avoid jQuery as much as I possibly could.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;The first jQuery based version is &lt;a href=&quot;https://github.com/peterbe/django-spending/blob/master/spending/main/static/js/mobile.js&quot;&gt;here&lt;/a&gt; and although I'm hesitant to share this beginner-creation here's &lt;a href=&quot;https://github.com/peterbe/django-spending/blob/master/spending/mobile/static/js/angularmobile.js&quot;&gt;the AngularJS version&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;The following lists were some stumbling block and other things that stumped me. Hopefully by making this list it might help others who are also new to AngularJS and perhaps the Gods of AngularJS can see what confuses beginners like me.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;1. AJAX  doesn't work like jQuery&lt;/h3&gt;
&lt;p&gt;Similar to Backbone, I think, the default thing is to send the GET, POST request with the data the body blob. jQuery, by default, sends it as &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt;. I like that because that's how most of my back ends work (e.g. &lt;code&gt;request.GET.get('variable')&lt;/code&gt; in Django). I ended up pasting in this (code below) to get back what I'm familiar with:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$httpProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$httpProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;transformRequest&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$httpProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Content-Type'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'application/x-www-form-urlencoded; charset=UTF-8'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;2. App/Module configuration confuses me&lt;/h3&gt;
&lt;p&gt;The whole concept of needing to define the code as an app or a module confused me. I think it all starts to make sense now. Basically, you don't need to think about &quot;modules&quot; until you start to split distinct things into separate files. To get started, you don't need it. At least not for simple applications that just have one chunk of business logic code.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Also, it's confusing why the the name of the app is important and why I even need a name.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;3. How to do basic &lt;code&gt;.show()&lt;/code&gt; and &lt;code&gt;.hide()&lt;/code&gt; is handled by the data&lt;/h3&gt;
&lt;p&gt;In jQuery, you control the visibility of elements by working with the element &lt;em&gt;based&lt;/em&gt; on data. In AngularJS you control the visibility by &lt;em&gt;tying it to the data&lt;/em&gt; and then manipulate the data. It's hard to put your finger on it but I'm so used to looking at the data and &lt;em&gt;then&lt;/em&gt; decide on elements' visibility. This is not an uncommon pattern in a jQuery app:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bench-press-question&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;label&amp;gt;&lt;/span&gt;How much can you bench press?&lt;span class=&quot;nt&quot;&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bench_press_max&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user_info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gender&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'male'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'.bench-press-question input'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user_info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bench_press_max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'.bench-press-question'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In AngularJS that would instead look something like this:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-show=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;male&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;label&amp;gt;&lt;/span&gt;How much can you bench press?&lt;span class=&quot;nt&quot;&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bench_press_max&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bench_press_max&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user_info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gender&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'male'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;male&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bench_press_max&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user_info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bench_press_max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I know this can probably be expressed in some smarter way but what made me uneasy is that I mix stuff &lt;em&gt;into the data&lt;/em&gt; to do visual things.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;4. How do I use controllers that &quot;manage&quot; the whole page?&lt;/h3&gt;
&lt;p&gt;I like the &lt;code&gt;ng-controller=&quot;MyController&quot;&lt;/code&gt; thing because it makes it obvious where your &quot;working environment&quot; is as opposed to working with the whole &lt;code&gt;document&lt;/code&gt; but what do I do if I need to tie data to lots of several places of the &lt;code&gt;document&lt;/code&gt;?&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;To remedy this for myself I created a controller that manages, basically, the whole body. If I don't, I can't manage scope data that is scattered across totally different sections of the page.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;I know it's a weak excuse but the code I ended up with has one massive controller for everything on the page. That can't be right.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;5. &lt;code&gt;setTimeout()&lt;/code&gt; doesn't quite work as you'd expect&lt;/h3&gt;
&lt;p&gt;If you do this in AngularJS it won't update as you'd expect.&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;status-message&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-show=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;{{ message }}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Changes saved!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;setTimout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What you have to do, once you know it, is this:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Changes saved!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;nx&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It's not too bad but I couldn't see this until I had Googled some Stackoverflow questions.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;6. Autocompleted password fields don't update the scope&lt;/h3&gt;
&lt;p&gt;Due to &lt;a href=&quot;https://github.com/angular/angular.js/issues/1460&quot;&gt;this bug&lt;/a&gt; when someone fills in a username and password form using autocomplete the password field isn't updating its data.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Let me explain; you have a username and password form. The user types in her username and her browser automatically now also fills in the password field and she's ready to submit. This simply does not work in AngularJS yet. So, if you have this code...:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;username&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;username&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;placeholder=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Username&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;password&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;password&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;password&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;placeholder=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Password&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;button button-block&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-click=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;submit()&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;signin_submit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/signin'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Signed in!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It simply doesn't work! I'll leave it to the reader to explore what available jQuery-helped hacks you can use.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;7.  Events for selection in a &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; tag is weird&lt;/h3&gt;
&lt;p&gt;This is one of those cases where readers might laugh at me but I just couldn't see how else to do it.&lt;br /&gt;
First, let me show you how I'd do it in jQuery:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'select[name=&quot;choice&quot;]'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'other'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// the &amp;lt;option value=&quot;other&quot;&amp;gt;Other...&amp;lt;/option&amp;gt; option was chosen &lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here's how &lt;strong&gt;I&lt;/strong&gt; solved it in AngularJS:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;

&lt;pre&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$watch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'choice'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'other'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// the &amp;lt;option value=&quot;other&quot;&amp;gt;Other...&amp;lt;/option&amp;gt; option was chosen &lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What's also strange is that there's nothing in the &lt;a href=&quot;http://docs.angularjs.org/api&quot;&gt;API documentation&lt;/a&gt; about &lt;code&gt;$watch&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;8. Controllers &quot;dependency&quot; injection is, by default, dependent on the controller's arguments&lt;/h3&gt;
&lt;p&gt;To have access to modules like &lt;code&gt;$http&lt;/code&gt; and &lt;code&gt;$timeout&lt;/code&gt; for example, in a controller, you put them in as arguments like this:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It means that it's going to work equally if you do:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// order swapped&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That's fine. Sort of. Except that this breaks minification so you have to do it this way:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyController&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'$scope'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$timeout'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Ugly! The first form depends on the interpreter inspecting the names of the arguments. The second form depends on the modules as strings.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;The more correct way to do it is using the &lt;code&gt;$inject&lt;/code&gt;. Like this:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;nx&quot;&gt;MyController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$inject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'$scope'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'$timeout'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Still ugly because it depends on them being strings. But why isn't this the one and only way to do it in the documentation? These days, no application is worth its salt if it isn't minify'able.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;9. Is it &quot;angular&quot; or &quot;angularjs&quot;?&lt;/h3&gt;
&lt;p&gt;Googling and referring to it &quot;angularjs&quot; seems to yield better results.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;This isn't a technical thing but rather something that's still in my head as I'm learning my way around.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;In conclusion&lt;/h3&gt;
&lt;p&gt;I'm eager to write another blog post about how fun it has been to play with AngularJS. It's a fresh new way of doing things.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;AngularJS code reminds me of the olden days when the HTML no longer looks like HTML but instead some document that contains half of the business logic spread all over the place. I think I haven't fully grasped this new way of doing things.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;From hopping around example code and documentation I've seen some outrageously complicated HTML which I'm used to doing in Javascript instead. I appreciate that the HTML is after all part of the visual presentation and not the data handling but it still stumps me every time I see that what used to be one piece of functionality is now spread across two places (in the javascript controller and in the HTML directive).&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;I'm not givin up on AngularJS but I'll need to get a lot more comfortable with it before I use it in more serious applications. &lt;/p&gt;</description>
	<pubDate>Sun, 12 May 2013 20:53:35 +0000</pubDate>
</item>
<item>
	<title>Gregory Szorc: Thoughts on Mercurial (and Git)</title>
	<guid isPermaLink="true">http://gregoryszorc.com/blog/2013/05/12/thoughts-on-mercurial-(and-git)</guid>
	<link>http://gregoryszorc.com/blog/2013/05/12/thoughts-on-mercurial-(and-git)</link>
	<description>&lt;p&gt;My first experience with Mercurial (Firefox development)
was very unpleasant. Coming from Git, I thought Mercurial was slow
and perhaps even more awkward to use than Git. I frequently
encountered repository corruption that required me to reclone. I thought
the concept of a patch queue was silly compared to Git branches. It
was all extremely frustrating and I dare say a hinderance to my
productivity. It didn't help that I was surrounded by a bunch of people
who had previous experience with Git and opined about every minute
difference.&lt;/p&gt;
&lt;p&gt;Two years later and I'm on much better terms with Mercurial. I initially
thought it might be Stockholm Syndrome, but after reflection I can point
at specific changes and enlightenments that have reshaped my opinions.&lt;/p&gt;
&lt;h3&gt;Newer versions of Mercurial are much better&lt;/h3&gt;
&lt;p&gt;I first started using Mercurial in the 1.8 days and thought it was
horrible. However, modern releases are much, much better. I've noticed
a steady improvement in the quality and speed of Mercurial in the last
few years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you aren't running 2.5 or later (Mercurial 2.6 was released earlier
this month), you should take the time to upgrade today.&lt;/strong&gt; When you upgrade,
you should of course read the
&lt;a href=&quot;http://mercurial.selenic.com/wiki/WhatsNew&quot;&gt;changelog&lt;/a&gt; and
&lt;a href=&quot;http://mercurial.selenic.com/wiki/UpgradeNotes&quot;&gt;upgrade notes&lt;/a&gt; so you
can make the most of the new features.&lt;/p&gt;
&lt;h3&gt;Proper configuration is key&lt;/h3&gt;
&lt;p&gt;For &lt;em&gt;my&lt;/em&gt; workflow, the default configuration of Mercurial out of the box
is... far from optimal. There are a number of basic changes that need to
be made to satisfy &lt;em&gt;my&lt;/em&gt; expectations for a version control tool.&lt;/p&gt;
&lt;p&gt;I used to think this was a shortcoming with Mercurial: why not ship a
powerful and useful environment out of the box? But, after talking to a
Mercurial core contributor, this is mostly by design. Apparently a
principle of the Mercurial project is that the CLI tool (&lt;em&gt;hg&lt;/em&gt;) should be
simple by default and should minimize foot guns. They view actions like
rebasing and patch queues as advanced and thus don't have them enabled
by default. Seasoned developers may scoff at this. But, I see where
Mercurial is coming from. I only need to refer everyone to her first
experience with Git as an example of what happens when you don't aim for
simplicity. (I've never met a Git user who didn't think it overly
complicated at first.)&lt;/p&gt;
&lt;p&gt;Anyway, to get the most out of Mercurial, it is essential to configure
it to your liking, much like you install plugins or extensions in your
code editor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every person running Mercurial should go to
&lt;a href=&quot;http://mercurial.selenic.com/wiki/UsingExtensions&quot;&gt;http://mercurial.selenic.com/wiki/UsingExtensions&lt;/a&gt;
and take the time to find extensions that will make your life better&lt;/strong&gt;.
You should also run &lt;em&gt;hg help hgrc&lt;/em&gt; to view all the configuration
options. There is a mountain of productivity wins waiting to be realized.&lt;/p&gt;
&lt;p&gt;For reference, my &lt;a href=&quot;https://gist.github.com/indygreg/5511712&quot;&gt;~/.hgrc&lt;/a&gt;.
Worth noting are some of the built-in externsions I've enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;color - Colorize terminal output. Clear UX win.&lt;/li&gt;
&lt;li&gt;histedit - Provides  &lt;em&gt;git rebase --interactive&lt;/em&gt; behavior.&lt;/li&gt;
&lt;li&gt;pager - Feed command output into a pager (like &lt;em&gt;less&lt;/em&gt;). Clear UX win.&lt;/li&gt;
&lt;li&gt;progress - Draw progress bars on long-running operations. Clear UX
  win.&lt;/li&gt;
&lt;li&gt;rebase - Ability to easily rebase patches on top of other heads.
  This is a basic feature of patch management.&lt;/li&gt;
&lt;li&gt;transplant - Easily move patches between repositories, branches, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I were on Linux, I'd also use the &lt;em&gt;inotify&lt;/em&gt; extension, which installs
filesystem watchers so operations like &lt;em&gt;hg status&lt;/em&gt; are instantaneous.&lt;/p&gt;
&lt;p&gt;In addition to the built-in extensions, there are a number of 3rd party
extensions that improve my Mozilla workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bitbucket.org/sfink/mqext&quot;&gt;mqext&lt;/a&gt; - Automatically commit to
  your patch queue when you qref, etc. This is a lifesaver. If that's
  not enough, it suggests reviewers for your patch, suggests a bug
  component, and let's you find bugs touching the files you are
  touching.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pbiggar/trychooser&quot;&gt;trychooser&lt;/a&gt; - Easily push
  changes to Mozilla's Try infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hg.mozilla.org/users/robarnold_cmu.edu/qimportbz&quot;&gt;qimportbz&lt;/a&gt; -
  Easily import patches from Bugzilla.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hg.mozilla.org/users/tmielczarek_mozilla.com/bzexport&quot;&gt;bzexport&lt;/a&gt; -
  Easily export patches to Bugzilla.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm amazed more developers don't use these simple productivity wins.
Could it be that people simply don't realize they are available?&lt;/p&gt;
&lt;p&gt;Mozilla has a &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=794580&quot;&gt;bug&lt;/a&gt;
tracking easier configuration of the user's Mercurial environment. My
hope is one day people simply run a single command and get a
Mozilla-optimized Mercurial environment that &lt;em&gt;just works&lt;/em&gt;. Along the same
vein, if your extensions are out of date, it prompts you to update them.
This is one of the benefits of a unified developer tool like mach: you
can put these checks in one place and everyone can reap the benefits
easily.&lt;/p&gt;
&lt;h3&gt;Mercurial is extensible&lt;/h3&gt;
&lt;p&gt;The major differentiator from almost every other version control system
(especially Git) is the ease and degree to which Mercurial can be
extended and contorted. &lt;strong&gt;If you take anything away from this
post it should be that Mercurial is a flexible and agile tool.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you want to change the behavior of a built-in command, you can write
an extension that monkeypatches that command. If you want to write a new
command, you can of course do that easily. You can have extensions
interact with one another - all natively. You can even override the wire
protocol to provide new &lt;em&gt;capabilities&lt;/em&gt; to extend how peers communicate
with one another. You can leverage this to transfer additional metadata
or data types. This has nearly infinite potential. If that's not enough,
it's possible to create a new branching/development primitive through
just an extension alone! If you want to invent Git-style branches with
Mercurial, you could do that! It may require client and server support,
but it's possible.&lt;/p&gt;
&lt;p&gt;Mercurial accomplishes this by being written (mostly) in Python (as
opposed to C) and by having a clear API on which extensions can be
built. Writing extensions in Python is huge. You can easily drop into
the debugger to learn the API and your write-test loop is much smaller.&lt;/p&gt;
&lt;p&gt;By contrast, most other version control systems (including Git) require
you to parse output of commands (this is the UNIX piping principle).
Mercurial supports this too, but the native Python API is so much more
powerful. Instead of parsing output, you can just read the raw values
from a Python data structure. Yes please.&lt;/p&gt;
&lt;p&gt;Since I imagine a lot of people at Mozilla will be reading this, here
are some ways Mozilla could leverage the extensibility of Mercurial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Command to create try pushes (it exists - see above).&lt;/li&gt;
&lt;li&gt;Record who pushed what when (we have this - it's called the pushlog).&lt;/li&gt;
&lt;li&gt;Command to land patches. If inbound1 is closed,
  automatically rebase on inbound2. etc. This could even be
  monkeypatched into &lt;em&gt;hg push&lt;/em&gt; so pushes to inbound are automatically
  intercepted and magic ensues.&lt;/li&gt;
&lt;li&gt;Record the automation success/fail status against individual
  revisions and integrate with commands (e.g. only pull up to the most
  recent stable changeset).&lt;/li&gt;
&lt;li&gt;Command to create a review request for a patch or patch queue.&lt;/li&gt;
&lt;li&gt;Command to assist with reviews. Perhaps a reviewer wants to make minor
  changes. Mercurial could download and apply the patch(es), wait for
  your changes, then reupload to Bugzilla (or the review tool)
  automatically.&lt;/li&gt;
&lt;li&gt;Annotating commits or pushes with automation info (which jobs to
  run, etc).&lt;/li&gt;
&lt;li&gt;Find Bugzilla component for patch (it exists - see above).&lt;/li&gt;
&lt;li&gt;Expose custom protocol for configuring automation settings for a
  repository or a head. e.g. clients (with access) could reconfigure
  PGO scheduling, coalescing, etc without having to involve RelEng -
  useful for twigs and lesser used repositories.&lt;/li&gt;
&lt;li&gt;So much more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially, Mercurial itself could become the CLI tool code development
centers around. Whether that is a good idea is up for
debate. But, it can. And that says a lot about the flexibility of
Mercurial.&lt;/p&gt;
&lt;h3&gt;Future potential of Mercurial&lt;/h3&gt;
&lt;p&gt;When you consider the previous three points, you arrive at a new one:
Mercurial has a ton of future potential. The fact that extensions can
evolve vanilla Mercurial into something that resembles Mercurial in
name only is a testament to this.&lt;/p&gt;
&lt;p&gt;When I sat down with a Mercurial core contributor, they reinforced this.
To them, Mercurial is a core library with a limited set of user-facing
commands forming the stable API. Since core features (like storage) are
internal APIs (not public commands - like Git), this means they aren't
bound to backwards compatibility and can refactor internals as needed
and evolve over time without breaking the world. That is a terrific
luxury.&lt;/p&gt;
&lt;p&gt;An example of this future potential is
&lt;a href=&quot;http://mercurial.selenic.com/wiki/ChangesetEvolution&quot;&gt;changeset evolution&lt;/a&gt;.
If you don't know what that is, you should because it's awesome. One of
the things they figured out is how to propagate rebasing between
clones!&lt;/p&gt;
&lt;h3&gt;Comparing to Git&lt;/h3&gt;
&lt;p&gt;Two years ago I would have said I would never opt to use Mercurial over
Git. I cannot say that today.&lt;/p&gt;
&lt;p&gt;I do believe Git still has the advantage over Mercurial in a few areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Branch management. Mercurial branches are a non-starter for
  light-weigh work. Mercurial bookmarks are kinda-sorta like Git
  branches, but not quite. I &lt;em&gt;really&lt;/em&gt; like aspects of Git branches.
  Hopefully changeset evolution will cover the remaining gaps and more.&lt;/li&gt;
&lt;li&gt;Patch conflict management. Git seems to do a better job of resolving
  patch conflicts. But, I think this is mostly due to Mercurial's patch
  queue extension not using the same merge code as built-in commands
  (this is a fixable problem).&lt;/li&gt;
&lt;li&gt;Developer mind share and GitHub. The GitHub ecosystem makes up for
  many of Git's shortcomings. Bitbucket isn't the same.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, I believe Mercurial has the upper hand for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Command line friendliness. Git's command line syntax is notoriously
  awful and the concepts can be difficult to master.&lt;/li&gt;
&lt;li&gt;Extensibility. It's so easy to program custom workflows and commands
  with Mercurial. If you want to hack your version control system,
  Mercurial wins hands down. Where Mercurial embraces extensibility, I
  couldn't even find a page listing all the useful Git &lt;em&gt;extensions&lt;/em&gt;!&lt;/li&gt;
&lt;li&gt;Open source culture. Every time I've popped into the Mercurial IRC
  channel I've had a good experience. I get a response quickly and
  without snark. Git by contrast, well, let's just say I'd rather be
  affiliated with the Mercurial crowd.&lt;/li&gt;
&lt;li&gt;Future potential. Git is a content addressable key-value store with a
  version control system bolted on top. Mercurial is designed to be a
  version control system. Furthermore, Mercurial's code base is much
  easier to hack on than Git's. While Git has largely maintained feature
  parity in the last few years, Mercurial has grown new features. I see
  Mercurial evolving faster than Git and in ways Git cannot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's worth calling out the major detractors for each.&lt;/p&gt;
&lt;p&gt;I think Git's major weakness is its lack of extensibility and inability
to evolve (at least currently). Git will need to grow a better
extensibility model with better abstractions to compete with Mercurial
on new features. Or, the Git community will need to be receptive to
experimental features living in the core. All of this will require
some major API breakage. Unfortunately, I see little evidence this will
occur. I'm unable to find a &lt;em&gt;vision&lt;/em&gt; document for the future of Git, a
branch with major new features, or interesting threads on the mailing
list. I tried to ask in their IRC channel and got crickets.&lt;/p&gt;
&lt;p&gt;I think Mercurial's greatest weakness is lack of developer mindshare.
Git and GitHub are where it's at. This is huge, especially for projects
wanting collaboration.&lt;/p&gt;
&lt;p&gt;Of all those points, I want to stress the extensibility and future
potential of Mercurial. If hacking your tools to maximize potential
and awesomeness is your game, Mercurial wins. End of debate. However,
if you don't want to harness these advantages, then I think Git and
Mercurial are mostly on equal footing. But given the rate of
development in the Mercurial project and relative stagnation of Git
(I can't name a major new Git feature in years), I wouldn't be
surprised if Mercurial's feature set obviously overtakes Git's in
the next year or two. Mind share will of course take longer and will
likely depend on what hosting sites like GitHub and Bitbucket do
(I wouldn't be surprised if GitHub rebranded as &lt;em&gt;CodeHub&lt;/em&gt; or
something some day). Time will tell.&lt;/p&gt;
&lt;h3&gt;Extending case study&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;I have removed the case study that appeared in the original article
because as Mike Hommey observed in the comments, it wasn't a totally
accurate comparison. I don't believe the case study significantly added
much to the post, so I likely won't write a new one.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;From where I started with Mercurial, I never thought I'd say this. But
here it goes: I like Mercurial.&lt;/p&gt;
&lt;p&gt;I started warming up when it became faster and more robust in recent
versions in the last few years. When I learned about its flexibility and
the fundamentals of the project and thus its future potential, I became
a true fan.&lt;/p&gt;
&lt;p&gt;It's easy to not like Mercurial if you are a new user coming
from Git and are forced to use a new tool. But, once you take the time to
properly configure it and appreciate it for what it is and what it
can be, Mercurial is easy to like.&lt;/p&gt;
&lt;p&gt;I think Mercurial and Git are both fine version control systems. I would
happily use either one for a new project. If the social aspects of
development (including encouraging new contributors) were important to
me, I would likely select Git and GitHub. But, if I wanted something
just for me or I was a large project looking for a system that scales
and is flexible or was looking to the future, I'd go with Mercurial.&lt;/p&gt;
&lt;p&gt;Mercurial is a rising star in the version control world. It's getting
faster and better and enabling others to more easily innovate through
powerful extensions. The future is bright for this tool.&lt;/p&gt;</description>
	<pubDate>Sun, 12 May 2013 12:00:00 +0000</pubDate>
</item>
<item>
	<title>Erik Vold: Old School To Jetpack Part 1 - The Retrofit</title>
	<guid isPermaLink="false">http://work.erikvold.com/jetpack/2013/05/12/old-school-to-jetpack-retrofit</guid>
	<link>http://work.erikvold.com/jetpack/2013/05/12/old-school-to-jetpack-retrofit.html</link>
	<description>&lt;p&gt;Old school add-ons were developed with a similar mindset, which is that creating new windows is ok, and using XUL this became an easy to-do common practice. The times have changed, and opening new windows is no longer considered acceptable practice, opening tabs is now the preferred user experience.&lt;/p&gt;

&lt;p&gt;Now, Firefox has a huge cast of popular, restart addled, old school mannered add-ons, which is a problem. So how do we retrofit these geezers?&lt;/p&gt;

&lt;p&gt;I see three parts that need to be addressed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;New XUL windows (windows created by the add-on)&lt;/li&gt;

&lt;li&gt;XUL overlays (content added to windows created by Fx or another add-on)&lt;/li&gt;

&lt;li&gt;Back-end logic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I plan to write more about all three topics later, because the real solutions require more words and work than the shortcuts will.&lt;/p&gt;

&lt;h3&gt;Shortcuts&lt;/h3&gt;

&lt;h4&gt;Chrome.manifest&lt;/h4&gt;

&lt;p&gt;Because of &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=559306&quot;&gt;Bug 559306&lt;/a&gt; we can now include the old school add-on’s &lt;code&gt;chrome.manifest&lt;/code&gt; file in jetpacks. There are some limitations however, for more information on that see &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Extensions/Bootstrapped_extensions#chrome.manifest_in_bootstrapped_add-ons&quot;&gt;this page on the chrome.manifest in restartless add-ons&lt;/a&gt;. For instance, overlays will not be regestered, resource uris, components, and more. One can register a chrome uri however, with a &lt;code&gt;skin&lt;/code&gt; and &lt;code&gt;locale&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This means that add-ons which implement XUL windows can continue to use them as a Jetpack.&lt;/p&gt;

&lt;p&gt;These windows should be redesigned however, but this is no longer a bar to entry, and the resdesign of these windows can be done in a separate step from the conversion to Jetpack.&lt;/p&gt;

&lt;p&gt;Also, remember that any windows open which are associated to an add-on should be closed when the add-on unloads, if you do not do this then your add-on will not pass a full review on &lt;a href=&quot;https://addons.mozilla.org&quot;&gt;addons.mozilla.org&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Browser UI&lt;/h4&gt;

&lt;p&gt;Again, there are a few &lt;a href=&quot;https://github.com/mozilla/addon-sdk/wiki/Community-developed-modules&quot;&gt;useful third party modules&lt;/a&gt; which handle most common use cases, and if they do not cover your use case then they should provide some direction how to implement them.&lt;/p&gt;

&lt;p&gt;I’ve got a module in mind that should help with converting overlays, it’s a messy prototype right now though, so we’ll see how that goes..&lt;/p&gt;

&lt;h4&gt;Components&lt;/h4&gt;

&lt;p&gt;There are a few &lt;a href=&quot;https://github.com/mozilla/addon-sdk/wiki/Community-developed-modules&quot;&gt;useful third party modules&lt;/a&gt; out already which handle things like registering &lt;a href=&quot;https://github.com/Gozala/jetpack-protocol&quot;&gt;custom uris&lt;/a&gt; (this includes &lt;code&gt;about:&lt;/code&gt; uris, &lt;code&gt;resource:&lt;/code&gt; uris, and &lt;code&gt;whatever:&lt;/code&gt;), &lt;a href=&quot;https://github.com/erikvold/content-policy-jplib&quot;&gt;content policies&lt;/a&gt;, and in many cases there are better alternatives. For instance I’ve seen quite a few add-ons register components just in order to hear their ‘startup’ event, this is no longer necessary, with a Jetpack you can simply call &lt;code&gt;require('self').loadReason&lt;/code&gt; in &lt;code&gt;main.js&lt;/code&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 12 May 2013 07:00:00 +0000</pubDate>
	<author>evold@mozilla.com (Erik Vold)</author>
</item>
<item>
	<title>Pascal Finette: The Web Manifesto</title>
	<guid isPermaLink="true">http://blog.finette.com/2013/05/11/the-web-manifesto</guid>
	<link>http://blog.finette.com/2013/05/11/the-web-manifesto</link>
	<description>&lt;blockquote&gt;&lt;p&gt;We have come to build the most important thing in the world today, perhaps the most important thing ever. It connects us. It widens us. It deepens who we are. We don’t know what it is or what it will be in the future, but we do know it has made us better so far. Our dream is to enlarge it so that all people can join us and share the good in it while ameliorating the bad. This thing we are working on has no borders and – as far as we can see – no end. If everyone can join it, with equal access and no undue ownership, the world will be a much better place. That is why we are working here today.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;~ Kevin Kelly / &lt;a href=&quot;http://www.wired.com/magazine/2013/04/dreams/&quot;&gt;WIRED 21.05&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 12 May 2013 00:44:00 +0000</pubDate>
	<author>pascal@finette.com (Pascal Finette)</author>
</item>
<item>
	<title>Jared Wein: Firefox OS at Mobile Monday Detroit</title>
	<guid isPermaLink="false">http://msujaws.wordpress.com/?p=3179</guid>
	<link>http://msujaws.wordpress.com/2013/05/11/firefox-os-at-mobile-monday-detroit/</link>
	<description>&lt;p&gt;&lt;img alt=&quot;jared-wein&quot; class=&quot;alignright size-full wp-image-3186&quot; src=&quot;http://msujaws.files.wordpress.com/2013/05/23de683a2d94f6949630eadab26e79ba.jpeg?w=480&quot; style=&quot;border: 4px solid rgb(34,34,34); margin: 1em 0 0 10px;&quot; /&gt;If you haven’t heard about &lt;a href=&quot;http://www.mozilla.org/en-US/firefox/partners/&quot;&gt;Firefox OS&lt;/a&gt; before, or would like to learn more about it, you should come to this month’s Mobile Monday Detroit. I’ll be presenting at the meeting about Mozilla’s motivations for Firefox OS, how we’re opening up mobile hardware, and roadmap for the future.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mobile-monday&quot; class=&quot;alignright size-full wp-image-3189&quot; src=&quot;http://msujaws.files.wordpress.com/2013/05/mm1.png?w=480&quot; /&gt;It has been estimated that in the next 10 years, five billion people will gain access to the internet. Many of these people will be accessing the internet using mobile connection exclusively.&lt;/p&gt;
&lt;p&gt;One of the main goals of Firefox OS is to provide a device to people that brings with it the full web as compared to the limited subset of the web that is currently accessible on more basic feature phones. This also means providing web applications better access to hardware, so application developers can provide rich environments comparable to that of other mobile phone operating systems.&lt;/p&gt;
&lt;p&gt;As we build these hardware APIs, we have been working very hard to standardize them and push for other browsers to adopt them. You can &lt;a href=&quot;https://wiki.mozilla.org/WebAPI&quot;&gt;follow along with the progress of the WebAPI project by visiting our wiki&lt;/a&gt;. All of the FirefoxOS roadmaps, feature lists, etc can all be viewed online. This project really defines openness &lt;img alt=&quot;:)&quot; class=&quot;wp-smiley&quot; src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;compuware-campus-martiusjpg-e5172a9570eb8f42_large&quot; class=&quot;alignright size-medium wp-image-3180&quot; height=&quot;198&quot; src=&quot;http://msujaws.files.wordpress.com/2013/05/compuware-campus-martiusjpg-e5172a9570eb8f42_large.jpg?w=300&amp;amp;h=198&quot; style=&quot;border: 4px solid rgb(34,34,34); margin: 1em 0 .5em 10px;&quot; width=&quot;300&quot; /&gt;Mobile Monday Detroit is hosted at Compuware’s headquarters in downtown Detroit, at &lt;a href=&quot;http://maps.google.com/maps?q=One+Campus+Martius%2C+Detroit%2C+MI&quot;&gt;One Campus Martius&lt;/a&gt;. The event will start at 5:30pm and run until 8pm. Food and drinks will be provided. Please &lt;a href=&quot;http://www.meetup.com/Mobile-Monday-Detroit/events/107000572/&quot;&gt;RSVP (it’s free!) if you plan on attending&lt;/a&gt; so the organizers will have a good idea of how much food to order.&lt;/p&gt;
&lt;p&gt;Randy Nunez from Ford will also provide information on a variety of additional open source mobile OS platforms that are catching the attention of the developer community.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;547283_331671413548881_1769989273_n&quot; class=&quot;alignright size-full wp-image-3183&quot; src=&quot;http://msujaws.files.wordpress.com/2013/05/547283_331671413548881_1769989273_n.jpg?w=480&quot; style=&quot;border: 4px solid rgb(34,34,34); margin: 1em 0 .5em 10px;&quot; /&gt;Monday, May 13, 2013&lt;br /&gt;
5:30 PM to 8:00 PM&lt;br /&gt;
&lt;a href=&quot;http://maps.google.com/maps?q=One+Campus+Martius%2C+Detroit%2C+MI&quot; target=&quot;_blank&quot; title=&quot;&quot;&gt;Compuware Building&lt;br /&gt;
&lt;/a&gt;One Campus Martius, Detroit, MI (&lt;a href=&quot;http://maps.google.com/maps?q=One+Campus+Martius%2C+Detroit%2C+MI&quot; target=&quot;_blank&quot;&gt;map&lt;/a&gt;)&lt;/p&gt;
&lt;br /&gt; Tagged: &lt;a href=&quot;http://msujaws.wordpress.com/tag/detroit/&quot;&gt;detroit&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/firefox/&quot;&gt;firefox&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/firefoxos/&quot;&gt;firefoxos&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/mozilla/&quot;&gt;mozilla&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/planet-mozilla/&quot;&gt;planet-mozilla&lt;/a&gt;, &lt;a href=&quot;http://msujaws.wordpress.com/tag/presentation/&quot;&gt;presentation&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/msujaws.wordpress.com/3179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/msujaws.wordpress.com/3179/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=msujaws.wordpress.com&amp;amp;blog=5511932&amp;amp;post=3179&amp;amp;subd=msujaws&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 11 May 2013 16:39:34 +0000</pubDate>
	<dc:creator>msujaws</dc:creator>
</item>
<item>
	<title>Erik Vold: Blocking Content With Jetpacks</title>
	<guid isPermaLink="false">http://work.erikvold.com/jetpack/2013/05/11/content-policy-jetpack-module</guid>
	<link>http://work.erikvold.com/jetpack/2013/05/11/content-policy-jetpack-module.html</link>
	<description>&lt;p&gt;Many of the most popular add-ons have a common function, they block content. &lt;a href=&quot;https://addons.mozilla.org/firefox/addon/adblock-plus/&quot;&gt;Adblock Plus&lt;/a&gt; blocks ads, &lt;a href=&quot;https://addons.mozilla.org/firefox/addon/noscript/&quot;&gt;NoScript&lt;/a&gt; blocks scripts, and &lt;a href=&quot;https://addons.mozilla.org/firefox/addon/ghostery/&quot;&gt;Ghostry&lt;/a&gt; blocks tracking software which uses images, scripts and other means to do their business.&lt;/p&gt;

&lt;p&gt;This is why I wrote a &lt;a href=&quot;https://github.com/erikvold/content-policy-jplib&quot;&gt;content-policy module&lt;/a&gt; for Mozilla’s Add-on SDK. The API is rough at the moment, and I plan to change that quite a bit. For the moment though we can take the &lt;a href=&quot;https://addons.mozilla.org/firefox/addon/no-google-analytics/&quot;&gt;No Google Analytics&lt;/a&gt; add-on as an example &lt;a href=&quot;https://github.com/erikvold/no-ga&quot;&gt;source here&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lib/main.js&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const { ContentPolicy } = require('content-policy');
const GA_REGEX = /(.*\.)?google-analytics\.com$/i;
const { URL } = require('sdk/url');

ContentPolicy({
  shouldLoad: function({ location }) {
    // if the hist is google-analytics.com then block it
    if (URL(location).host.match(GA_REGEX))
      return false; // returning false rejects the request before it starts
    return true; // returning true does not reject the request
  }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I’ll improve the match later, but you can see how easy that is, and I promise I’ll make it easier.&lt;/p&gt;</description>
	<pubDate>Sat, 11 May 2013 07:00:00 +0000</pubDate>
	<author>evold@mozilla.com (Erik Vold)</author>
</item>
<item>
	<title>Selena Deckelmann: TIL: Formatting, search_path and colorcolumn</title>
	<guid isPermaLink="false">http://www.chesnok.com/daily/?p=4793</guid>
	<link>http://www.chesnok.com/daily/2013/05/10/til-formatting-search_path-and-colorcolumn/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=til-formatting-search_path-and-colorcolumn</link>
	<description>&lt;p&gt;The last six months have involved a lot more writing of code than the previous couple of years.&lt;/p&gt;
&lt;p&gt;I’ve been tweeting little things I learn on a daily basis and thought I’d look back on this week.&lt;/p&gt;
&lt;h3&gt;format()&lt;/h3&gt;
&lt;p&gt;A reocurring problem with report writing is getting numbers formatted properly for the occassion. I discovered ‘format’ in Python this week:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print &quot;{0:.2f}%&quot;.format(float(1)/3 * 100)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That prints out a float to 2 decimal places. I looked around and &lt;a href=&quot;http://www.diveintopython.net/native_data_types/formatting_strings.html&quot;&gt;Dive Into Python&lt;/a&gt; has similar syntax, but without the format() function. So, the equivalent would be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print &quot;blah %.2f&quot; % (float(1) / 3 * 100)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, why use one over the other? A user on &lt;a href=&quot;http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format&quot;&gt;StackOverflow&lt;/a&gt; suggested that compatibility with 2.5 might drive a person to use ‘%’ over ‘format()’, but otherwise, the poster suggested that format() is the cleaner looking and more flexible choice.&lt;/p&gt;
&lt;h3&gt;set search_path = bixie&lt;/h3&gt;
&lt;p&gt;I’m working on a new schema for a &lt;a href=&quot;http://xor.lonnen.com/2013/04/11/error-reporting.html&quot;&gt;project&lt;/a&gt;. We’re rolling out a prototype quickly, so we’re going to house it in our existing production database for now. To keep things easy to clean up, &lt;a href=&quot;http://twitter.com/lxt&quot;&gt;Laura&lt;/a&gt; suggested that we put things into a &lt;a href=&quot;http://www.postgresql.org/docs/current/static/sql-createschema.html&quot;&gt;separate schema&lt;/a&gt;. For managing our database models, I’ve switched to using SQLAlchemy, and also alembic for migrations. This made it super easy to specify that I wanted all the Bixie related tables in their own schema:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class BixieCrash(DeclarativeBase):                                              
    __table_args__ = {'schema': 'bixie'}                                        
    __tablename__ = 'crashes'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that was it.&lt;/p&gt;
&lt;p&gt;Then, to avoid having to add ‘bixie.’ to all the table paths in test queries, I put this command into the tests:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; cursor.execute(&quot;&quot;&quot; SET search_path TO bixie &quot;&quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I imagine there are some other ways to handle this. We’re not really using the ORM for anything other than schema loading, so I’ll probably add that to our connection initialization code for the new app. Then developers can write their queries as without any concerns about being in the correct schema.&lt;/p&gt;
&lt;p&gt;And I’ll glow just a little bit about deploying alembic on stage!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;set colorcolumn=80&lt;/h3&gt;
&lt;p&gt;I’ve been trying to write prettier Python. Today’s micro-effort was figuring out how display a vertical line to tell me when I exceed the 80 character width.  The proper command to add to .vimrc is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:set colorcolumn=80
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which looks something like:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.chesnok.com/daily/wp-content/uploads/2013/05/Screenshot-from-2013-05-10-152620.png&quot;&gt;&lt;img alt=&quot;colorcolumn in action&quot; class=&quot;aligncenter size-medium wp-image-4796&quot; height=&quot;168&quot; src=&quot;http://www.chesnok.com/daily/wp-content/uploads/2013/05/Screenshot-from-2013-05-10-152620-300x168.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 10 May 2013 22:34:24 +0000</pubDate>
	<dc:creator>selena</dc:creator>
</item>
<item>
	<title>Doug Belshaw: Weeknote 19/2013</title>
	<guid isPermaLink="false">http://dougbelshaw.com/blog/?p=35799</guid>
	<link>http://dougbelshaw.com/blog/2013/05/10/weeknote-192013/</link>
	<description>&lt;p&gt;This week I’ve been:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Taking &lt;/strong&gt;a day off. It was Bank Holiday on Monday – a national holiday in the UK. I still however spent 4pm-5pm… &lt;em&gt;&amp;lt;drumroll&amp;gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hosting&lt;/strong&gt; the weekly &lt;a href=&quot;http://weblitstd.tumblr.com/post/49848655698/weekly-community-call-6th-may-2013-in&quot;&gt;Web Literacy standard call&lt;/a&gt;. We motored through our first pass of defining the skills under the competencies in the ‘Connecting’ strand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writing &lt;/strong&gt;a post for Week 1 of the Mozilla #teachtheweb MOOC: &lt;a href=&quot;http://dougbelshaw.com/blog/2013/05/05/how-transferable-are-coding-skills-to-other-domains-why-is-learning-a-little-code-important-teachtheweb/&quot; rel=&quot;bookmark&quot; title=&quot;How transferable are coding skills to other domains? Why is learning a little code important? (#teachtheweb)&quot;&gt;How transferable are coding skills to other domains? Why is learning a little code important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responding &lt;/strong&gt;to enquiries by people and organisations about integrating with the &lt;a href=&quot;http://openbadges.org&quot;&gt;OBI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Travelling&lt;/strong&gt; to and from London to meet with &lt;a href=&quot;http://en.wikipedia.org/wiki/Jim_Knight&quot;&gt;Lord Jim Knight&lt;/a&gt; and &lt;a href=&quot;http://stireducation.org/&quot;&gt;STiR education&lt;/a&gt; about using Open Badges for teacher education in India.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enjoying&lt;/strong&gt; a conversation over lunch London with the ever-enthusiastic &lt;a href=&quot;http://twitter.com/eugenieee&quot;&gt;Eugenie Teasley&lt;/a&gt; from &lt;a href=&quot;http://www.sparkandmettle.org.uk/&quot;&gt;Spark + Mettle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collating&lt;/strong&gt; questions about Open Badges and then answering them in &lt;a href=&quot;http://dougbelshaw.com/blog/2013/05/08/answering-your-questions-about-open-badges/&quot;&gt;this blog post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffering&lt;/strong&gt; from a migraine on Thursday. I couldn’t see much due to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Aura_%28symptom%29&quot;&gt;aura&lt;/a&gt; so I called it a day about 10:30am. I lay down and listened to podcasts. The Moral Maze episode on &lt;a href=&quot;http://www.bbc.co.uk/programmes/b01r0yt8&quot;&gt;The Ring of Gyges&lt;/a&gt; was fascinating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Travelling&lt;/strong&gt; to &lt;a href=&quot;http://www.bbc.co.uk/aboutthebbc/bbcnorth/&quot;&gt;BBC North&lt;/a&gt; in Salford to deliver a session on Open Badges. It went pretty well, but I felt like I wasn’t getting my words out properly or explaining things as well as I usually do. It’s often an issue post-migraine. &lt;a href=&quot;http://www.slideshare.net/dajbelshaw/open-badgesbbcnorth&quot;&gt;Slides here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next week, after five straight weeks of travelling and hotels, I’m home&lt;em&gt; for the entire week&lt;/em&gt;. Woohoo! The week after I’m in Toronto for the Mozilla All-Hands meeting, so plenty to psych myself up for…&lt;/p&gt;</description>
	<pubDate>Fri, 10 May 2013 19:03:52 +0000</pubDate>
	<dc:creator>Doug Belshaw</dc:creator>
</item>
<item>
	<title>Will Kahn-Greene: My thoughts on Elasticsearch: Part 1: indexing</title>
	<guid isPermaLink="false">http://www.bluesock.org/~willg/blog/dev/elasticsearch_part1_index</guid>
	<link>http://www.bluesock.org/~willg/blog/dev/elasticsearch_part1_index.html</link>
	<description>&lt;div class=&quot;section&quot; id=&quot;summary&quot;&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;I just finished up an overhaul of &lt;a class=&quot;reference external&quot; href=&quot;http://elasticutils.rtfd.org&quot;&gt;ElasticUtils&lt;/a&gt; and then an overhaul of the search
infrastructure for &lt;a class=&quot;reference external&quot; href=&quot;https://support.mozilla.org&quot;&gt;support.mozilla.org&lt;/a&gt;.  During that period of time, I
thought about extending the ElasticUtils documentation to include
things I discovered while working on these projects.  Then I decided
that this information is temporal---it's probably good now, but might
not be in a year.  Maintaining it in the ElasticUtils docs seemed like
more work than it was worth.&lt;/p&gt;
&lt;p&gt;Thus I decided to write a series of blog posts.&lt;/p&gt;
&lt;p&gt;This one covers indexing.  Later ones will cover mappings, searching
and other things.&lt;/p&gt;
&lt;p&gt;It's also long, rambling and contains code.  The rest is after the
break.&lt;/p&gt;
&lt;p class=&quot;readmore&quot;&gt;&lt;a href=&quot;http://www.bluesock.org/~willg/blog/dev/elasticsearch_part1_index.html&quot;&gt;read more after the break...&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;
  [&lt;a href=&quot;http://www.bluesock.org/~willg/blog/dev/elasticsearch_part1_index.html&quot;&gt;Comments&lt;/a&gt;]
&lt;/p&gt;</description>
	<pubDate>Fri, 10 May 2013 17:49:00 +0000</pubDate>
</item>
<item>
	<title>Kim Moir: Releng 2013 keynotes: John O'Duinn (Mozilla) and Roman Scheiter (LinkedIn)</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-25023280.post-5698922101993591392</guid>
	<link>http://relengofthenerds.blogspot.com/2013/05/releng-2013-keynotes-john-oduinn.html</link>
	<description>There are two exciting keynotes planned for &lt;a href=&quot;http://releng.polymtl.ca/&quot;&gt;Releng 2013&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://releng.polymtl.ca/program.html&quot;&gt;John O'Duinn&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/joduinn&quot;&gt;Director of Release Engineering at Mozilla&lt;/a&gt; will kick off the workshop with his keynote &lt;i&gt;&lt;b&gt;Release Engineering as a Force Multiplier&lt;/b&gt;&lt;/i&gt;.  The build and release process used to be a pain point at Mozilla, but now makes the company and community more productive as a whole.  &lt;span class=&quot;author-p-589&quot;&gt;John will describe how the team added support  for project branches to allow concurrent development, rethought continuous integration and increased  capacity by moving to a hybrid-cloud build infrastructure. These changes  improved several aspects of the business, including switching to a rapid  release model and reducing turnaround time on a release from weeks to &lt;a href=&quot;http://oduinn.com/blog/2013/03/13/firefox-19-0-2-by-the-wall-clock-numbers/&quot;&gt;hours&lt;/a&gt;.  &lt;/span&gt;As a result,  Mozilla &lt;span class=&quot;author-p-589&quot;&gt;&lt;span class=&quot;author-p-589&quot;&gt;improved &lt;/span&gt;&lt;span class=&quot;author-p-3131&quot;&gt;its&lt;/span&gt;&lt;span class=&quot;author-p-589&quot;&gt; abilities against much bigger and better funded compe&lt;/span&gt;&lt;span class=&quot;author-p-3131&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;author-p-589&quot;&gt;itors in the marketplace while also allowing&lt;/span&gt;&lt;span class=&quot;author-p-3131&quot;&gt; them&lt;/span&gt;&lt;span class=&quot;author-p-589&quot;&gt; to enter new markets and help ensure its long-term success.&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;author-p-589&quot;&gt;&lt;a href=&quot;http://releng.polymtl.ca/program.html#roman&quot;&gt;Roman Scheiter&lt;/a&gt;, &lt;/span&gt;&lt;span class=&quot;author-p-589&quot;&gt;&lt;a href=&quot;http://www.linkedin.com/in/rscheiter&quot;&gt;Engineering Services Director at LinkedIn&lt;/a&gt;,&lt;/span&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;will present the afternoon keynote entitled &lt;i&gt;&lt;b&gt;Against All Odds – Completely Overhauling Linkedin's Release Process&lt;/b&gt;&lt;/i&gt;.  This session will cover the evolution of LinkedIn’s release process from  its earliest days to the point where the rapidly growing engineering  team necessitated a radical shift. This shift, an executive sponsored effort to address technical  debt and introduce new thinking to boost engineering efficiency allows six hundred developers to  release thousands of changes per week without compromising  quality.  As part of this undertaking, LinkedIn learned many best  practices, developed tools and custom infrastructure, and lived through  the internal cultural changes needed to make this independent release  process work.   Roman will detail the evolution and results of this shift so you can learn directly from LinkedIn's pain.&lt;br /&gt;&lt;div class=&quot;&quot; id=&quot;magicdomid10&quot;&gt;  &lt;/div&gt;&lt;div class=&quot;&quot; id=&quot;magicdomid10&quot;&gt;&lt;/div&gt;In addition to these fantastic keynotes, we also have talks from release engineers and researchers from Netflix, Google,  Microsoft, Gnome, Red Hat, IBM, several universities and more!  We'll also have a panel at the end of the day to discuss the future of release engineering.&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href=&quot;http://releng.polymtl.ca/program.html&quot;&gt;full program&lt;/a&gt; on the Releng 2013 site.  To register for the conference, which is managed as part of the larger ICSE conference, you can follow this link and choose the &lt;a href=&quot;http://2013.icse-conferences.org/content/registration&quot;&gt;one-day-workshop.&lt;/a&gt;    See you in San Francisco on May 20!</description>
	<pubDate>Fri, 10 May 2013 14:44:00 +0000</pubDate>
	<author>noreply@blogger.com (Kim Moir)</author>
</item>
<item>
	<title>Laura Hilliger: Planning, Running, Visualizing #teachtheweb</title>
	<guid isPermaLink="false">http://www.zythepsary.com/?p=1905</guid>
	<link>http://www.zythepsary.com/techie/planning-running-visualizing-teachtheweb/</link>
	<description>&lt;p&gt;&lt;/p&gt;Week 3 of #teachtheweb is right around the corner, and I thought it might be nice to do a quick shareout of the planning and running of the MOOC.
&lt;h3&gt;Kudos!&lt;/h3&gt;
Before I say another word, I have to give &lt;a href=&quot;http://michellethorne.cc&quot;&gt;my partner in crime&lt;/a&gt; a gigantic love bomb. The word “collaboration” only begins to describe the epic brain connection &lt;a href=&quot;http://twitter.com/thornet&quot;&gt;Michelle&lt;/a&gt; and I have seemingly developed. Additionally, &lt;a href=&quot;http://michellethorne.cc/2013/05/teachtheweb-an-online-course/&quot;&gt;as Michelle noted&lt;/a&gt;, the entire &lt;a href=&quot;http://webmaker.org/teach&quot;&gt;Webmaker Mentor team&lt;/a&gt; has been massively supportive and absolutely integral to getting &lt;a href=&quot;http://hivenyc.org/teachtheweb&quot;&gt;Mozilla's first MOOC&lt;/a&gt; off the ground. &lt;strong&gt;High-fives all around!&lt;/strong&gt;
&lt;h3&gt;Conspiring&lt;/h3&gt;
We've been having calls with wonderful community members who signed up to help create the #teachtheweb experience. We've been calling them the &lt;strong&gt;Super Mentor Calls&lt;/strong&gt;.

The Super Mentor Kick-off call on April 19 had &lt;strong&gt;41 attendees from 17 different countries&lt;/strong&gt;. They are designers, developers, educators, makers, architects, librarians, youth workers, entrepreneurs, teens and more, who answered our call to be super mentors in &lt;a href=&quot;https://twitter.com/search?q=%23teachtheweb&amp;amp;src=typd&quot;&gt;#teachtheweb&lt;/a&gt;.

This call was used to help the Super Mentors understand what we were asking them to do throughout the 9-week course. &lt;a href=&quot;http://hivenyc.org/teachtheweb/be-a-super-mentor/&quot; target=&quot;_blank&quot;&gt;This blog post explains the job.&lt;/a&gt;

We also used the opportunity to explain &lt;a href=&quot;http://hivenyc.org/teachtheweb/about/&quot; target=&quot;_blank&quot;&gt;the concept of a cMOOC&lt;/a&gt; and to thank everyone for signing up before they even knew what they signed up for.

&lt;a href=&quot;https://twitter.com/MozTeach/supermentors&quot; target=&quot;_blank&quot;&gt;Follow our Twitter List of Super Mentors&lt;/a&gt;

The next week, April 25, we took some time to celebrate Super Mentor makes after many created introductions using Webmaker tools. We gave each other virtual high fives for being engaging, thoughtful digital citizens and shared a few moments of excitement centered around the fact that &lt;a href=&quot;http://mzl.la/gpluswebmaker&quot; target=&quot;_blank&quot;&gt;the Webmaker Community&lt;/a&gt; is full of intelligent human beings looking to change the world.

Next, we explained our launch strategy with a &lt;strong&gt;“Heads up! It's going to get busy!”&lt;/strong&gt; and proposed the formation of Study Groups. We created a &lt;a href=&quot;https://docs.google.com/spreadsheet/ccc?key=0Al0Wg7eR7tHcdDRGVEJCMEFXbmRwV3RUamhHRVlfRHc&amp;amp;usp=sharing&quot; target=&quot;_blank&quot;&gt;lightweight google doc&lt;/a&gt; and asked if anyone would be interested in running a smaller study group during the experience. Many were, and the Google Doc started filling up with ideas for Study Groups based on interest, language and/or geography.

We also talked about the &lt;strong&gt;content creation procedure&lt;/strong&gt; and came up with a plan to braindump into Etherpads, filter and curate. We want to make sure any one who wants to contribute to the content of #teachtheweb can. &lt;a href=&quot;http://hivenyc.org/teachtheweb/planning/&quot; target=&quot;_blank&quot;&gt;If you want to help plan, see the planning page!&lt;/a&gt;

We talked about the connection between &lt;a href=&quot;http://webmaker.org/teach&quot; target=&quot;_blank&quot;&gt;#teachtheweb&lt;/a&gt; and &lt;a href=&quot;http://webmaker.org/party&quot; target=&quot;_blank&quot;&gt;#MakerParty&lt;/a&gt; (#teachtheweb is kind of like Party Prep), and the Super Mentors began to volunteer to spread the word about both initiatives in their local areas as well as online. Finally, Super Mentors volunteered to help moderate the various #teachtheweb channels during the &lt;a href=&quot;http://hivenyc.org/teachtheweb/live-sessions/&quot; target=&quot;_blank&quot;&gt;May 2&lt;sup&gt;nd&lt;/sup&gt; Live Session&lt;/a&gt; and &lt;a href=&quot;http://storify.com/lainiedecoursy/teachtheweb-week-1&quot; target=&quot;_blank&quot;&gt;#teachtheweb Kick-off&lt;/a&gt;.

On the &lt;strong&gt;#teachtheweb launch date, May 2&lt;sup&gt;nd&lt;/sup&gt;&lt;/strong&gt;, we had a relatively quick call with Super Mentors to celebrate the &lt;a href=&quot;http://mzl.la/gpluswebmaker&quot; target=&quot;_blank&quot;&gt;G+ Community&lt;/a&gt;'s growth and talk about the Live Session. Super Mentors signed up to participate via video, monitor channels, serve as tech support and help out on IRC. The session went, I heard, nicely. &lt;a href=&quot;http://hivenyc.org/teachtheweb/live-sessions/&quot; target=&quot;_blank&quot;&gt;You can watch the video here.&lt;/a&gt;

Yesterday, May 9&lt;sup&gt;th&lt;/sup&gt;, we spent a little time talking about how to get participants more involved and how to be better at sharing with each other and the larger community. We decided to try to give each other weekly report backs on how Study Groups were doing in the following Super Mentor calls.
&lt;h3&gt;Content Creation&lt;strong&gt; &lt;/strong&gt;&lt;/h3&gt;
Each week a post is released in the &lt;a href=&quot;http://hivenyc.org/teachtheweb/planning/&quot; target=&quot;_blank&quot;&gt;Planning section&lt;/a&gt; of #teachtheweb, which invites any and everyone to contribute their thoughts to a particular topic. The Super Mentors get extra reminders, but the content creation process is completely open. If you're interested in contributing your thoughts to a particular topic, check the planning page for &lt;strong&gt;new topic etherpads each Monday&lt;/strong&gt;.

Monday is also the day that we've been distilling these Etherpads into a digestible blogpost with extra readings, resources and tasks. The filtering and curation of everyone's braindump is massively interesting but quite difficult. The posts need to be relatively short to keep people engaged. &lt;strong&gt;We would rather that people spend their allotted MOOC time completing the weekly Make Projects and reflecting on their own work, instead of focusing too heavily on truncated descriptions of complex topics.&lt;/strong&gt; We believe in Making as Learning, so we want to spend as much time as possible making, sharing, remixing, iterating and making some more.

Tuesday's we post new topics to the &lt;a href=&quot;http://hivenyc.org/teachtheweb&quot; target=&quot;_blank&quot;&gt;#teachtheweb site&lt;/a&gt;. We also do shareouts in the &lt;a href=&quot;https://wiki.mozilla.org/Webmakers/Community_Calls&quot; target=&quot;_blank&quot;&gt;Weekly Webmaker Community&lt;/a&gt; call.

Thursday's are the days we do live sessions (only 3 throughout the 9 weeks, one on May 2&lt;sup&gt;nd&lt;/sup&gt;, May 23&lt;sup&gt;rd&lt;/sup&gt; and June 13&lt;sup&gt;th&lt;/sup&gt;) and Twitter Chats. Which leads me to the visualization piece of this post. This morning, I really just wanted to MAKE stuff. So I started fishing through the &lt;a href=&quot;https://docs.google.com/a/zythepsary.com/spreadsheet/ccc?key=0AmGCLduZQ7Y2dEZkV3NrQVhxMjVLZmxqLWZ5RXZDbVE#gid=82&quot; target=&quot;_blank&quot;&gt;Twitter archive&lt;/a&gt; &lt;a href=&quot;https://twitter.com/jeannieccrowley&quot; target=&quot;_blank&quot;&gt;Jeannie Crowley&lt;/a&gt; created for #teachtheweb. Then I got a data bug and started looking at other numbers. I made two things:
&lt;h4&gt;A Visualization of Relationships between Words used in #teachtheweb Tweets&lt;/h4&gt;
[caption id=&quot;attachment_1916&quot; align=&quot;aligncenter&quot; width=&quot;800&quot;]&lt;a href=&quot;http://www-958.ibm.com/v/305612&quot;&gt;&lt;img alt=&quot;Click the image to play with this interactive visualization thingie&quot; class=&quot;size-full wp-image-1916&quot; height=&quot;283&quot; src=&quot;http://www.zythepsary.com/wp-content/uploads/2013/05/teachtheweb_w2rel1.png&quot; width=&quot;800&quot; /&gt;&lt;/a&gt; Click the image to play with this interactive visualization thingie[/caption]
&lt;h4&gt;A Slightly Interactive Infographic&lt;strong&gt;
&lt;/strong&gt;&lt;/h4&gt;
[iframe src=&quot;//infogr.am/teachtheweb-27148&quot; width=&quot;550&quot; height=&quot;2161&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none;&quot;]
&lt;div style=&quot;width: 550px; border-top: 1px solid #acacac; padding-top: 3px; font-family: Arial; font-size: 10px; text-align: center;&quot;&gt;&lt;a href=&quot;http://infogr.am/teachtheweb-27148&quot; style=&quot;color: #acacac; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;teachtheweb&lt;/a&gt; | &lt;a href=&quot;http://infogr.am&quot; style=&quot;color: #acacac; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;Infographics&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;MOOC Attrition&lt;/h3&gt;
One of the things that has been bugging me is the rumors of &lt;strong&gt;MOOC attrition&lt;/strong&gt; rates. I've read percentages from &lt;strong&gt;85% to 98%&lt;/strong&gt; in the last couple of months, and I was worried that the participants in #teachtheweb will soon be dropping out and the conversation will come to a standing halt. Up until a few days ago, I was basically waiting for the ball to drop.

Then I read &lt;a href=&quot;http://www.huffingtonpost.com/dr-keith-devlin/moocs-and-the-myths-of-dr_b_2785808.html&quot; target=&quot;_blank&quot;&gt;this post from a mathematician at Stanford&lt;/a&gt; and decided to just stop worrying about it. &lt;strong&gt;It's easy to sign up for things.&lt;/strong&gt; You just put in one of your many email addresses and that's that. It's easy to &lt;i&gt;begin&lt;/i&gt; the journey into a specific community. You just use the hashtag, comment on people's posts, follow some people and start trying to know people through their digital representations and artifacts. &lt;strong&gt;But it's not easy to &lt;i&gt;remain&lt;/i&gt; an active member of a community.&lt;/strong&gt; Being active takes time, perseverance, patience, understanding, collaboration, connection, mentorship, and a whole mess of other things. We all participate in multiple communities, and it's natural that one community or another will take precedence on a given day.

I just hope that the those of you who have found the &lt;a href=&quot;http://mzl.la/gpluswebmaker&quot; target=&quot;_blank&quot;&gt;Webmaker Mentor Community&lt;/a&gt; through &lt;a href=&quot;http://hivenyc.org/teachtheweb&quot; target=&quot;_blank&quot;&gt;#teachtheweb&lt;/a&gt; decide to give this community precedence from time to time. &lt;strong&gt;We're teaching the world the Web – and we definitely need your help.&lt;/strong&gt;
&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; href=&quot;http://www.zemanta.com/?px&quot; title=&quot;Enhanced by Zemanta&quot;&gt;&lt;img alt=&quot;Enhanced by Zemanta&quot; class=&quot;zemanta-pixie-img&quot; src=&quot;http://img.zemanta.com/zemified_e.png?x-id=0aa1fb66-c280-4690-8ac9-6e517bb9c3e1&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 10 May 2013 13:14:42 +0000</pubDate>
	<dc:creator>Laura Hilliger</dc:creator>
</item>
<item>
	<title>Brandon Savage: Making better object oriented design decisions</title>
	<guid isPermaLink="false">http://www.brandonsavage.net/?p=2443</guid>
	<link>http://www.brandonsavage.net/making-better-object-oriented-design-decisions/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=making-better-object-oriented-design-decisions</link>
	<description>Last week I finished up the first section of The Object Oriented PHP Masterclass. The class was great, and I learned about as much from my students as they learned from me. One of the most common questions I got from my students was “how do I make decisions about how to design my object [...]</description>
	<pubDate>Fri, 10 May 2013 11:00:36 +0000</pubDate>
	<dc:creator>Brandon Savage</dc:creator>
</item>
<item>
	<title>Christian Heilmann: #justcode</title>
	<guid isPermaLink="false">http://christianheilmann.com/?p=3440</guid>
	<link>http://christianheilmann.com/2013/05/10/justcode/</link>
	<description>&lt;p&gt;As developers we are incredibly lucky. We work in a very growing and immensely well paid market, our companies shower us with benefits, companies offer us jobs rather than having to send out hundreds of CVs on the off-chance and even the mass media and politicians start talking about “coding” being a skill everybody needs.&lt;/p&gt;

	&lt;p&gt;Quite some part of this success is based on the stubbornness we showed in the past. When we got a task to build something we didn’t give up on it and said it is impossible. Instead we went back in our corner and tried and failed and tried again with sparks flying and code explosions happening until we achieved what we wanted. Think &lt;a href=&quot;https://en.wikipedia.org/wiki/Bunsen_Honeydew&quot;&gt;Dr. Bunsen Honedew’s laboratory&lt;/a&gt; instead of &lt;a href=&quot;https://en.wikipedia.org/wiki/Statler_and_Waldorf&quot;&gt;Statler and Waldorf&lt;/a&gt;.&lt;/p&gt;

	&lt;p&gt;This gave especially the web a strange “hack it together” reputation that many people keep bringing up when it comes to replacing JavaScript for example with “more organised and professional” languages. But you know what? I really think when it comes to the web, this is its main strength.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;The fun of coding&lt;/h3&gt;&lt;img alt=&quot;whimsy&quot; src=&quot;http://christianheilmann.com/wp-content/uploads/2013/05/whimsy.jpg&quot; /&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;As explained earlier in my &lt;a href=&quot;http://christianheilmann.com/2013/01/31/flash-is-not-the-enemy-our-lack-of-focus-on-what-is-important-is/&quot;&gt;Flash is not the enemy&lt;/a&gt; post, whimsy and spontaneous ideas is what made the web a larger media outlet than it was. It wasn’t the large sites that got non-technical people excited. It was the funny animation and short-lived game that you could mail to your friends.&lt;/p&gt;

	&lt;p&gt;Therefore I think it is important to celebrate this for yourself from time to time. Personally I find myself extremely lucky to have been at the right time (and moving around to the right places) when the web exploded into an offering of amazingly cool things and while I am sure as hell not proud of the code I had to write to get things done in the past, I am happy that I did and that I didn’t give up or wait until someone else solves my problems for me.&lt;/p&gt;

	&lt;p&gt;Having just taught &lt;a href=&quot;http://industryconf.com/workshop/&quot;&gt;a workshop on &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; at Industryconf&lt;/a&gt; I found that we are losing a bit on that. Attendees were worried that they need to learn a lot of libraries and find the right plugins to get started and once shown that they have the power to do most of what they want using the things browsers come with out of the box got quickly into enjoying themselves reaching new levels.&lt;/p&gt;

	&lt;p&gt;One thing I did with the attendees is a &lt;a href=&quot;https://www.youtube.com/watch?v=SwzH75_-3N4&quot;&gt;To-Do List App in plain &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;/JS/CSS (No sound)&lt;/a&gt;.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;This is what the &lt;a href=&quot;https://webmaker.org/en-US/&quot;&gt;Mozilla Webmaker Project&lt;/a&gt; is about – to get non-programmers excited about building things for the web. And it is incredibly exciting to see some of these events as a “professional”.&lt;/p&gt;

	&lt;p&gt;I think it is very important to never forget about the wonder we experienced the first time we made something show up on screen or wrote our first condition that printed out “is amazing” when you entered your name or “is boring” when it was another one.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Be fearless&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;A lot of times being creative means being fearless. Watching &lt;a href=&quot;http://worrydream.com/&quot;&gt;Bret Victor’s talks&lt;/a&gt; and seeing his &lt;a href=&quot;http://worrydream.com/LearnableProgramming/&quot;&gt;Learnable programming course&lt;/a&gt; and Seb Lee-Delisle’s &lt;a href=&quot;http://seb.ly/training/&quot;&gt;training courses&lt;/a&gt; they consist of one main thing – play with things and worry about them breaking later. Amazing results happen when the outcome and the input get as close together as possible – not when things happen using dozens of abstractions.&lt;/p&gt;

	&lt;p&gt;This does not have to be visual from the get-go though. The &lt;a href=&quot;http://phoboslab.org/log/2013/05/mpeg1-video-decoder-in-javascript&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MPEG&lt;/span&gt;-1 decoder in pure JavaScript&lt;/a&gt; for example is pure byte-shifting but blew me away in its fearlessness of what could go wrong.&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Go, code!&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;Why not have a go? Take 10 minutes, half and hour, an hour out of your life right now and use it to #justcode something, anything. Just play with an idea, put it on &lt;a href=&quot;http://jsfiddle.net&quot;&gt;JSFiddle&lt;/a&gt;, &lt;a href=&quot;http://codepen.io&quot;&gt;Codepen&lt;/a&gt;, &lt;a href=&quot;http://jsbin.com&quot;&gt;JSBin&lt;/a&gt;, &lt;a href=&quot;http://dabblet.com&quot;&gt;Dabblet&lt;/a&gt;, or whatever other amazing tool we have right now and share it.&lt;/p&gt;

	&lt;p&gt;Don’t build a perfect plugin, don’t build a solution dependent on preprocessors and libraries. Go vanilla and just play with what we have in browsers today. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_animations&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CSS &lt;/span&gt;Animations&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_transitions&quot;&gt;Transitions&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/HTML/Canvas/Tutorial&quot;&gt;Canvas&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/HTML/Using_HTML5_audio_and_video&quot;&gt;Audio and Video&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; and Friends&lt;/a&gt; – we have so many cool toys to play with. Don’t explore the main use case either. Yes, Canvas is for putting things on the screen, but it is also about reading image data.&lt;/p&gt;

	&lt;p&gt;We got were we are by playing with things. Never forget this and never stop playing.&lt;/p&gt;
 &lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/chrisheilmann/~4/0ySPYgq14sk&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 10 May 2013 09:50:29 +0000</pubDate>
	<dc:creator>Chris Heilmann</dc:creator>
</item>
<item>
	<title>Just Browsing: Programming Brain Teaser #6: Fixed-point principle</title>
	<guid isPermaLink="false">http://www.salsitasoft.com/?p=2749</guid>
	<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/14cMI3o5Hd8/</link>
	<description>&lt;p&gt;As promised last time, let’s do something more serious today…&lt;/p&gt;
&lt;p&gt;Let &lt;strong&gt;&lt;em&gt;a&lt;/em&gt;&lt;/strong&gt; be any expression.&lt;strong&gt;&lt;strong&gt; We will call &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt; the fixed point of expression &lt;strong&gt;&lt;em&gt;a&lt;/em&gt;&lt;/strong&gt; if &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt; names &lt;strong&gt;&lt;em&gt;ax&lt;/em&gt;&lt;/strong&gt;. &lt;/strong&gt;&lt;/strong&gt;(Reminder: lower-case letters in our programming language represent a combination of upper-case letters.)&lt;/p&gt;
&lt;p&gt;The fixed-point principle says that for each expression &lt;strong&gt;&lt;em&gt;a&lt;/em&gt;&lt;/strong&gt; there exists its fixed point &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt;. Furthermore there is a (quite simple) “manual” for constructing the fixed point &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt; of any expression &lt;strong&gt;&lt;em&gt;a&lt;/em&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So the question of the day is: &lt;span style=&quot;background-color: #ddf;&quot;&gt;can you find that “manual” proving fixed-point principle?&lt;/span&gt;&lt;br /&gt;
(E.g. a program &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt; that names &lt;strong&gt;&lt;em&gt;ABCx&lt;/em&gt;&lt;/strong&gt;, for &lt;strong&gt;&lt;em&gt;a = ABC&lt;/em&gt;&lt;strong&gt;.)&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;

&lt;div class=&quot;easySpoilerWrapper&quot;&gt;
&lt;table align=&quot;center&quot; bgcolor=&quot;FFFFFF&quot; border=&quot;0&quot; class=&quot;easySpoilerTable&quot; style=&quot;text-align: center;&quot;&gt;

&lt;tbody&gt;&lt;tr style=&quot;white-space: normal;&quot;&gt;
&lt;th class=&quot;easySpoilerTitleA&quot; style=&quot;white-space: normal; font-weight: normal; text-align: left; vertical-align: middle; font-size: 120%; color: #000000;&quot;&gt;To see the correct solution, click 'Show' button...&lt;/th&gt;
&lt;th class=&quot;easySpoilerTitleB&quot; style=&quot;text-align: right; vertical-align: middle; font-size: 100%; white-space: nowrap;&quot;&gt;&lt;a align=&quot;right&quot; class=&quot;easySpoilerButtonOther&quot; href=&quot;http://feeds.feedburner.com/justdiscourse/browsing&quot; style=&quot;font-size: 100%; color: #000000; background-color: #fcfcfc; background-image: none; border-style: solid; border-color: #cccccc; margin: 3px 0px 3px; padding: 4px;&quot;&gt;Select&lt;/a&gt;&lt;a align=&quot;right&quot; class=&quot;easySpoilerButton&quot; href=&quot;http://feeds.feedburner.com/justdiscourse/browsing&quot; id=&quot;spoilerDiv6698001_action&quot; style=&quot;font-size: 100%; color: #000000; background-color: #fcfcfc; background-image: none; border-style: solid; border-color: #cccccc; margin: 3px 0px 3px 5px; padding: 4px;&quot; value=&quot;Show&quot;&gt;Show&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;easySpoilerRow&quot; colspan=&quot;2&quot;&gt;&lt;div class=&quot;easySpoilerSpoils&quot; id=&quot;spoilerDiv6698001&quot; style=&quot;display: none; white-space: wrap; overflow: auto; vertical-align: middle;&quot;&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Answer: &lt;span style=&quot;background-color: #ddf;&quot;&gt;&lt;strong&gt;&lt;em&gt;x = RQaRQ&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Why? Because that names &lt;strong&gt;&lt;em&gt;aRQaRQ&lt;/em&gt;&lt;/strong&gt;, which is &lt;strong&gt;&lt;em&gt;ax&lt;/em&gt;&lt;/strong&gt;, which is exactly what we wanted &lt;img alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; src=&quot;http://www.salsitasoft.com/wp-includes/images/smilies/icon_smile.gif&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;easySpoilerConclude&quot;&gt;&lt;table align=&quot;center&quot; bgcolor=&quot;FFFFFF&quot; border=&quot;0&quot; class=&quot;easySpoilerTable&quot; frame=&quot;box&quot; style=&quot;text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=&quot;easySpoilerEnd&quot; style=&quot;width: 100%;&quot;&gt;&lt;/th&gt;&lt;td class=&quot;easySpoilerEnd&quot; colspan=&quot;2&quot; style=&quot;white-space: nowrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;easySpoilerGroupWrapperLastRow&quot; colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The post &lt;a href=&quot;http://www.salsitasoft.com/2013/05/09/programming-brain-teaser-6-fixed-point-principle/&quot;&gt;Programming Brain Teaser #6: Fixed-point principle&lt;/a&gt; appeared first on &lt;a href=&quot;http://www.salsitasoft.com&quot;&gt;Salsita Software&lt;/a&gt;.&lt;/p&gt;&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/14cMI3o5Hd8&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 09 May 2013 08:00:49 +0000</pubDate>
	<dc:creator>Roman Kaspar</dc:creator>
</item>
<item>
	<title>Byron Jones: happy bmo push day!</title>
	<guid isPermaLink="false">http://globau.wordpress.com/?p=394</guid>
	<link>http://globau.wordpress.com/2013/05/09/happy-bmo-push-day-44/</link>
	<description>&lt;p&gt;the following changes have been pushed to bugzilla.mozilla.org:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=869025&quot; target=&quot;_blank&quot;&gt;869025&lt;/a&gt;] create a report to sanity check product’s default security group&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=869220&quot; target=&quot;_blank&quot;&gt;869220&lt;/a&gt;] SecureMail message when no key is set doesn’t seem to be grammatically correct.&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=869261&quot; target=&quot;_blank&quot;&gt;869261&lt;/a&gt;] In the bug entry form the default security group should be displayed to let user know which group will be set&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=863686&quot; target=&quot;_blank&quot;&gt;863686&lt;/a&gt;] “Congratulations” email received for first approval+ instead of first review+&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=652334&quot; target=&quot;_blank&quot;&gt;652334&lt;/a&gt;] splinter doesn’t support hg/git ‘rename’ or ‘copy’&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=695662&quot; target=&quot;_blank&quot;&gt;695662&lt;/a&gt;] splinter doesn’t support bzr rename&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=709897&quot; target=&quot;_blank&quot;&gt;709897&lt;/a&gt;] splinter doesn’t like hg diffs where a file was copied and then modified&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=685645&quot; target=&quot;_blank&quot;&gt;685645&lt;/a&gt;] make it clearer in splinter that a hunk’s section/function header is not a removal&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=870109&quot; target=&quot;_blank&quot;&gt;870109&lt;/a&gt;] Project Kickoff Form: Doesn’t create Security Review bugs&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://globau.wordpress.com/category/mozilla/bmo/&quot;&gt;bmo&lt;/a&gt;, &lt;a href=&quot;http://globau.wordpress.com/category/mozilla/&quot;&gt;mozilla&lt;/a&gt;  &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=globau.wordpress.com&amp;amp;blog=25718030&amp;amp;post=394&amp;amp;subd=globau&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 09 May 2013 07:12:42 +0000</pubDate>
	<dc:creator>glob</dc:creator>
</item>
<item>
	<title>Tantek Çelik: 
Reforming the W3C Advisory Board
</title>
	<guid isPermaLink="true">http://tantek.com/2013/128/b1/reforming-w3c-advisory-board</guid>
	<link>http://tantek.com/2013/128/b1/reforming-w3c-advisory-board</link>
	<description>&lt;div class=&quot;e-content entry-content&quot;&gt;
&lt;p&gt;
I am running for the &lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt; Advisory Board (AB) for one of four open seats on a reform and openness platform. If your company or organization is a &lt;a href=&quot;http://www.w3.org/Consortium/Member/List&quot;&gt;member of the W3C&lt;/a&gt; (World Wide Web Consortium), please ask your &lt;abbr title=&quot;Advisory Committee&quot;&gt;AC&lt;/abbr&gt; Representative &lt;a href=&quot;https://www.w3.org/2002/09/wbs/33280/abelect2013/&quot;&gt;to vote&lt;/a&gt; (W3C member-only link) for myself and &lt;a href=&quot;http://cwilso.com/&quot;&gt;Chris Wilson&lt;/a&gt; in support of more openness and reform.
&lt;/p&gt;&lt;p&gt;
In short, the &lt;a class=&quot;h-card&quot; href=&quot;http://www.w3.org/2002/ab/&quot;&gt;W3C Advisory Board&lt;/a&gt; keeps track of &lt;a href=&quot;https://www.w3.org/Member/Board/track/&quot;&gt;W3C process issues&lt;/a&gt; (W3C member-only link) and &lt;q&gt;... manages the evolution of the [W3C] &lt;a href=&quot;http://www.w3.org/Consortium/Process/organization.html#AB&quot;&gt;Process Document&lt;/a&gt;.&lt;/q&gt; It also advises the W3C Team on topics like licensing.
&lt;/p&gt;&lt;p&gt;
I have participated in a couple of Advisory Board meetings by invitation in the past. I was asked to contribute experience and opinions related to more rapid and more open standards development practices. Though cautiously optimistic at the time, I have to admit that I have not seen as much progress as I'd hoped or expected. &lt;a href=&quot;http://tantek.com/2011/240/b1/w3c-community-groups-opportunities-suggestions-challenges&quot;&gt;Community Groups&lt;/a&gt; with a more open license are nice but insufficient exception. The recently revised HTML Working Group Charter is another (more on that below).
&lt;/p&gt;&lt;p&gt;
So with that experience, why am I running? Two big reasons. 
&lt;/p&gt;&lt;p&gt;
First, in the &lt;a href=&quot;http://www.w3.org/News/2013#entry-9677&quot;&gt;recent W3C &lt;abbr title=&quot;Technical Architecture Group&quot;&gt;TAG&lt;/abbr&gt; election&lt;/a&gt;, &lt;em&gt;everyone&lt;/em&gt; who was elected was &lt;a href=&quot;http://marcosc.com/2012/12/w3c-tag-elections/&quot;&gt;from&lt;/a&gt; &lt;a href=&quot;http://yehudakatz.com/2012/12/07/im-running-to-reform-the-w3cs-tag/&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;http://infrequently.org/2012/12/reforming-the-w3c-tag/&quot;&gt;reform&lt;/a&gt; &lt;a href=&quot;http://annevankesteren.nl/2012/12/w3c-tag&quot;&gt;slate&lt;/a&gt;. The remaining unelected &lt;a href=&quot;https://blog.linss.com/2012/12/12/changing-the-tag-an-unexpected-opportunity/&quot;&gt;reformer&lt;/a&gt; was subsequently &lt;a href=&quot;http://lists.w3.org/Archives/Public/www-tag/2013May/0008.html&quot;&gt;appointed&lt;/a&gt;. Politically, it seems the W3C membership and leadership are now more supportive of reform than in the past, top down, starting with the Technical Architecture Group.
&lt;/p&gt;&lt;p&gt;
Second, there are additional reformers running for the AB who are dedicated to process simplification and more openness, in particular, more open licensing:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;h-card&quot;&gt;&lt;a class=&quot;p-name u-url&quot; href=&quot;http://cwilso.com/&quot;&gt;Chris Wilson&lt;/a&gt; (&lt;span class=&quot;p-org&quot;&gt;Google&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt; ... (awaiting confirmation) ... &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If have you have W3C Member Access, you can read &lt;a href=&quot;https://www.w3.org/2013/05/01-ab-nominations&quot;&gt;all nominees' statements&lt;/a&gt;. I'll update this list as I receive public confirmation from fellow reformers.
&lt;/p&gt;&lt;p&gt;
From my experience interacting with the other existing/continuing AB members, I know that some of them do express a desire for simplification and are supportive of more openness, both in process and in the specifications we produce (e.g. with more open licensing).
&lt;/p&gt;&lt;p&gt;
If we are able to elect a set of reformers to the AB, they plus the existing reform-friendly members have a good chance of effecting real change in the AB, and thus potentially the W3C as a whole.
&lt;/p&gt;&lt;p&gt;
My &lt;a href=&quot;https://www.w3.org/2013/05/01-ab-nominations#tc&quot;&gt;official nomination statement&lt;/a&gt; is posted at W3C but as that link is member-only (no reason for it to be in my opinion), I'm republishing it here, openly since I wrote it. Pardon the third person perspective.
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p class=&quot;h-card&quot;&gt;
&lt;span class=&quot;p-name&quot;&gt;Tantek Çelik&lt;/span&gt; is &lt;span class=&quot;p-org h-card&quot;&gt;Mozilla&lt;/span&gt;'s &lt;span class=&quot;p-job-title&quot;&gt;web standards lead&lt;/span&gt; and a 15 year participant in the W3C. Having contributed to working groups such as CSS and HTML, he has helped edit and produce several key Recommendations for the open web platform including: CSS 2.1, Selectors, and CSS3 Color.
&lt;/p&gt;&lt;p&gt;
Tantek's contribution to open web standards began with leading the implementation of the Tasman rendering engine in Microsoft Internet Explorer 5 for Macintosh, a watershed achievement of solid CSS1, HTML4, and PNG 1.0 support in the year 2000.
&lt;/p&gt;&lt;p&gt;
In addition to W3C activities, Tantek participated in the development of vCard4 at &lt;span class=&quot;h-card&quot;&gt;IETF&lt;/span&gt;, contributes to the &lt;span class=&quot;h-card&quot;&gt;WHATWG&lt;/span&gt;, and co-founded the &lt;span class=&quot;h-card&quot;&gt;microformats.org&lt;/span&gt; standards community.
&lt;/p&gt;&lt;p&gt;
As a longstanding champion of pushing for increasing openness in the methods and means of open standards development, he has both helped working groups (like CSS) do so, and has written extensively on the topic, e.g.: &lt;a href=&quot;http://tantek.com/2011/168/b1/practices-good-open-web-standards-development&quot;&gt;http://tantek.com/2011/168/b1/practices-good-open-web-standards-development&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
Tantek hopes to bring his practical experience working with (and helping evolve) a variety of standards organization models and processes to the W3C Advisory Board, to improve and modernize W3C's processes accordingly.
&lt;/p&gt;&lt;p&gt;
Tantek holds B.S. &amp;amp; M.S. degrees in Computer Science from &lt;span class=&quot;h-card&quot;&gt;Stanford University&lt;/span&gt; and shares his thoughts on his personal website: &lt;a href=&quot;http://tantek.com/&quot;&gt;http://tantek.com/&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
There are two big changes in particular that I'd like to help make happen:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;More open licensing.&lt;/strong&gt; W3C Community Groups are allowed to publish with an open license (though a bespoke one W3C came up with). Official W3C Working Groups are not. My goal here is to have W3C adopt a standard open license (e.g. CC0 or CC-BY) for all specifications moving forward. Other modern standards organizations and communities like the WHATWG and microformats.org have already done so (with CC0) to great benefit (and no apparent downside). Just &lt;a href=&quot;http://www.w3.org/QA/2013/05/proposed_permissive_copyright.html&quot;&gt;last week&lt;/a&gt; a new HTML Working Group charter was proposed that allows for the &lt;a href=&quot;http://www.w3.org/html/wg/charter/2013/#documentlicense&quot;&gt;possibility of publishing HTML Extension Specifications with CC-BY&lt;/a&gt;. This is an excellent first step. W3C as a whole can benefit from more open licensing.
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More open process.&lt;/strong&gt; 15 years ago the CSS Working Group conducted the vast majority of its technical discussions behind closed doors, member-only mailing lists. Today the opposite is true, CSS is developed in the open, on open IRC channel, open wiki, and open email lists. I believe we can and should do the same for the process of running the W3C itself. Transparency in how we create standards is an end in its own right and the more we practice it, the more confidence, support, and trust we can build in a broader community of the work that we do.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you work for &lt;a href=&quot;http://www.w3.org/Consortium/Member/List&quot;&gt;a member of the W3C&lt;/a&gt;, please consider asking your &lt;a href=&quot;https://www.w3.org/Member/ACList&quot;&gt;AC Representative&lt;/a&gt; (W3C member-only link) to vote for myself and Chris Wilson &lt;a href=&quot;https://www.w3.org/2002/09/wbs/33280/abelect2013/&quot;&gt;for the W3C Advisory Board&lt;/a&gt; (W3C member-only link). I'll update the list of reform candidates as I receive confirmation of their public positions, and link to their blog posts accordingly. Thanks for your consideration.
&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 09 May 2013 01:32:00 +0000</pubDate>
</item>
<item>
	<title>Justin Lebar: MemShrink process, weeks 97-98</title>
	<guid isPermaLink="false">urn:uuid:4a38ae2e-b840-11e2-a458-782bcb9cb190</guid>
	<link>http://jlebar.com/2013/5/8/MemShrink_process%2C_weeks_97-98.html</link>
	<description>&lt;p&gt;&lt;em&gt;Nicholas Nethercote is on vacation, so this fortnight's MemShrink report is a
guest post written by &lt;a href=&quot;https://twitter.com/amccreight&quot;&gt;Andrew McCreight&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;Images&lt;/h4&gt;

&lt;p&gt;Joe Drew made it so that on B2G &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862970&quot;&gt;images being displayed on the active page aren't locked&lt;/a&gt;, allowing them to be discarded when there is memory pressure.  This is important to display image-heavy pages like Pinterest on B2G without OOM crashes.&lt;/p&gt;

&lt;p&gt;Andreas Gal &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=865929&quot;&gt;added a preference to control the size of the canvas image cache&lt;/a&gt;.  The use of canvas with large images was causing OOM crashes for the B2G Gallery app. The limit is set to 10mb for B2G, and remains unlimited on desktop.&lt;/p&gt;

&lt;h4&gt;Leak fixes&lt;/h4&gt;

&lt;p&gt;Scoobidiver noticed a &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=866526&quot;&gt;large increase in empty crashes on Firefox 23&lt;/a&gt;.  Previously, these have been identified as being caused by leaks of virtual address space.  Scoobidiver and Benjamin Smedberg investigated, found a possible culprit, and saw that the number of empty crashes went down to its previous level, or even lower, after some followup work for that bug was landed.&lt;/p&gt;

&lt;p&gt;Timothy Nikkel &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=864448&quot;&gt;fixed a leak&lt;/a&gt; caused by some recent changes to reflow-on-zoom.&lt;/p&gt;

&lt;p&gt;Justin Lebar investigated a &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=861492&quot;&gt;leak involving long-running automated testing on B2G&lt;/a&gt; and determined that it was the &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=856080&quot;&gt;same layers leak previously found and fixed&lt;/a&gt;, but not backported to B2G18, by new contributor Christophe Mourand.&lt;/p&gt;

&lt;p&gt;Randell Jesup fixed a &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=862302&quot;&gt;WebRTC leak&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Miscellaneous&lt;/h4&gt;

&lt;p&gt;Brian Hackett &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=804676&quot;&gt;reduced the memory usage of IonMonkey compilation&lt;/a&gt;, which should help on things like JS games that intensively run a lot of JS.&lt;/p&gt;

&lt;p&gt;Nicholas Nethercote wrote a patch to &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=831588&quot;&gt;change how decommitted GC arenas are shown in about:memory&lt;/a&gt;.  Decommitted arenas don't actually use physical memory, so they need to be accounted for differently.&lt;/p&gt;

&lt;p&gt;Boris Zbarsky &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=799816&quot;&gt;reduced the memory usage of CSS&lt;/a&gt; in certain cases.&lt;/p&gt;</description>
	<pubDate>Thu, 09 May 2013 00:45:00 +0000</pubDate>
</item>
<item>
	<title>Geoffrey MacDougall: Rethinking Small Dollar Fundraising</title>
	<guid isPermaLink="false">http://intangible.ca/?p=472</guid>
	<link>http://intangible.ca/2013/05/08/rethinking-small-dollar-fundraising/</link>
	<description>&lt;p&gt;&lt;b&gt;Money-making&lt;/b&gt;&lt;br /&gt;
As a non-profit, Mozilla has access to four types of revenue: &lt;a href=&quot;http://intangible.ca/2012/08/10/grants-gifts-donations/&quot; title=&quot;Grants, Gifts &amp;amp; Donations&quot;&gt;grants, gifts, donations, and earned income&lt;/a&gt;. Our earned income streams come through Firefox, which leaves the other three – grants, gifts, and donations – to be driven by our fundraising strategy (the focus of this post).&lt;/p&gt;
&lt;p&gt;So far, and while we can always get better, we’re pretty good at securing grants. We’ve built meaningful working relationships with large philanthropies and government agencies, which contribute approximately $5M each year to &lt;a href=&quot;http://webmaker.org&quot;&gt;Webmaker&lt;/a&gt;, &lt;a href=&quot;http://openbadges.org&quot;&gt;Open Badges&lt;/a&gt;, and our policy work.&lt;/p&gt;
&lt;p&gt;We don’t have a major gifts program (as yet; more on this later in the year).&lt;/p&gt;
&lt;p&gt;And, while we’ve spent a fair amount of time building a small dollar donations program, it’s definitely not what it could be. Last year, we generated around $750K from e-mails to more than 500K people and an end-of-year presence in the main Firefox channels.&lt;/p&gt;
&lt;p&gt;There are many and valid reasons for this result. Fundraising as a large-scale social enterprise is challenging and I believe we’ve done well to get where we are. But given our reach and the importance of the Web there is massive room for improvement.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;NOW: &lt;a href=&quot;https://sendto.mozilla.org/page/s/donations-survey-for-mozillians&quot;&gt;Help us get better at fundraising.&lt;/a&gt; &lt;/strong&gt;Tell us what you think about Mozilla, our mission, and our fundraising.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;b&gt;Solving Small Dollar Fundraising&lt;/b&gt;&lt;br /&gt;
Building an effective small dollar program is important for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s the most stable form of revenue available to the Foundation: small amounts of funding from a large and diverse group of donors;&lt;/li&gt;
&lt;li&gt;It mitigates risk by distributing external dependence and increasing revenue diversity; and&lt;/li&gt;
&lt;li&gt;It’s a meaningful contribution path for a large number of Mozillians who don’t have the time or capacity to code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grants and (eventually) gifts will always be crucial to the health and growth of Mozilla. They allow us to work with amazing partners, test new ideas, and launch new products. But building a sustainable small dollar program is our top development priority for 2013.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Enter the Study&lt;/b&gt;&lt;br /&gt;
Good fundraising – like many things – involves constantly questioning and challenging assumptions. We’ve used the first part of year to hold conversations to gain perspective and input from the Mozilla community: people who care about our mission and want to help it succeed.&lt;/p&gt;
&lt;p&gt;We’ve asked what people think about Mozilla. Why they have chosen to become involved. Whether they think being a non-profit is central to what we do. Whether fundraising should be a part of that. And, if yes, how we can make it more effective. (&lt;a href=&quot;https://sendto.mozilla.org/page/s/donations-survey-for-mozillians&quot;&gt;Get involved and be heard.&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The Story So Far&lt;/b&gt;&lt;br /&gt;
The discussions have been amazing. We’re learning a lot about Mozilla and why our community and staff devote their time to the cause. And we’re also seeing themes emerge around how people view Mozilla, our mission, and our fundraising:&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Being a non-profit matters.&lt;/i&gt; It’s the foundation of our brand, what differentiates our products in the market, and the source of a lot of pride. Not having external shareholders is empowering. But people resist being identified as a charity. The sense is that ‘charity’ carries connotations of need and behaviours that don’t apply to Mozilla.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Tension between being ‘mission-driven’ and ‘product-driven’&lt;/i&gt;. There’s a healthy, though challenging, day-to-day tension between the ‘why’ of our work, the mission, and the ‘what’, shipping products. That tension is surfacing more as we enter new markets with different operating cultures. And in terms of fundraising, the tension impacts decisions like whether to direct site traffic to fundraising or product marketing campaigns.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Fundraising has been a black box.&lt;/i&gt; Very little is understood about how or why we raise money. Most of the participants in the study wanted to learn more: to have a chance to engage and help shape our fundraising. So we, as the development team, need to get better at sharing our work. (This post you’re reading and &lt;a href=&quot;http://intangible.ca/2012/07/06/how-were-going-to-fundraise/&quot; title=&quot;The Revenue is the Model&quot;&gt;this post&lt;/a&gt; and &lt;a href=&quot;http://engagingopenly.wordpress.com/&quot;&gt;these posts&lt;/a&gt; and &lt;a href=&quot;http://mzl.la/fundraising&quot;&gt;this dashboard&lt;/a&gt; are our first attempts to fix this.)&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Donating is considered a more accessible contribution path than coding.&lt;/i&gt; Mozilla’s competitive advantage is and has always been its community. We don’t have the financial strength or employee base to go head-to-head with our competitors. When we win, it’s because of the people who contribute to our work. As our mission gains importance – as more things move to the Web – we will need to attract contributors from outside our usual channels. People who don’t code, but have other sources of expertise that can advance the mission (see the groundswell of educators gathering around Webmaker). Donating is seen as an easy yet meaningful way to become a Mozillian.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Online fundraising isn’t the only way to raise money.&lt;/i&gt; To date, small dollar fundraising and online fundraising have been synonymous. But as we &lt;a href=&quot;https://commonspace.wordpress.com/2013/05/07/sparkamovement/&quot;&gt;scale Webmaker events around the world&lt;/a&gt;, as we get more people into more rooms, and as &lt;a href=&quot;https://reps.mozilla.org/&quot;&gt;ReMo&lt;/a&gt; continues to grow and kick ass, we increasingly have opportunities to raise money in-person. We need to &lt;a href=&quot;https://www.youtube.com/watch?feature=player_detailpage&amp;amp;v=m83JcNoNQ-4#t=140s&quot;&gt;look away from the Lost Ark&lt;/a&gt; of online fundraising to new ways to engage directly with donors.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Donors want to know where their money goes.&lt;/i&gt; In line with trends across the non-profit sector, people want to understand the specific impact of their donations. Crowdfunding, social media, and micro-lending platforms have led donors to expect a direct relationship with the recipients of their support. We can do more to draw the line between a $30 donation and a scientist, teacher, or teenager learning how to express themselves on the Web. (We also need to get our act together around an annual donor report, most likely as a fork of the yearly &lt;a href=&quot;http://www.mozilla.org/en-US/foundation/annualreport/2011/&quot;&gt;State of Mozilla&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;i&gt;We should be good at being a non-profit.&lt;/i&gt; One of the most interesting themes was the sense that if we’re going to be a non-profit, we should be good at it. That we should leverage all the advantages – volunteers, movement building, partnerships, activism, fundraising, etc. – that come along with it. Not at the expense of our strength – building meaningful products – but as a way of pursuing our mission and expressing our brand.&lt;/p&gt;
&lt;p&gt;The study is also surfacing a healthy amount of skepticism:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Why do we need my $30 when we have all the Google revenue?”&lt;/li&gt;
&lt;li&gt;“I delete all those e-mails. I don’t think they’re effective.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Confusion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Doesn’t everyone get paid from the Google deal?”&lt;/li&gt;
&lt;li&gt;“Why do we even have a Foundation?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And resistance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“We shouldn’t be asking people for money. It’s annoying and unnecessary.”&lt;/li&gt;
&lt;li&gt;“We need people closing bugs, not giving money.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perhaps the best finding so far is that many of people who work for Mozilla also donate to the mission. This means that the people who experience Mozilla on a daily basis continue to believe in the organization and its work. As a fundraiser, I know that one of the first things major donors ask is what percentage of employees also donate to the mission. So we’re in good shape.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What Next?&lt;/b&gt;&lt;br /&gt;
We want to talk to more people. But as we can’t take everyone to lunch (sadly!), we’ve put together a survey. &lt;strong&gt;&lt;a href=&quot;https://sendto.mozilla.org/page/s/donations-survey-for-mozillians&quot;&gt;Please take 5 minutes and let us know what you think about Mozilla, our mission, and our fundraising&lt;/a&gt;.&lt;/strong&gt; This is your chance to help us rock. We hope you’ll participate.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What Will Happen From There&lt;/b&gt;&lt;br /&gt;
In early June, we will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Post the final results and analysis of the study;&lt;/li&gt;
&lt;li&gt;Use the results to shape a new fundraising strategy; and&lt;/li&gt;
&lt;li&gt;Work to engage every Mozillian – including you – in what we hope will be our most effective end-of-year campaign ever.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So far we’re thrilled at the number of people who actually want to step up and help Mozilla raise money. The challenge is on us, as a team, to make sure you can and to do so with pride.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://intangible.ca/category/mozilla/&quot;&gt;Mozilla&lt;/a&gt;, &lt;a href=&quot;http://intangible.ca/category/pitch-geek/&quot;&gt;Pitch Geek&lt;/a&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/intangibleblog.wordpress.com/472/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/intangibleblog.wordpress.com/472/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=intangible.ca&amp;amp;blog=19046484&amp;amp;post=472&amp;amp;subd=intangibleblog&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 08 May 2013 18:42:05 +0000</pubDate>
	<dc:creator>Geoffrey</dc:creator>
</item>

</channel>
</rss>
