<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>FastMail.FM Weblog</title>
	<atom:link href="http://blog.fastmail.fm/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fastmail.fm</link>
	<description>Blog for FastMail.FM announcements, news and comments</description>
	<lastBuildDate>Fri, 03 May 2013 02:11:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.fastmail.fm' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>FastMail.FM Weblog</title>
		<link>http://blog.fastmail.fm</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.fastmail.fm/osd.xml" title="FastMail.FM Weblog" />
	<atom:link rel='hub' href='http://blog.fastmail.fm/?pushpress=hub'/>
		<item>
		<title>Google Authenticator now supported for two-factor authentication</title>
		<link>http://blog.fastmail.fm/2013/05/03/google-authenticator-now-supported-for-two-factor-authentication/</link>
		<comments>http://blog.fastmail.fm/2013/05/03/google-authenticator-now-supported-for-two-factor-authentication/#comments</comments>
		<pubDate>Fri, 03 May 2013 00:22:27 +0000</pubDate>
		<dc:creator>Rob N</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1268</guid>
		<description><![CDATA[FastMail has long supported various methods of two-factor authentication for additional account security, from generated one-time-passwords, to SMS, to Yubikey. Today we&#8217;ve added another method to our stable &#8211; the Google Authenticator method, otherwise known as Time-based One Time Passwords (RFC 6238). With this you can use your iOS, Android or almost any other mobile [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1268&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>FastMail has long supported various methods of two-factor authentication for additional account security, from generated one-time-passwords, to SMS, to Yubikey. Today we&#8217;ve added another method to our stable &#8211; the <a href="https://code.google.com/p/google-authenticator/">Google Authenticator</a> method, otherwise known as <a href="https://tools.ietf.org/html/rfc6238">Time-based One Time Passwords (RFC 6238)</a>. With this you can use your iOS, Android or almost any other mobile device as your second factor when authenticating, increasing the security on your account without requiring you to carry an additional object around with you.</p>
<p>A Google Authenticator alternative login can be configured in the <a href="https://www.fastmail.fm/html/?MSignal=AltLogins-*">Alternate Logins</a> section of your account settings screen. If you&#8217;re using the official Google clients, then you can use its support for QR codes to make setup super-easy. You can however choose to use any number of other clients that support this authentication mechanism; all will work with our implementation.</p>
<p>Please refer to our <a href="https://www.fastmail.fm/help/login_google_authenticator.html">Google Authenticator help page</a> for more details.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1268/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1268&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/05/03/google-authenticator-now-supported-for-two-factor-authentication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0111ec54e2ff06c4661eda1a0585f9f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fce2</media:title>
		</media:content>
	</item>
		<item>
		<title>Reading pane available</title>
		<link>http://blog.fastmail.fm/2013/04/17/reading-pane-available/</link>
		<comments>http://blog.fastmail.fm/2013/04/17/reading-pane-available/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 03:25:42 +0000</pubDate>
		<dc:creator>rjlov</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1191</guid>
		<description><![CDATA[Today we rolled out support for a longstanding feature request we&#8217;ve had here at FastMail: a reading pane in our web interface. Displaying the mailbox listing next to the selected conversation means you can go through your email without switching between two different screens, and you can see at a glance what other messages are [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1191&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Today we rolled out support for a longstanding feature request we&#8217;ve had here at FastMail: a reading pane in our web interface. Displaying the mailbox listing next to the selected conversation means you can go through your email without switching between two different screens, and you can see at a glance what other messages are in your mailbox whilst reading an email. This works particularly well in today&#8217;s age of widescreen computers and tablets, making good use of all that horizontal screen space.</p>
<p>You&#8217;ll find the option to choose a layout that shows the reading pane in the Settings, as part of the &#8220;Theme&#8221; group of settings. You&#8217;ll also find here an option to hide the sidebar, which is useful on smaller devices where you want to use the space for the reading pane instead. Note, when logging in on an iPad we automatically enable the reading pane and hide the sidebar to make optimal use of the space available.</p>
<p>The reading pane is not available in the classic interface.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1191&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/04/17/reading-pane-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8695d5f2f3d0dca7ab6efdc8f9a2e1e9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rjlov</media:title>
		</media:content>
	</item>
		<item>
		<title>Dropbox integration now available</title>
		<link>http://blog.fastmail.fm/2013/04/09/dropbox-integration-now-available-2/</link>
		<comments>http://blog.fastmail.fm/2013/04/09/dropbox-integration-now-available-2/#comments</comments>
		<pubDate>Tue, 09 Apr 2013 06:06:39 +0000</pubDate>
		<dc:creator>Rob N</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1256</guid>
		<description><![CDATA[&#8220;Cloud&#8221; storage is a big deal these days, and there&#8217;s all sorts of great ways to make your files available everywhere. FastMail has had an online file storage facility for years, but there&#8217;s other popular services out there too. So recently we started thinking about how we could let you use other file services from [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1256&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>&#8220;Cloud&#8221; storage is a big deal these days, and there&#8217;s all sorts of great ways to make your files available everywhere. FastMail has had an online file storage facility for years, but there&#8217;s other popular services out there too. So recently we started thinking about how we could let you use other file services from inside FastMail.</p>
<p>Dropbox is one of the most popular of these services, and we think they do a great job of making it easy to access your files everywhere, no matter what kind of device you use. That philosophy fits well with what we&#8217;re trying to do with FastMail, so it seemed like a natural fit to make the two services work together.</p>
<p>So today we&#8217;ve released our Dropbox integration. Now when you attempt to attach a file, you&#8217;ll be offered a new option: &#8220;Attach From Dropbox&#8221;. The first time you use this you&#8217;ll be asked to sign in to Dropbox and authorise FastMail, but after that you&#8217;ll be able to browse and attach files from Dropbox just as easily as you can from your FastMail file storage. Similarly, you can save attachments from your messages directly to Dropbox.</p>
<p>We think this is pretty great. Now you can do things like save a document to the Dropbox folder on your computer at home, then attach it to an email you write from a friend&#8217;s computer. you could save some photos you received in a message to your Dropbox, and then use the Dropbox app on your phone to access and share them, and have them ready for you when you get home without having to do anything else.</p>
<p>Note that at no time does this give Dropbox access to your mail or any data stored by FastMail. All access to your Dropbox is done using a random authentication token that can not be linked back to your FastMail account.</p>
<p>We&#8217;re pretty excited about this feature, and hope you like it!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1256/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1256/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1256&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/04/09/dropbox-integration-now-available-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/e0111ec54e2ff06c4661eda1a0585f9f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fce2</media:title>
		</media:content>
	</item>
		<item>
		<title>Fast, full message searching across all folders</title>
		<link>http://blog.fastmail.fm/2013/04/02/fast-full-message-searching-across-all-folders/</link>
		<comments>http://blog.fastmail.fm/2013/04/02/fast-full-message-searching-across-all-folders/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 04:03:42 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1253</guid>
		<description><![CDATA[We’ve just rolled out a significant improvement to our search infrastructure. Until now, searching for email in FastMail has been slow and idiosyncratic. Searching for words entered into the search box would only search the To/Cc/From/Subject headers of messages in the current folder. It wouldn’t search the message body content or across multiple folders. While [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1253&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We’ve just rolled out a significant improvement to our search infrastructure.</p>
<p>Until now, searching for email in FastMail has been slow and idiosyncratic. Searching for words entered into the search box would only search the To/Cc/From/Subject headers of messages in the current folder. It wouldn’t search the message body content or across multiple folders. While there were options that made both of these possible, they were incredibly slow, making finding the messages you wanted frustrating.</p>
<p>Now though, when you enter words in the search box, we search the To/Cc/From/Subject headers as well as the entire message body content, and we do it across all messages in all folders. Additionally, when searching for a word, we’ll show a snippet of the message content with the search term(s) highlighted in the preview area. We’ll also search for multiple different forms of the word e.g. searching for “condition” will find condition, conditions, conditional, conditionally, etc.</p>
<p>Most importantly, by making sure all this data is indexed, the searches are very fast, even with a million messages across dozens of folders. In most cases, it should only take a few seconds to search all your email and we have plans in progress that should speed this up even more over the coming months.</p>
<p>We’ve also built an easy to access advanced search builder. When you click in the search box, an auto-complete popup will appear as you type. The final item in the pop-up is an “Advanced search” option. Clicking on this will show an overlay that lets you construct an advanced search without having to leave the screen.</p>
<p>If you find yourself repeating the same search frequently, you can save it by clicking the “Save” button next to the search in the sidebar. The search will appear with your list of folders. Keyboard power users can quickly select the search using the “g” shortcut folder finder, just like a normal folder.</p>
<p>Note: The new search currently only works with the new (AJAX) interface. If you’re using the “classic” interface or the mobile interface, you’ll get the old search system for now. We hope to fix this in the future. Also if you want the old search behaviour (including sub-string matching), use the <a href="https://www.fastmail.fm/help/mailbox_searching.html">substr:(sometext) operator as described on the help page</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1253/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1253&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/04/02/fast-full-message-searching-across-all-folders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>New domains added</title>
		<link>http://blog.fastmail.fm/2013/03/01/new-domains-added/</link>
		<comments>http://blog.fastmail.fm/2013/03/01/new-domains-added/#comments</comments>
		<pubDate>Fri, 01 Mar 2013 02:00:30 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1252</guid>
		<description><![CDATA[We’ve recently added some new domains to Fastmail. You can use these domains to signup new accounts, or as alias email addresses in existing accounts (if your account level supports aliases). The domains are: fastmail.im fastmail.mx fastmail.se fastmail.tw<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1252&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We’ve recently added some new domains to Fastmail. You can use these domains to signup new accounts, or as alias email addresses in existing accounts (if your account level supports aliases). The domains are:</p>
<ul>
<li>fastmail.im</li>
<li>fastmail.mx</li>
<li>fastmail.se</li>
<li>fastmail.tw</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1252/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1252/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1252&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/03/01/new-domains-added/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>Intermittent bayes db corruption resolved</title>
		<link>http://blog.fastmail.fm/2013/02/24/intermittent-bayes-db-corruption-resolved/</link>
		<comments>http://blog.fastmail.fm/2013/02/24/intermittent-bayes-db-corruption-resolved/#comments</comments>
		<pubDate>Sun, 24 Feb 2013 04:44:40 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1251</guid>
		<description><![CDATA[This is a technical post that describes the history and recent efforts to track down a bug that was corrupting some users bayes databases. Fastmail users subscribed to receive email updates from the Fastmail blog can ignore this post if they are not interested. Over the past few years, we’ve had sporadic reports of users [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1251&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This is a technical post that describes the history and recent efforts to track down a bug that was corrupting some users bayes databases. Fastmail users subscribed to receive email updates from the Fastmail blog can ignore this post if they are not interested.</p>
<p>Over the past few years, we’ve had sporadic reports of users bayes databases being corrupted and reset back to empty. When this happened, it would cause email delivery for that user to fall back to using the global bayes database, which decreased the overall accuracy of their spam detection until they retrained the database with more spam and non-spam messages.</p>
<p>I had tried multiple times to track down what was causing this issue, but each time with no luck. Each time the problem occurred, there was an error message in the logs of this form.</p>
<pre>bayes: bayes db version 0 is not able to be used, aborting!</pre>
<p>Often searching the internet for an error message will find other people that have had the same problem and tracked down the solution, but in this case it didn’t. Each time I tried to work through the code to see what was going wrong, I reached a dead end and couldn’t see any obvious problem.</p>
<p>Since the corruptions were very intermittent and losing a bayes database isn’t critical, doesn’t cause email to be lost or inaccessible, and can be rebuilt just by reporting email as spam/non-spam again, tracking this down was always a bit of a lower priority issue.</p>
<p>Recently though, after one more corruption report too many, I decided once and for all to track down what was causing it. Bit by bit over the course of several weeks, I added more and more logging information to the server code to track down where in the code the problem was occurring.</p>
<p>The logging results proved to be very odd. In the vast majority of cases it showed that writing to a particular database worked fine, but every now and then, it caused data to be lost. Eventually I managed to create a reproducible test case. It turned out to be very odd issue because performing a particular programming action with a database library worked fine the first 5 or 6 times, but on the 6th or 7th, it would cause data to become lost. Clearly something odd is happening in the lower level library code.</p>
<p>Fortunately there was a straight forward workaround to the problem, so I’ve now patched our code with the workaround, and over the last few weeks I’ve monitored the logs which show the original error message above has completely disappeared and no databases are being corrupted any more.</p>
<p>I’ve reported bugs to the underlying modules causing the problems, so hopefully long term they’ll fixed as well.</p>
<p><a title="https://rt.cpan.org/Public/Bug/Display.html?id=83060" href="https://rt.cpan.org/Public/Bug/Display.html?id=83060">https://rt.cpan.org/Public/Bug/Display.html?id=83060</a></p>
<p><a title="https://issues.apache.org/SpamAssassin/show_bug.cgi?id=6901" href="https://issues.apache.org/SpamAssassin/show_bug.cgi?id=6901">https://issues.apache.org/SpamAssassin/show_bug.cgi?id=6901</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1251/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1251&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/02/24/intermittent-bayes-db-corruption-resolved/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>Update to DNS hosting</title>
		<link>http://blog.fastmail.fm/2013/02/05/update-to-dns-hosting/</link>
		<comments>http://blog.fastmail.fm/2013/02/05/update-to-dns-hosting/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 05:19:23 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1250</guid>
		<description><![CDATA[We’ve rolled out a change to our DNS hosting abilities to switch our backend from tinydns to powerdns. We’d previously tried this change once before but had some problems and had to roll back. After some more development work and testing, we believe we’ve fixed all these issues and so have moved forward to powerdns [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1250&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We’ve rolled out a change to our <a href="https://www.fastmail.fm/help/domain_management_custom_dns.html">DNS hosting abilities</a> to switch our backend from tinydns to powerdns. We’d previously tried this change once before <a href="http://blog.fastmail.fm/2012/09/26/one-step-forward-two-steps-back/">but had some problems and had to roll back</a>. After some more development work and testing, we believe we’ve fixed all these issues and so have moved forward to powerdns again.</p>
<p>This change should initially be invisible to users and things should continue to work as they were. In the long term, it will allow us to support more features and faster updates to DNS in the future.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1250/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1250/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1250&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2013/02/05/update-to-dns-hosting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>Undo and other new features</title>
		<link>http://blog.fastmail.fm/2012/12/12/undo-and-other-new-features/</link>
		<comments>http://blog.fastmail.fm/2012/12/12/undo-and-other-new-features/#comments</comments>
		<pubDate>Wed, 12 Dec 2012 02:07:49 +0000</pubDate>
		<dc:creator>nmjenkins</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1247</guid>
		<description><![CDATA[Yesterday, we rolled out a number of new features and improvements to our new webmail interface. Here&#8217;s a quick run down of what&#8217;s new: Undo. Accidentally moved a message, deleted a contact, marked something unread etc? No problem. Your last action can now be undone; just click the &#8220;Undo&#8221; link in the confirmation message. Or, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1247&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Yesterday, we rolled out a number of new features and improvements to our<br />
new webmail interface. Here&#8217;s a quick run down of what&#8217;s new:</p>
<ul>
<li><strong>Undo</strong>. Accidentally moved a message, deleted a<br />
contact, marked something unread etc? No problem. Your last action can<br />
now be undone; just click the &#8220;Undo&#8221; link in the confirmation message.<br />
Or, if you&#8217;re a keyboard user, hit &#8216;z&#8217;. Note, you can&#8217;t undo sending a<br />
message.</li>
<li>The pinned status of a message is now shown at the top on the<br />
conversation read screen, so you can see it even if the message is<br />
collapsed.</li>
<li>Security options and logs are now grouped together in their own<br />
section under &#8220;Account&#8221;, to make it easier to manage the security of<br />
your account. This includes changing your password, seeing (and remotely<br />
logging out) any existing sessions, and creating alternative<br />
logins.</li>
<li>The mailbox screen now shows an icon next to messages that have been<br />
replied to. With conversations enabled, this shows if the most recent<br />
message in the folder for that conversation has been replied to.</li>
<li>The &#8220;More&#8221; menu at the top right of each expanded message now has a<br />
&#8220;Reply to Sender&#8221; option if the message was sent to a mailing list, and<br />
an &#8220;Edit as New&#8221; option for all messages.</li>
<li>The unread count is now shown first in the title of a page, so you<br />
can still see it even if the tab cuts the title short.</li>
<li>Better support for non-conversations mode. Now faster and fully<br />
non-conversational: replies to messages are no longer threaded with the<br />
message being replied to.</li>
</ul>
<p>And, of course, several more minor refinements and bug fixes.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1247/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1247&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/12/12/undo-and-other-new-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/722df0f5c95946cfced9d9f9489e8b4e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nmjenkins</media:title>
		</media:content>
	</item>
		<item>
		<title>Inter-tab communication using local storage</title>
		<link>http://blog.fastmail.fm/2012/11/26/inter-tab-communication-using-local-storage/</link>
		<comments>http://blog.fastmail.fm/2012/11/26/inter-tab-communication-using-local-storage/#comments</comments>
		<pubDate>Mon, 26 Nov 2012 02:14:02 +0000</pubDate>
		<dc:creator>nmjenkins</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1239</guid>
		<description><![CDATA[A few weeks ago we launched our new webmail service for all users at FastMail. Once being used by a wider audience, we of course received reports of a few edge cases our testing hadn&#8217;t managed to uncover. One of the more interesting issues we discovered came from this use case: our user liked to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1239&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A few weeks ago we <a href="http://blog.fastmail.fm/2012/10/30/new-interface-and-login-screens-rolled-out/">launched</a> our new webmail service for all users at <a href="https://www.fastmail.fm">FastMail</a>. Once being used by a wider audience, we of course received reports of a few edge cases our testing hadn&#8217;t managed to uncover. One of the more interesting issues we discovered came from this use case: our user liked to scroll down his inbox, opening each email he wanted to read in a new tab in the background. Then he would go through the tabs, closing each one as he was done with it. So far, so good. Except, in Chrome, his browser of choice, as soon as about 5 tabs were open, the rest failed to load, and the earlier ones then started having communication errors as well.</p>
<p>A quick bit of research and testing yielded the problem: Chrome limits itself to a maximum of 6 concurrent connections to a single origin across the whole browser. Each tab was loading a full instance of the mail application, which meant it was creating an <a href="http://www.w3.org/TR/eventsource/">EventSource</a> object and connection to our push server, to be notified of new deliveries (see <a href="http://blog.fastmail.fm/2012/01/09/building-the-new-ajax-mail-ui-part-1-instant-notifications-of-new-emails-via-eventsourceserver-sent-events/">this previous post</a> for how that works). Since these connections are permanent (that&#8217;s the whole idea!), opening lots of tabs quickly used up all the available connections, with none left to fetch any actual data. To the user, this appeared as &#8220;Could not connect to server&#8221; error messages.</p>
<p>The solution to this problem was not immediately obvious. Ideally, we would like to maintain a single push connection and share it between the tabs, but there&#8217;s no API for getting a reference to other tabs or windows in the browser, even if they&#8217;re pointed to the same domain. Then I remembered that setting a property on <a href="http://www.w3.org/TR/webstorage/">local storage</a> triggers a &#8220;storage&#8221; event on the window object of every open tab with the same origin. This, I realised, could be used to synchronise behaviour across tabs.</p>
<p>The concept is fairly simple. Only one tab keeps a push connection; we call this the master tab. When it receives a push event, it broadcasts it by setting the event as a property on local storage called &#8220;broadcast&#8221;. When a tab receives the storage event for this key, it reads the JSON-encoded event object from local storage and processes it as though it had been received via an EventSource object.</p>
<p>The tricky part comes in coordinating between the tabs who should be master. The master tab also sets a value called &#8220;ping&#8221; on local storage roughly every 30 seconds to the current time stamp. When a tab first loads it checks for this value; if it is greater than 45 seconds ago it presumes there is no current master, so it becomes master. Otherwise, it becomes a slave. However, whilst it is a slave, it continuously monitors for storage events with a key of &#8220;ping&#8221;, and if it hasn&#8217;t heard a ping within a 45 second period, it takes over as master. This switches control to another tab when the master tab closes. On browsers supporting the &#8220;unload&#8221; event we can make the changeover happen pretty much instantly, by setting the &#8220;ping&#8221; value to 0 in local storage when the tab is closed.</p>
<p>This all works very well, but there&#8217;s one problem remaining: race conditions. There is no API for taking out an explicit lock on local storage, so the spec advocates the use of a per-origin mutex which would be acquired by scripts once they try to access the storage, and then released when the script finishes. Not all browsers have adopted this. The Chrome developers, for example, have decided the performance penalty is too great. Therefore, in some browsers, it is possible for scripts in different tabs to interleave such that, for example, each tries to take master at the same time, then each notices another has taken it so none end up as master! The solution we have adopted is to add a random component to the delay between pings and waiting for pings. This makes it unlikely that two tabs will both attempt to take master at the same time. Of course this can still happen, but should it do so, the random variation in each new master sending out a ping should ensure that one is quickly turned back to a slave. It will be eventually consistent, which is good enough for our purposes.</p>
<p>In case this is of use to anyone else, here&#8217;s the code we use (rewritten slightly to use pure JS rather than be based on our library code). It&#8217;s also available as a <a href="https://gist.github.com/4146038">gist</a> on github. You can try it out <a href="http://www.nmjenkins.com/intertab.html">on this test page</a>; just open the page in several windows or tabs, then close the master and see the control pass to another. You can also broadcast a message from any tab to the other tabs.</p>
<p><code>
<pre>
function WindowController () {
    var now = Date.now(),
        ping = 0;
    try {
        ping = +localStorage.getItem( &#x27;ping&#x27; ) || 0;
    } catch ( error ) {}
    if ( now - ping &gt; 45000 ) {
        this.becomeMaster();
    } else {
        this.loseMaster();
    }
    window.addEventListener( &#x27;storage&#x27;, this, false );
    window.addEventListener( &#x27;unload&#x27;, this, false );
}

WindowController.prototype.isMaster = false;
WindowController.prototype.destroy = function () {
    if ( this.isMaster ) {
        try {
            localStorage.setItem( &#x27;ping&#x27;, 0 );
        } catch ( error ) {}
    }
    window.removeEventListener( &#x27;storage&#x27;, this, false );
    window.removeEventListener( &#x27;unload&#x27;, this, false );
};

WindowController.prototype.handleEvent = function ( event ) {
    if ( event.type === &#x27;unload&#x27; ) {
        this.destroy();
    } else {
        var type = event.key,
            ping = 0,
            data;
        if ( type === &#x27;ping&#x27; ) {
            try {
                ping = +localStorage.getItem( &#x27;ping&#x27; ) || 0;
            } catch ( error ) {}
            if ( ping ) {
                this.loseMaster();
            } else {
                // We add a random delay to try avoid the race condition in 
                // Chrome, which doesn&#x27;t take out a mutex on local storage. It&#x27;s
                // imperfect, but will eventually work out.
                clearTimeout( this._ping );
                this._ping = setTimeout(
                    this.becomeMaster.bind( this ),
                    ~~( Math.random() * 1000 )
                );
            }
        } else if ( type === &#x27;broadcast&#x27; ) {
            try {
                data = JSON.parse(
                    localStorage.getItem( &#x27;broadcast&#x27; )
                );
                this[ data.type ]( data.event );
            } catch ( error ) {}
        }
    }
};

WindowController.prototype.becomeMaster = function () {
    try {
        localStorage.setItem( &#x27;ping&#x27;, Date.now() );
    } catch ( error ) {}

    clearTimeout( this._ping );
    this._ping = setTimeout( this.becomeMaster.bind( this ),
        20000 + ~~( Math.random() * 10000 ) );

    var wasMaster = this.isMaster;
    this.isMaster = true;
    if ( !wasMaster ) {
        this.masterDidChange();
    }
};

WindowController.prototype.loseMaster = function () {
    clearTimeout( this._ping );
    this._ping = setTimeout( this.becomeMaster.bind( this ),
        35000 + ~~( Math.random() * 20000 ) );

    var wasMaster = this.isMaster;
    this.isMaster = false;
    if ( wasMaster ) {
        this.masterDidChange();
    }
};

WindowController.prototype.masterDidChange = function () {};

WindowController.prototype.broadcast = function ( type, event ) {
    try {
        localStorage.setItem( &#x27;broadcast&#x27;,
            JSON.stringify({
                type: type,
                event: event
            })
        );
    } catch ( error ) {}
};
</pre>
<p></code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1239/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1239&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/11/26/inter-tab-communication-using-local-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/722df0f5c95946cfced9d9f9489e8b4e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nmjenkins</media:title>
		</media:content>
	</item>
		<item>
		<title>The technology behind the classic and new interfaces</title>
		<link>http://blog.fastmail.fm/2012/11/09/the-technology-behind-the-classic-and-new-interfaces/</link>
		<comments>http://blog.fastmail.fm/2012/11/09/the-technology-behind-the-classic-and-new-interfaces/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 11:48:00 +0000</pubDate>
		<dc:creator>brongondwana</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1208</guid>
		<description><![CDATA[I recently wrote a postmortem for our old interface, now I want to explain how the addition of a modern interface alongside our classic interface is different. In short, classic is here to stay. For all that the interface has looked similar over the past few years, it&#8217;s had many changes under the hood. Much [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1208&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I recently wrote a postmortem for our old interface, now I want to explain how the addition of a modern interface alongside our classic interface is different.</p>
<p>In short, classic is here to stay.</p>
<p>For all that the interface has looked similar over the past few years, it&#8217;s had many changes under the hood.</p>
<p>Much of the interface is fully internationalised, both in classic and new.  The code is all shared with the My Opera Mail product, where multiple language support is a core requirement.</p>
<p>It works much more nicely on small devices, in particular with Opera Mini.</p>
<p>Where possible, changes for the new interface have been rewritten as shared &#8220;library code&#8221; and integrated into both interfaces simultaneously.  Some things (search, for example) work differently.  But most core logic, and of course all low level mail routing and storage, are fully shared across our infrastructure.</p>
<p>This all adds up to a pile of &#8220;invisible&#8221; work we have done to make maintenance easier in future.  Even the new search uses the same query builder library, so back-porting fully cross-folder search capability to classic will be achievable if there is demand.</p>
<p>Unlike the old interface, which was a completely separate copy of the code and grew stale over the years, there was never a &#8220;fork&#8221; (as it&#8217;s called in software development) for the new interface.</p>
<p>Indeed, you may have noticed that many screens on the new interface are really just &#8220;rebranded&#8221; classic.  It&#8217;s the same HTML code as the classic desktop and mobile screens, with a different title bar.  When you go back to the Mail or Address tabs, it reloads the javascript and hands control back.  This was a deliberate decision to speed up the areas of our site where people spend 99% of their time (statistic taken from logs, not made up) without duplicating the rarely used screens.  The client-side mailbox screen uses less bandwidth and is more responsive than the classic mechanism of downloading an entire html page on every click.</p>
<p>When we say &#8220;supported indefinitely&#8221; it really does mean that we have no plans to remove classic.  There&#8217;s no internal timeline in our heads.  The core technology is used by both interfaces, and we&#8217;re updating them together.</p>
<p>Finally to address concerns about continued IMAP access.</p>
<p>We have invested heavily on improvements to the Cyrus IMAP server, both myself and Greg Banks in the Australian office (who was hired to work full time on Cyrus, and is doing an awesome job).</p>
<p>Our new conversation features are built directly into Cyrus, and fully integrated into its replication system.  Other features like storing previews and undelete information along with messages have been created by adding support to Cyrus for the standard message annotations described in RFC5257, contributing that work back to the community.</p>
<p>You can read more about the Cyrus project at <a href="http://cyrusimap.org/">http://cyrusimap.org/</a>.  This reliable and standards compliant server is the core of our technology stack.  We&#8217;re not moving away from IMAP, even as we extend the server to support our specific use-cases.</p>
<p>You can read (or even download and play with) the exact code that runs on our servers from<br />
<a href="http://github.com/brong/cyrus-imapd/">http://github.com/brong/cyrus-imapd/</a> &#8211; our production systems run on the &#8220;fastmail&#8221; branch.</p>
<p>Bron.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1208/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&#038;blog=1210258&#038;post=1208&#038;subd=fastmailblog&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/11/09/the-technology-behind-the-classic-and-new-interfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c55ece7022f0678e7b270ec72115b394?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">brongondwana</media:title>
		</media:content>
	</item>
	</channel>
</rss>
