Dirkjan Ochtman - mozilla/writing/2014-08-30T00:00:00+02:00writingMy first FOSDEM2014-08-30T00:00:00+02:002014-08-30T00:00:00+02:00Dirkjan Ochtmantag:None,2014-08-30:/writing/2014/08/30/my-first-fosdem.html<p>This year,
I attended the <a class="reference external" href="https://fosdem.org/">Free Open Source Developers European Meeting</a> for the first time.
For those who don't know,
FOSDEM is a big event (5000 people) held every year in Brussels,
organized by the community and free to come to
(you don't even need to register!).
Mozilla happily sponsored …</p><p>This year,
I attended the <a class="reference external" href="https://fosdem.org/">Free Open Source Developers European Meeting</a> for the first time.
For those who don't know,
FOSDEM is a big event (5000 people) held every year in Brussels,
organized by the community and free to come to
(you don't even need to register!).
Mozilla happily sponsored my travel and hotel for the 2014 edition,
so I wanted to write a few things about my experience.
Unfortunately, that took some time;
planning for next year has already started!</p>
<p>The <a class="reference external" href="https://archive.fosdem.org/2014/schedule/">schedule</a> was very diverse,
and had lots of stuff I found interesting.
On Saturday, I mostly hung around the Mozilla devroom,
where I was assigned to help out with speaker assistance.
It turned out that the extra effort for that wasn't needed most of the time,
although I helped out a few times guarding the doors at the start of
particularly popular talks
(mostly the JavaScript ones).
In between, I got to focus on the talks,
some of which I really liked.</p>
<img alt="A moderately full Mozilla devroom" src="/writing/files/full-devroom.jpg" style="width: 600px; height: 450px;" />
<p>The <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/state_of_firefox_for_android/">talk on Firefox for Android</a> provided some nice background about what the Fennec
team had been up to, presented in an engaging way.
The <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/persona/">talk on Persona</a> got quite a bit of interest,
though I thought the speaker wasn't great.
I helped answering some questions on Persona,
and engaged with some of the more interested people after the talk,
which was nice.
<a class="reference external" href="https://github.com/servo/servo/">Servo</a> is Mozilla's research browser engine,
and it's actually being written in <a class="reference external" href="http://www.rust-lang.org/">Rust</a>,
a very interesting systems language being developed in tandem with Servo.
The <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/servo_building_a_parallel_web_browser/">talk about it</a> was one of the most interesting ones to me,
even though I'd heard some of the content before at the Mozilla Summit.
The Q&A after the talk was also quite interesting,
continuing with a small circle of people outside the room for quite a bit.</p>
<img alt="Josh Matthews telling us about Servo" src="/writing/files/josh-rust.jpg" style="width: 600px; height: 450px;" />
<p>At the end of the day,
I went to the <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/mailpile/">alpha announcement</a> for <a class="reference external" href="https://www.mailpile.is/">Mailpile</a>,
which I'd previously seen mentioned on Hacker News.
I thought the presentation was great,
and the room felt very enthusiastic to me.
I even cloned the Mailpile repo during the talk to see if I could get it running;
unfortunately there were some issues getting a profile set up.
I later tried the second alpha,
which exhibited similar failures in the setup processes,
so it's been a little disappointing so far.
However, I filed an <a class="reference external" href="https://github.com/pagekite/Mailpile/issues/756">issue</a> and hope things will be better in the beta.</p>
<p>After that, I attended a Gentoo BoF.
I've been a Gentoo developer for a few years,
but hadn't really met anyone in person before.
Since most of my fellow Gentoo devs already know each other
or had been hanging around the Distributions devroom all day,
it was a bit weird to get in at the end of the day.
Fortunately there was a nice round of introductions,
so at least I have met some people now.
On the other hand, I had to skip the Gentoo dinner for a Mozilla party.</p>
<p>The party was great, of course;
it's always nice to get to know Mozillians.
Afterwards, four of us went to get a beer on the way back to the hotel,
where we had some good discussions about Mozilla's strategy and future.
In the end, I always like these conversations in a smaller group the best.</p>
<p>On Sunday, there was no longer any room available to Mozilla
and the booth we had was already pretty well-staffed,
so I felt free to visit some other talks I wanted to see.
I started off early trying to get into the clang talk in the LLVM devroom,
but couldn't get in, even at 9 AM!
Many of the devroom were full for most of Sunday,
which was a pity.
On the other hand,
being at the door of the Go devroom really early got me a nice seat
for the <a class="reference external" href="https://camlistore.org/">Camlistore</a> <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/camlistore/">talk</a> by Brad Fitzpatrick.
Camlistore is an impressive project,
and I actually tried to get it running the same day,
but the lack of end-user documentation makes it hard to get started
(and I'm not a fan of Go) or how to use it fruitfully.</p>
<p>Early in the afternoon we had a small CouchDB community meetup.
Benoit Chesneau and I and a few CouchDB fans got together
to discuss some things that were going on.
I particularly liked talking to our users to hear what problems they were
trying to solve with CouchDB.
After this I went to the big keysigning session and exchanged
verifications with some 80 other hackers,
so that my GPG key should be pretty well-connected by now
(at least in the FOSS ecosystem).</p>
<p>The final talks I saw were the Python <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/integrating_python_and_c_using_cffi/">CFFI talk</a>,
which was nice but not that interesting
since I already had some experience thanks to <a class="reference external" href="https://github.com/nanomsg/nnpy">nnpy</a>
(a <a class="reference external" href="http://nanomsg.org/">nanomsg</a> binding),
and the <a class="reference external" href="https://archive.fosdem.org/2014/schedule/event/nsa_operation_orchestra/">satirical NSA keynote</a> from <a class="reference external" href="http://people.freebsd.org/~phk/">phk</a>, which was fun.</p>
<p>In the end,
I had a really good time at FOSDEM.
It's a very large event,
so I was happy to be able to hang out with the great Mozillians
in the devroom and near the booth.
Thanks to the Reps program for sponsoring my going there!</p>
No Close Buttons2014-04-29T00:00:00+02:002014-04-29T00:00:00+02:00Dirkjan Ochtmantag:None,2014-04-29:/writing/2014/04/29/no-close-buttons.html<p>Or, <cite>How To Turn Your Firefox userChrome.css Hack Into a Neat Little
Restart-Less Add-on, in Five Delightfully Simple Steps</cite>.</p>
<p>For as long as I can remember,
I've had a small number of tweaks set in my Firefox profile's <tt class="docutils literal">about:config</tt>.
One of these was the <tt class="docutils literal">browser.tabs.closeButtons</tt> pref …</p><p>Or, <cite>How To Turn Your Firefox userChrome.css Hack Into a Neat Little
Restart-Less Add-on, in Five Delightfully Simple Steps</cite>.</p>
<p>For as long as I can remember,
I've had a small number of tweaks set in my Firefox profile's <tt class="docutils literal">about:config</tt>.
One of these was the <tt class="docutils literal">browser.tabs.closeButtons</tt> pref,
which I had set to 2.
By default,
Firefox shows a little close button on the right of every tab,
but since I pretty much always use a keyboard shortcut to close tabs,
these little buttons aren't that helpful,
and they end up obscuring parts of their tab's titles.
Setting the value to 2 removes all of the buttons.</p>
<p>In Firefox 31 (to be released to the general public in about 12 weeks),
this preference <a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=865826">has been removed</a>,
leading me to look into other ways of removing the buttons.
A commenter on the bug <a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=865826#c31">noted</a> the CSS required to remove the buttons again,
saying that this could be added to the userChrome.css file in a profile.
However, I don't really like that solution,
since it would require me to port the fix to every computer I use,
and it would be easy for me to lose it.
Instead, I wanted to put it in an add-on,
which would make it easy for me to install on other computers,
in addition to being relatively easy to find.
As an added benefit, others can benefit from the same add-on.</p>
<p>The result of this is the <a class="reference external" href="https://addons.mozilla.org/en-US/firefox/addon/no-close-buttons/">No Close Buttons</a> add-on,
which I put up on AMO yesterday.
It was promptly reviewed by a friendly reviewer from the Dutch community,
so that it can be installed without trouble.
However, it's currently restricted to Firefox 31 and later,
since I figured people on earlier versions wouldn't need it.
Because it took me a while to piece together everything
for what I thought should be a well-documented process
(turning simple chrome CSS hacks into an add-on),
I figured I'd document the process here.</p>
<p>First off, create a file called <tt class="docutils literal">install.rdf</tt>:</p>
<pre class="code xml literal-block">
<span class="cp"><?xml version="1.0" encoding="utf-8"?></span><span class="w">
</span><span class="cm"><!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --></span><span class="w">
</span><span class="nt"><RDF</span><span class="w"> </span><span class="na">xmlns=</span><span class="s">"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</span><span class="w"> </span><span class="na">xmlns:em=</span><span class="s">"http://www.mozilla.org/2004/em-rdf#"</span><span class="nt">></span><span class="w">
</span><span class="nt"><Description</span><span class="w"> </span><span class="na">about=</span><span class="s">"urn:mozilla:install-manifest"</span><span class="nt">></span><span class="w">
</span><span class="nt"><em:id></span>no-close-buttons@xavamedia.nl<span class="nt"></em:id></span><span class="w">
</span><span class="nt"><em:version></span>0.1<span class="nt"></em:version></span><span class="w">
</span><span class="nt"><em:type></span>2<span class="nt"></em:type></span><span class="w">
</span><span class="nt"><em:bootstrap></span>true<span class="nt"></em:bootstrap></span><span class="w">
</span><span class="nt"><em:unpack></span>false<span class="nt"></em:unpack></span><span class="w">
</span><span class="cm"><!-- Firefox --></span><span class="w">
</span><span class="nt"><em:targetApplication></span><span class="w">
</span><span class="nt"><Description></span><span class="w">
</span><span class="nt"><em:id></span>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}<span class="nt"></em:id></span><span class="w">
</span><span class="nt"><em:minVersion></span>31.0a1<span class="nt"></em:minVersion></span><span class="w">
</span><span class="nt"><em:maxVersion></span>31.0<span class="nt"></em:maxVersion></span><span class="w">
</span><span class="nt"></Description></span><span class="w">
</span><span class="nt"></em:targetApplication></span><span class="w">
</span><span class="cm"><!-- Front End MetaData --></span><span class="w">
</span><span class="nt"><em:name></span>No<span class="w"> </span>Close<span class="w"> </span>Buttons<span class="nt"></em:name></span><span class="w">
</span><span class="nt"><em:description></span>Remove<span class="w"> </span>close<span class="w"> </span>buttons<span class="w"> </span>from<span class="w"> </span>tabs<span class="nt"></em:description></span><span class="w">
</span><span class="nt"><em:creator></span>Dirkjan<span class="w"> </span>Ochtman<span class="nt"></em:creator></span><span class="w">
</span><span class="nt"></Description></span><span class="w">
</span><span class="nt"></RDF></span>
</pre>
<p>Second, add a file named <tt class="docutils literal">chrome.manifest</tt>, with a single line:</p>
<pre class="code literal-block">
content no-close-buttons content/
</pre>
<p>Third, add some JavaScript code to register and unregister the stylesheet to
a file named <tt class="docutils literal">bootstrap.js</tt>:</p>
<pre class="code javascript literal-block">
<span class="cm">/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */</span><span class="w">
</span><span class="s1">'use strict'</span><span class="p">;</span><span class="w">
</span><span class="kd">var</span><span class="w"> </span><span class="nx">sss</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">Components</span><span class="p">.</span><span class="nx">classes</span><span class="p">[</span><span class="s2">"@mozilla.org/content/style-sheet-service;1"</span><span class="p">].</span><span class="nx">getService</span><span class="p">(</span><span class="nx">Components</span><span class="p">.</span><span class="nx">interfaces</span><span class="p">.</span><span class="nx">nsIStyleSheetService</span><span class="p">);</span><span class="w">
</span><span class="kd">var</span><span class="w"> </span><span class="nx">ios</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">Components</span><span class="p">.</span><span class="nx">classes</span><span class="p">[</span><span class="s2">"@mozilla.org/network/io-service;1"</span><span class="p">].</span><span class="nx">getService</span><span class="p">(</span><span class="nx">Components</span><span class="p">.</span><span class="nx">interfaces</span><span class="p">.</span><span class="nx">nsIIOService</span><span class="p">);</span><span class="w">
</span><span class="kd">var</span><span class="w"> </span><span class="nx">uri</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ios</span><span class="p">.</span><span class="nx">newURI</span><span class="p">(</span><span class="s1">'chrome://no-close-buttons/content/style.css'</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span><span class="w">
</span><span class="kd">function</span><span class="w"> </span><span class="nx">startup</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span><span class="w"> </span><span class="nx">reason</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nx">sss</span><span class="p">.</span><span class="nx">loadAndRegisterSheet</span><span class="p">(</span><span class="nx">uri</span><span class="p">,</span><span class="w"> </span><span class="nx">sss</span><span class="p">.</span><span class="nx">USER_SHEET</span><span class="p">);</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="kd">function</span><span class="w"> </span><span class="nx">shutdown</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span><span class="w"> </span><span class="nx">reason</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nx">sss</span><span class="p">.</span><span class="nx">unregisterSheet</span><span class="p">(</span><span class="nx">uri</span><span class="p">,</span><span class="w"> </span><span class="nx">sss</span><span class="p">.</span><span class="nx">USER_SHEET</span><span class="p">);</span><span class="w">
</span><span class="p">}</span>
</pre>
<p>Fourth, add your CSS, to the file named in your <tt class="docutils literal">bootstrap.js</tt>.
It should go inside the <tt class="docutils literal">content</tt> directory
you've already referenced in the manifest.</p>
<pre class="code css literal-block">
<span class="p">.</span><span class="nc">tab-close-button</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">display</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="w"> </span><span class="cp">!important</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
</pre>
<p>Fifth, and finally, if you zip up the four resulting items
(<tt class="docutils literal">install.rdf</tt>, <tt class="docutils literal">chrome.manifest</tt>, <tt class="docutils literal">bootstrap.js</tt>
and the <tt class="docutils literal">content</tt> directory),
rename the resulting file so that its extension is <tt class="docutils literal">xpi</tt>,
and drop it into the <tt class="docutils literal">extensions</tt> directory in your Firefox profile,
Firefox should prompt you to install your new add-on!</p>
<p>I cobbled together all these bits and pieces by looking at a small
add-on by <a class="reference external" href="https://addons.mozilla.org/en-US/firefox/user/bsmedberg/">Benjamin Smedberg</a>
(who has a number of UI-related add-ons up on AMO),
some code from <a class="reference external" href="http://stackoverflow.com/questions/2685243/inserting-css-with-a-firefox-extension">Stack Overflow</a>,
and MDN pages on <a class="reference external" href="https://developer.mozilla.org/en-US/Add-ons/Bootstrapped_extensions">bootstrapped add-ons</a> and <a class="reference external" href="https://developer.mozilla.org/en/docs/Chrome_Registration">chrome registration</a>.
I put the result up <a class="reference external" href="https://github.com/djc/no-close-buttons">on GitHub</a>, any feedback is most welcome.</p>
Are We Meeting Yet?2013-08-26T00:00:00+02:002013-08-26T00:00:00+02:00Dirkjan Ochtmantag:None,2013-08-26:/writing/2013/08/26/are-we-meeting-yet.html<p>For a few months now, I've worked on a little single-file web thingy: Are We
Meeting Yet? (AWMY for short). Here are two example URLs:</p>
<ul class="simple">
<li>a <a class="reference external" href="http://arewemeetingyet.com/Los%20Angeles/Tue/10:00/w/Firefox%20development%20meeting">Firefox meeting</a></li>
<li>a <a class="reference external" href="http://arewemeetingyet.com/UTC/2013-05-22/19:00/w/CouchDB%20IRC%20Meeting">CouchDB Meeting</a></li>
</ul>
<p>Gervase Markham kindly <a class="reference external" href="http://blog.gerv.net/2013/08/are-we-meeting-yet/">wrote about it</a> on his blog after I recommended it for
a Firefox development meeting, which …</p><p>For a few months now, I've worked on a little single-file web thingy: Are We
Meeting Yet? (AWMY for short). Here are two example URLs:</p>
<ul class="simple">
<li>a <a class="reference external" href="http://arewemeetingyet.com/Los%20Angeles/Tue/10:00/w/Firefox%20development%20meeting">Firefox meeting</a></li>
<li>a <a class="reference external" href="http://arewemeetingyet.com/UTC/2013-05-22/19:00/w/CouchDB%20IRC%20Meeting">CouchDB Meeting</a></li>
</ul>
<p>Gervase Markham kindly <a class="reference external" href="http://blog.gerv.net/2013/08/are-we-meeting-yet/">wrote about it</a> on his blog after I recommended it for
a Firefox development meeting, which made me think I should write about it here.</p>
<div class="section" id="what-it-is">
<h2>What it is</h2>
<p>AWMY is a tool to communicate event (meeting) times to geographically
dispersed and therefore timezone-challenged audiences. This means it displays
date/time values in (a) an original timezone, (b) the UTC timezone and (c) the
user's local timezone, with a title or description and a countdown timer.</p>
<p>Critically, it supports recurring meetings in a way that a single URL will
show the next meeting in the series no matter when it's loaded into the
browser. This makes it a good fit for use in automatically generated meeting
announcements. Currently, the only supported repeating modes are weekly
and bi-weekly.</p>
<p>One of the design goals is to have nice-looking URLs; ideally, you can
understand the meeting date/time from the URL even without clicking the link.
For now, hacking the URL is the only way to create a new event page; this
should be easy in most cases. I hope to add a form to make it even easier
sometime soon.</p>
<p>Timezone support is based on the venerable <a class="reference external" href="http://en.wikipedia.org/wiki/Tz_database">Olson timezone database</a>. I've put
some thought into handling events near daylight savings transitions and tried
to put in some warnings, but it's probably not perfect yet. At least weekend
events close to daylight savings transitions should be somewhat rare.</p>
<p>The domain name was chosen because it fits in with a Mozilla meme (e.g.
<a class="reference external" href="http://arewefastyet.com/">fast</a>, <a class="reference external" href="http://areweprettyyet.com/">pretty</a>, <a class="reference external" href="http://arewesmallyet.com/">small</a>, <a class="reference external" href="http://arewepopularyet.com/">popular</a>, <a class="reference external" href="http://areweflashyet.com/">flash</a> and probably others); I
couldn't come up with a better alternative that was also still available. This
one will hopefully be memorable at least for some part of the intended audience.</p>
</div>
<div class="section" id="how-to-use-it">
<h2>How to use it</h2>
<p>In the current iteration, the page accepts a maximum of 5 arguments:</p>
<ul class="simple">
<li>A timezone: a subset of Olson timezones are accepted and can be referenced in
a few different forms. Only the continent timezones are accepted (e.g.
"America/Los_Angeles", "Europe/Amsterdam"), plus the "UTC" timezone. The
continent is optional (and left out in the canonical versions). A space can
be used where underscores are used in timezone names.</li>
<li>A date: an ISO 6801-formatted date, like "2013-08-26". A three-letter weekday
abbreviation also works here (like "Mon"), but it will emit a warning if
used without the weekly repeating mode.</li>
<li>A time: ISO 6801-formatted 24-hour time, like "15:30".</li>
<li>A repeating mode: currently "w" for weekly or "b" for bi-weekly.</li>
<li>A title: any text.</li>
</ul>
<p>If no timezone is provided, it's assumed to be UTC. Some examples:</p>
<ul class="simple">
<li><a class="reference external" href="http://arewemeetingyet.com/2013-08-26/13:00/Test">/2013-08-26/13:00/Test</a></li>
<li><a class="reference external" href="http://arewemeetingyet.com/Amsterdam/2013-08-26/15:00/Test">/Amsterdam/2013-08-26/15:00/Test</a></li>
<li><a class="reference external" href="http://arewemeetingyet.com/America/LosAngeles/2013-08-26/14:00/Test">/America/Los Angeles/2013-08-26/14:00/Test</a></li>
<li><a class="reference external" href="http://arewemeetingyet.com/Mon/17:00/w/Test">/Mon/17:00/w/Test</a></li>
<li><a class="reference external" href="http://arewemeetingyet.com/2013-08-26/12:00/b/Test">/2013-08-26/12:00/b/Test</a></li>
</ul>
</div>
<div class="section" id="why">
<h2>Why</h2>
<p>I got started based on some <a class="reference external" href="http://mozilla.markmail.org/thread/rhn23avtocfhoawk">discussion</a> on the mozilla-governance mailing
list. Most Mozilla meetings are coordinated based on the timezone for the
Mozilla HQ, in California. For many non-US participants, it's easier if
meeting times are communicated in UTC, because they know their own UTC offset.
However, this would change actual local meeting times based on daylight
savings, which is a bit of a pain for recurring meetings. Therefore, it
makes more sense to keep the reference meeting time in a timezone that has
daylight savings, on the premise that most people live in zones that use
mostly similar daylight savings schedules.</p>
<p>Some tools exist: for example, here's a <a class="reference external" href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=Firefox+Development+Meeting&iso=20130820T10&p1=22">timeanddate.com link</a> use for a
Firefox developer meeting. Although timeanddate.com has most of the information
available from AWMY, it's provided in a much more cluttered fashion.
Personally, I find it quite hard to visually parse that page to find the data
I need. Of course, it does provide other useful features that AWMY does not
currently offer.</p>
<p>I've also seen everytimezone.com used for this kind of thing; <a class="reference external" href="http://everytimezone.com/#2013-3-27,480,6be">here</a>'s an
example. It does provide the user with a sense of context, which is probably
useful when you want to see what meeting times make sense in timezones you
care about. For the purpose of communicating a single meeting time, it feels
rather unfocused.</p>
<p>The user experience for these tools doesn't work well for this use case, so I
thought I might be able to do better. On top of that, the other tools don't
appear to handle recurring meetings. Having a stable URL for a series of
events is useful when you want to point to a meeting time from many different
places, but having to update each pointer every week is kind of a drag. Thus
was born AWMY.</p>
</div>
<div class="section" id="future-plans">
<h2>Future plans</h2>
<p>At the top of my to do list is a feature to combine event series. This is
mostly inspired by CouchDB meetings, which take place at alternating 13:00
UTC and 19:00 UTC times to accomodate people in different timezones. My current
implementation strategy is to have a "merge" flag that signals another meeting
series, such that two bi-weekly events series can be joined together.</p>
<p>As mentioned before, friendlier UI to build new events is one of my other
priorities. A few form elements could go a long way, though I probably want a
slightly more polished experience. I'll also have to figure out how to make
dealing with series easy, in particular when working with the merging feature.</p>
<p>It would make sense to add a few other repeating modes, in particular "3rd
Wednesday of each month"-like functionality. Offering ICS downloads would be
nice. I would like each page to show the next meeting instance, if only as an
indication that you're dealing with a recurrent event.</p>
<p>Because there's no server side component, I really want to keep all state in
the URLs. On the other hand, I also want readable URLs. These goals don't
always align well, so balancing them is an interesting act. I'm thinking about
a way to generate alternative URLs that aren't as readable, but significantly
shorter.</p>
</div>
<div class="section" id="wrapping-up">
<h2>Wrapping up</h2>
<p>I hope this will be a useful tool for the open source community (and anybody
else who has a use for it). I'd be interested to hear your thoughts on what
features would be most useful to add. If you want to contribute some code,
that would be even better; check it out via the <a class="reference external" href="https://bitbucket.org/djc/awmy">Bitbucket project</a>.
All feedback is welcome!</p>
</div>
A Persona interview2013-07-26T00:00:00+02:002013-07-26T00:00:00+02:00Dirkjan Ochtmantag:None,2013-07-26:/writing/2013/07/26/persona-interview.html<div class="lead compound">
<p>I have recently been contributing to Mozilla's Persona project, which is an
awesome way to make authentication easier for sites and their users. They
kindly published an <a class="reference external" href="http://identity.mozilla.com/post/56436390648/contributor-spotlight-dirkjan-ochtman">interview with me</a>, which I reproduce here in full
for archival purposes.</p>
</div>
<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Over the past year, Dirkjan Ochtman has been a consistent …</p></div><div class="lead compound">
<p>I have recently been contributing to Mozilla's Persona project, which is an
awesome way to make authentication easier for sites and their users. They
kindly published an <a class="reference external" href="http://identity.mozilla.com/post/56436390648/contributor-spotlight-dirkjan-ochtman">interview with me</a>, which I reproduce here in full
for archival purposes.</p>
</div>
<div class="section" id="introduction">
<h2>Introduction</h2>
<p>Over the past year, Dirkjan Ochtman has been a consistent, constructive voice
in the Persona community. His involvement has helped ensure that we stay true
to Mozilla’s mission of open, transparent, and participatory innovation.</p>
<p>More impressively, Persona’s <a class="reference external" href="http://identity.mozilla.com/post/55796551587/persona-a-login-that-matches-your-site">new backgroundColor feature</a> is the direct
result of Dirkjan’s efforts.</p>
<p>We hope this interview highlights his contributions and inspires others to get
involved.</p>
<p>From the rest of us at Mozilla, thank you.</p>
</div>
<div class="section" id="who-are-you">
<h2>Who are you?</h2>
<p>I’m Dirkjan Ochtman, a 30-year old software developer living in Amsterdam. I
work for a financial startup by day; in my free time, I contribute to a bunch
of open source projects, like Mercurial, Python, Gentoo Linux and Apache
CouchDB. I also started <a class="reference external" href="https://bitbucket.org/djc/">a few things</a> of my own.</p>
</div>
<div class="section" id="have-you-contributed-to-mozilla-projects-in-the-past-how-did-you-get-involved-in-persona">
<h2>Have you contributed to Mozilla projects in the past? How did you get involved in Persona?</h2>
<p>I started using Firefox almost ten years ago, and I’d been watching Mozilla
before that. The Mozilla mission of an open Internet resonates with me, so I
tend to try and find stuff around the edges of the project where I can help.
This year, I also became <a class="reference external" href="https://reps.mozilla.org/">a Mozilla Rep</a>.</p>
<p>I find BrowserID/Persona compelling because I hate having to register on
different sites and make up passwords that fit (often inane) security
requirements. And you just know that many sites store passwords insecurely,
leaking sensitive information when they get hacked. Persona allows me to
authenticate with my email address and a single password; no more guessing
which username I used. I trust Mozilla’s password storage to be much more
secure than the average Internet site, and because Persona is open source, I
can verify that it is.</p>
<p>In addition to setting up Persona sign in on a small community site I run,
I’ve also implemented <a class="reference external" href="https://bitbucket.org/djc/persona-totp">my own Python-based Identity Provider</a>. This means that
when I use Persona, I control my own login experience. My Identity Provider
uses Google Authenticator, so now I don’t have to remember any passwords at
all.</p>
<p>The documentation for building an Identity Provider was scattered and
incomplete, so I helped improve that. From that work, I got to know some of
the great people who work on Identity at Mozilla.</p>
</div>
<div class="section" id="what-have-you-hacked-on-recently">
<h2>What have you hacked on recently?</h2>
<p>There has been a long-standing issue that the Persona dialog contained too
much Mozilla branding and did not sufficiently emphasize the individual
websites that users were signing into. There was an issue about this <a class="reference external" href="https://github.com/mozilla/browserid/issues/3286">on
Github</a>, but I seem to remember complaints on the mailing list from even
longer ago.</p>
<p>Of course, I prefer to use Persona over Facebook Connect or Twitter, so I
decided to see if I could fix some of these issues. Luckily one of the Persona
developers, <a class="reference external" href="https://shanetomlinson.com/">Shane Tomlinson</a>, was available to work on this at roughly the
same time.</p>
<p>To improve the branding balance, we first de-emphasized the Persona branding.
I focused on allowing websites to specify a background color for the Persona
dialog. This is important because it can make the dialog feel much more “at
home" on a site. We had to work out some tricks to ensure that text stayed
readable regardless of the background color specified.</p>
</div>
<div class="section" id="what-was-that-experience-like">
<h2>What was that experience like?</h2>
<p>It was great. I had no previous experience with Node.js, but getting the
application up and running was easy. I got basic backgroundColor support
working in a few hours, but it took a few nights to tweak things and write
tests. Fortunately, Shane is also based in Europe, so we could easily work
together. When Shane showed our work on the mailing list, response from the
other developers was very positive.</p>
<p>It would be really great if this helps drive Persona adoption amongst large
websites.</p>
</div>
<div class="section" id="any-plans-for-future-contributions">
<h2>Any plans for future contributions?</h2>
<p>I’ll probably stay involved for the foreseeable future. Now that I know what
I’m doing with the dialog, I would like to help out with further improvements
to the login flow and website API. I’m also very interested in stabilization
and/or standardization of the Identity Provider API.</p>
</div>