<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18929277</id><updated>2010-04-14T09:28:41.040-07:00</updated><title type='text'>mykzilla</title><subtitle type='html'>Myk Melez working on Mozilla projects</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>92</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18929277.post-6583468542975089893</id><published>2010-03-05T23:03:00.001-08:00</published><updated>2010-03-05T23:03:40.516-08:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://mykzilla.blogspot.com/.&lt;br /&gt;       You will be automatically redirected in 30 seconds, or you may click &lt;a href='http://mykzilla.blogspot.com/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://mykzilla.blogspot.com/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6583468542975089893?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/6583468542975089893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=6583468542975089893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6583468542975089893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6583468542975089893'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2010/03/this-blog-has-moved.html' title='This blog has moved'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7015776887411907934</id><published>2009-11-17T17:26:00.000-08:00</published><updated>2009-11-17T17:26:50.807-08:00</updated><title type='text'>The Skinny on Raindrop's Mailing List Extensions</title><content type='html'>Raindrop is an exploration of messaging innovation that strives to intelligently assist people in managing their flood of incoming messages. And mailing lists are a common source of messages you need to manage. So, with assistance from the Raindrop hackers, I wrote extensions that make it easier to deal with messages from mailing lists.&lt;br /&gt;&lt;br /&gt;Their goal is to soothe two particular pain points when dealing with mailing lists: grouping their messages together by list and unsubscribing from them once you're no longer interested in their subject matter.&lt;br /&gt;&lt;br /&gt;This post explains how the extensions do this; touches on some aspects of Raindrop's message processing and data storage models; and speculates about possible future directions for the extensions.&lt;br /&gt;&lt;h3&gt;Raindrop Extensibility&lt;/h3&gt;Raindrop is being built with the explicit goal of being broadly and deeply extensible, and it includes a number of APIs for adding and modifying functionality. The mailing list enhancements comprise two related extensions, one in the backend and one in the user interface.&lt;br /&gt;&lt;br /&gt;The backend extension plugs into Raindrop's incoming message processor, intercepting incoming email messages and extracting info about the mailing lists to which they belong. It also handles much of the work of unsubscribing from a list.&lt;br /&gt;&lt;br /&gt;The frontend extension plugs into Raindrop's Inflow application, modifying its interface to show you the most recent mailing list messages at a glance, group mailing list conversations together by list, and provide a button you can press to easily unsubscribe from a mailing list.&lt;br /&gt;&lt;h3&gt;Message Processing and Data Storage&lt;br /&gt;&lt;/h3&gt;Before getting into how the extensions work, it's useful to know a bit about how Raindrop processes and stores messages.&lt;br /&gt;&lt;br /&gt;Raindrop stores information using &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, a document-centric database whose principal unit of information storage and retrieval is the document (the equivalent of a record in SQL databases). Documents are just JSON blobs that can contain arbitrary name -&gt; value pairs (unlike SQL records, which can only contain values for predeclared columns).&lt;br /&gt;&lt;br /&gt;To distinguish between different kinds of documents, Raindrop assigns each a schema (similar to a table in SQL parlance) that describes (and may one day constrain) its properties. The &lt;tt&gt;rd.msg.email&lt;/tt&gt; schema is the primary schema representing an email message, while the &lt;tt&gt;rd.mailing-list&lt;/tt&gt; is the schema representing a mailing list, and the &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; is a simple schema that associates messages with their lists.&lt;br /&gt;&lt;br /&gt;(In an SQL database, &lt;tt&gt;rd.msg.email&lt;/tt&gt; and &lt;tt&gt;rd.mailing-list&lt;/tt&gt; would be tables whose rows represent email messages and mailing lists, while &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; would be a table whose rows map one to the other.)&lt;br /&gt;&lt;br /&gt;Note that there's a many-to-one relationship between messages and lists, since messages belong to a single list, although lists contain many messages, so &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; isn't strictly necessary. Its &lt;tt&gt;list-id&lt;/tt&gt; property (which identifies the list to which the message belongs) could simply be a property of &lt;tt&gt;rd.msg.email&lt;/tt&gt; docs (or, in SQL terms, a foreign key in the &lt;tt&gt;rd.msg.email&lt;/tt&gt; table).&lt;br /&gt;&lt;br /&gt;But putting it into its own document has several advantages. First, it improves robustness, as it reduces the possibility of conflicts between extensions and core code writing to the same documents.&lt;br /&gt;&lt;br /&gt;It also improves write performance, as it's faster to add a document than to modify an existing one (although index generation and read performance can be an issue).&lt;br /&gt;&lt;br /&gt;Finally, it improves extensibility, because it makes it possible to write an extension that extends the backend mailing list extension.&lt;br /&gt;&lt;br /&gt;That's because Raindrop's incoming message processing model allows extensions to observe the creation of any kind of document, including those created by other extensions.&lt;br /&gt;&lt;br /&gt;So just as the mailing list extension observes the creation of &lt;tt&gt;rd.msg.email&lt;/tt&gt; documents, another extension can observe the creation of &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; documents and process them further in some useful way. If the mailing list extension simply modified the original document instead of creating its own, that would require some additional and more complicated API.&lt;br /&gt;&lt;h3&gt;The Backend Extension&lt;/h3&gt;The primary function of the backend extension is to examine every incoming message and dress the ones from mailing lists with some additional structured information that the frontend can use to organize them.&lt;br /&gt;&lt;br /&gt;Backend extensions are accompanied by a JSON manifest that tells Raindrop what kinds of incoming documents it wants to intercept. The mailing list extension's manifest registers it as an observer of incoming &lt;tt&gt;rd.msg.email&lt;/tt&gt; documents, which get created when Raindrop retrieves an email message:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;"schemas" : {&lt;br /&gt;  "rd.ext.workqueue" : {&lt;br /&gt;      "source_schemas" : ["rd.msg.email"],&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;The extension itself is a Python script with a &lt;tt&gt;handler&lt;/tt&gt; function that gets passed the &lt;tt&gt;rd.msg.email&lt;/tt&gt; document and looks to see if it contains a &lt;tt&gt;List-ID&lt;/tt&gt; header (or, in certain cases, another identifier) identifying the mailing list from which the message comes:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;def handler(message):&lt;br /&gt;  ...&lt;br /&gt;  if 'list-id' in message['headers']:&lt;br /&gt;      # Extract the ID and name of the mailing list from the list-id header.&lt;br /&gt;      # Some mailing lists give only the ID, but others (Google Groups,&lt;br /&gt;      # Mailman) provide both using the format 'NAME &amp;lt;id&amp;gt;', so we extract them&lt;br /&gt;      # separately if we detect that format.&lt;br /&gt;      list_id = message['headers']['list-id'][0]&lt;br /&gt;  ...&lt;/pre&gt;&lt;br /&gt;If it doesn't find a list identifier, it simply returns, and Raindrop continues processing the message:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;if not list_id:&lt;br /&gt;    logger.debug("NO LIST ID; ignoring message %s", message_id)&lt;br /&gt;    return&lt;/pre&gt;&lt;br /&gt;Otherwise, it calls Raindrop's &lt;tt&gt;emit_schema&lt;/tt&gt; function to create an &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; document linking the message document to an &lt;tt&gt;rd.mailing-list&lt;/tt&gt; document representing the mailing list:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;emit_schema('rd.msg.email.mailing-list', { 'list_id': list_id })&lt;/pre&gt;&lt;br /&gt;In this function call, &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; is the type of document to create, while &lt;tt&gt;{ 'list_id': list_id }&lt;/tt&gt; is the document itself, written as Python that will get serialized to JSON.&lt;br /&gt;&lt;br /&gt;A document created inside a backend extension like this automatically gets a reference to the document the extension is processing (i.e. the &lt;tt&gt;rd.msg.email&lt;/tt&gt; document), so the only thing it has to explicitly include is a reference to the list document, in the form of a &lt;tt&gt;list_id&lt;/tt&gt; property whose value is the list identifier.&lt;br /&gt;&lt;br /&gt;The extension also checks if there's an &lt;tt&gt;rd.mailing-list&lt;/tt&gt; document in the database for the mailing list itself, and if not, it creates one, populating it with information from the message's &lt;tt&gt;List-*&lt;/tt&gt; headers, like how to unsubscribe from the list. Otherwise, it updates the existing mailing list document if the message's &lt;tt&gt;List-*&lt;/tt&gt; headers contain updates.&lt;br /&gt;&lt;h3&gt;The Frontend Extension&lt;/h3&gt;The frontend extension uses the information extracted by the backend to help users manage mailing lists in the Inflow application.&lt;br /&gt;&lt;br /&gt;It adds a widget to the Home view that shows you the last few messages from your lists at the bottom of the page, so you can keep an eye on those messages without having to give them your full attention:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/latest-list-messages-714113.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/latest-list-messages-714111.png" height="176" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It adds a list of your mailing lists to the Organizer widget:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/mailing-list-list-722772.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/mailing-list-list-722768.png" height="320" width="190" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And when you click on the name of a list, it shows you its conversations in the conversation pane:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/list-conversations-763392.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/list-conversations-763369.png" height="201" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In traditional mail clients, users who want to break out their list messages into separate buckets like this typically have to create a folder for each list to contain its messages and then a filter for each list to move incoming list messages into the appropriate folders. The extension does this for you automatically!&lt;br /&gt;&lt;br /&gt;Finally, while viewing list conversations, if the extension knows how to unsubscribe you from the list, it displays an Unsubscribe button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/unsubscribe-button-794151.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/unsubscribe-button-794149.png" height="201" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pressing the button (and then confirming your decision) unsubscribes you from the list. You don't have to do anything else, like remembering your username/password for some web page, sending an email, or confirming your request with the list admin. The extensions handle all those details for you so you don't have to know about them!&lt;br /&gt;&lt;h3&gt;List Unsubscription&lt;/h3&gt;In case you do want to know the details, however, it goes like this...&lt;br /&gt;&lt;br /&gt;First, the frontend extension sends a message to the list's admin address requesting unsubscription, with a certain command (like "unsubscribe") in the subject or body of the message (lists often specify exactly what command to send in the &lt;tt&gt;mailto:&lt;/tt&gt; link they include in the &lt;tt&gt;List-Unsubscribe&lt;/tt&gt; header):&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: Jan Reilly &lt;jan@example.com&gt;&lt;br /&gt;To: wasbigtalk-admin@example.com&lt;br /&gt;Subject: unsubscribe&lt;/jan@example.com&gt;&lt;/pre&gt;&lt;br /&gt;Then the server responds with a message requesting confirmation of the request, often putting a unique token into the Subject or Reply-To header to track the request:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: wasbigtalk-admin@example.com&lt;br /&gt;To: jan@example.com&lt;br /&gt;Subject: please confirm unsubscribe from wasbigtalk (4bc3b7e439fd)&lt;br /&gt;&lt;br /&gt;Hello jan@example.com,&lt;br /&gt;&lt;br /&gt;We have received a request to unsubscribe you from wasbigtalk.&lt;br /&gt;Please confirm this request to unsubscribe by replying to this email.&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;Then the backend extension responds with a message confirming the request that includes the unique token:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: jan@example.com&lt;br /&gt;To: wasbigtalk-admin@example.com&lt;br /&gt;Subject: Re: please confirm unsubscribe from wasbigtalk (4bc3b7e439fd)&lt;/pre&gt;&lt;br /&gt;Finally, the server responds with a message confirming that the subscriber has, indeed, been unsubscribed:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: wasbigtalk-admin@example.com&lt;br /&gt;To: jan@example.com&lt;br /&gt;Subject: you have been unsubscribed from wasbigtalk&lt;br /&gt;&lt;br /&gt;Hello jan@example.com,&lt;br /&gt;&lt;br /&gt;Your unsubscription from wasbigtalk was successful.&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;At this point, the backend extension marks the list unsubscribed in the database, and the frontend extension marks it unsubscribed in the user interface.&lt;br /&gt;&lt;br /&gt;This process matches the way much mailing list server software works, although there are daemons in the details, so the extensions have to be programmed to support each server individually.&lt;br /&gt;&lt;br /&gt;Currently, they know how to handle &lt;a href="http://groups.google.com/"&gt;Google Groups&lt;/a&gt; and &lt;a href="http://www.gnu.org/software/mailman/"&gt;Mailman&lt;/a&gt; lists. &lt;a href="http://www.mj2.org/"&gt;Majordomo2&lt;/a&gt; (used by the &lt;a href="http://www.bugzilla.org/"&gt;Bugzilla&lt;/a&gt; and &lt;a href="http://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt; projects, among others) is not supported, because it doesn't send &lt;tt&gt;List-*&lt;/tt&gt; headers (alhough supposedly it can be configured to do so). The &lt;a href="http://www.w3.org/"&gt;W3C&lt;/a&gt;'s list server is not yet supported, although it does send &lt;tt&gt;List-*&lt;/tt&gt; headers, and support should be fairly easy to add.&lt;br /&gt;&lt;br /&gt;Note that some of the processing the extension does is (locale-dependent) "screen"-scraping, as Google Groups and Mailman don't consistently identify the list ID and message type in some of their correspondence. In the long run, hopefully server software will improve in that regard. Perhaps someone can spearhead an effort to make it so?&lt;br /&gt;&lt;h3&gt;The Future&lt;/h3&gt;The extensions' current features fit in well with Raindrop's goal of helping people better handle their flood of incoming messages. But there is surely much more they could do to help in this regard.&lt;br /&gt;&lt;br /&gt;Besides general improvements to reliability and robustness--like support for additional list servers and handling of localized admin messages--they could let you resubscribe to a mailing list from which you've unsubscribed. And perhaps they could automatically fetch the messages you missed while you were away. Or even retrieve the entire archive of a list to which you're subscribed, so you can browse the archive in Raindrop!&lt;br /&gt;&lt;br /&gt;What bugs you about mailing lists? And how might Raindrop's mailing list extensions make them easier (and even funner) to use?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7015776887411907934?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/7015776887411907934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=7015776887411907934' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7015776887411907934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7015776887411907934'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/11/skinny-on-raindrops-mailing-list.html' title='The Skinny on Raindrop&apos;s Mailing List Extensions'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7740719470656815276</id><published>2009-11-04T15:58:00.001-08:00</published><updated>2009-11-04T15:58:03.687-08:00</updated><title type='text'>Building/Releasing Personas</title><content type='html'>Want to know how a popular extension like Personas gets built and released? Neither do I! Yet I know anyway. And I've written it down for your edification! So &lt;a  href="https://wiki.mozilla.org/Labs/Personas/Build"&gt;check it out&lt;/a&gt;.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7740719470656815276?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/7740719470656815276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=7740719470656815276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7740719470656815276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7740719470656815276'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/11/buildingreleasing-personas.html' title='Building/Releasing Personas'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3631027799136148808</id><published>2009-10-12T19:32:00.001-07:00</published><updated>2009-10-12T19:32:19.699-07:00</updated><title type='text'>Makefile for building/distributing extensions</title><content type='html'>I've written a Makefile to help build and distribute Personas and Snowl. It automates the process of generating manifests; packaging the extension into a JAR and a XPI; and, for a "development" distribution channel, autogenerating successive version numbers and rsyncing the builds and update.rdf file to a distribution server.&lt;br&gt; &lt;br&gt; The file makes it easy for me to update the &lt;a  href="https://people.mozilla.com/%7Ecbeard/personas/dist/personas-dev-latest.xpi"&gt;latest development build&lt;/a&gt; of Personas after checking in a fix via:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build channel=dev make package channel=dev make publish&lt;/pre&gt; &lt;br&gt; For release builds, it's:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build channel=rel make package channel=rel [manually upload to AMO]&lt;/pre&gt; &lt;br&gt; And when I just want to test locally, I can build and install to a local profile:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build make install profile=~/dev-profile firefox -profile ~/dev-profile&lt;/pre&gt; &lt;br&gt; Or I can package the build and install via Firefox's Add-ons Manager:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build make package [manually install via Firefox's Add-ons Manager]&lt;/pre&gt; &lt;br&gt; Because I reuse it for multiple projects, project-specific variables are defined in a separate client.mk file. If you have similar needs and would find it useful, you are welcome to it!&lt;br&gt; &lt;br&gt; Just grab the &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/Makefile"&gt;Makefile&lt;/a&gt;, see &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/client.mk"&gt;client.mk&lt;/a&gt; for the variables you should define, and check out the &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/"&gt;Personas source directory&lt;/a&gt; for the general layout that the Makefile handles as well as the &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/install.rdf.in"&gt;install.rdf.in&lt;/a&gt;, &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/chrome.manifest.in"&gt;chrome.manifest.in&lt;/a&gt;, and &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/update.rdf.in"&gt;update.rdf.in&lt;/a&gt; templates from which their respective files are built.&lt;br&gt; &lt;br&gt; &lt;br&gt; Notes:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;It's originally based on &lt;a  href="http://hg.mozilla.org/labs/weave/file/tip/Makefile"&gt;Weave's top-level Makefile&lt;/a&gt;, although it doesn't currently support the binary components that Weave's Makefile builds.&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;It assumes a directory structure in which &lt;i&gt;content/&lt;/i&gt;, &lt;i&gt;locale/&lt;/i&gt;, and &lt;i&gt;skin/&lt;/i&gt; directories are at the top level of the source directory (not within a &lt;i&gt;chrome/&lt;/i&gt; subdirectory).&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;It currently builds in the source directory rather than in an object directory, which means it can leave old &lt;i&gt;install.rdf&lt;/i&gt;, &lt;i&gt;chrome.manifest&lt;/i&gt;, and &lt;i&gt;chrome.jar&lt;/i&gt; files around, so sometimes I need to &lt;tt&gt;make clean &amp;amp;&amp;amp; make build&lt;/tt&gt; to get rid of the ones I previously built (f.e. for a release build whose chrome files are archived) and generate new ones for continued development.&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;For Personas, I use a &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/defaults/preferences/prefs.js.in"&gt;defaults/preferences/prefs.js.in&lt;/a&gt; template to generate prefs that contain the Mercurial revision ID (so I can identify the version of code in a development build with which someone is reporting problems) and the distribution channel (which the extension uses to suppress the "You've been updated!" page for the "dev" channel, since that would get annoying fast).&lt;/li&gt; &lt;/ol&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3631027799136148808?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/3631027799136148808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=3631027799136148808' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3631027799136148808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3631027799136148808'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/10/makefile-for-buildingdistributing.html' title='Makefile for building/distributing extensions'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6089802576414913288</id><published>2009-08-29T07:54:00.000-07:00</published><updated>2009-08-29T08:10:43.751-07:00</updated><title type='text'>Personas for Email Messages</title><content type='html'>Here's a thought (I had in the middle of a dream about brightly garbed superheroes): use &lt;a href="http://www.getpersonas.com/"&gt;Personas&lt;/a&gt; to style email messages in &lt;a href="http://www.mozillamessaging.com/thunderbird/"&gt;Thunderbird&lt;/a&gt;! It'd be a simple way to easily add some style to your messages to friends and family, highlighting your current mood, your perennial interests, or the subject of the message.&lt;br /&gt;&lt;br /&gt;A &lt;strike&gt;dramatization&lt;/strike&gt; mockup:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/personas-in-message-775241.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 339px;" src="http://www.melez.com/mykzilla/uploaded_images/personas-in-message-775234.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some tricky issues, like how to select a background color for the message that blends in attractively with the bottom of the header image. And it's not clear if the footer image is useful in this case.&lt;br /&gt;&lt;br /&gt;But overall the idea seems quite promising. What do you think? And, if you're a Mozilla extension hacker (or would like to become one), would you be interested in prototyping it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6089802576414913288?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/6089802576414913288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=6089802576414913288' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6089802576414913288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6089802576414913288'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/08/personas-for-email-messages.html' title='Personas for Email Messages'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1287699979278620781</id><published>2009-04-23T08:15:00.000-07:00</published><updated>2009-04-23T08:19:39.021-07:00</updated><title type='text'>The Problems With Pagination</title><content type='html'>Many web sites and applications paginate their content. Often this makes them harder to use.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/pagination-amo-797068.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 391px; height: 48px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-amo-797067.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Partly it's because site-provided pagination interacts poorly with the browser's built-in scrolling, because the content on any given web page usually takes up more than one vertical screen of space, and you have to jump back and forth between site pagination and browser scrolling, hunting down their controls each time you do so.&lt;br /&gt;&lt;br /&gt;Sites compound this problem by moving their pagination controls around, so you can't leave your mouse over the &lt;span style="font-style: italic;"&gt;Next Page&lt;/span&gt; button and assume you can simply click the mouse button repeatedly to jump to subsequent pages.&lt;br /&gt;&lt;br /&gt;And pagination control click targets are small, which makes them hard to hit. Page-specific targets are often a single number (&lt;span style="font-style: italic;"&gt;1&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;2&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;3&lt;/span&gt;), while the &lt;span style="font-style: italic;"&gt;Next Page&lt;/span&gt; target is sometimes a single character (&lt;span style="font-style: italic;"&gt;&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/pagination-salon-755844.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 115px; height: 26px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-salon-755842.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Finally, pagination confounds searching through content using a browser's &lt;span style="font-style: italic;"&gt;Find in Page&lt;/span&gt; feature, since it requires you to switch back and forth between searching for the content on the current page and navigating to the next one until you find the text you're looking for (and beyond, if you're looking for multiple occurrences of it).&lt;br /&gt;&lt;br /&gt;And it similarly confounds any other activity in which you want to engage with all the content in an application, like when I wanted to turn off tracebacks/pingbacks for all 56 posts in a Wordpress blog, which is a six step process, and I had to &lt;a href="http://wordpress.org/support/topic/228285?replies=3"&gt;repeat those six steps four times each&lt;/a&gt; because Wordpress's list of posts only lets me see 15 at a time.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/pagination-wordpress-794734.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 345px; height: 44px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-wordpress-794733.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Nevertheless, there are legitimate uses for pagination:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sites whose content is computationally intensive to generate (like search engines) use it to reduce load and cost;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;those with large quantities of content that strains server, client, and network resources to display all at once (search engines again, the &lt;a href="http://www.getpersonas.com/gallery/All/All/1"&gt;Personas gallery&lt;/a&gt;) use it to improve responsiveness;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;those whose content cannot usefully be browsed in its entirety much of the time (search engines a third time, messaging applications) use it to reduce the cognitive overload of providing all their content at once;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and those with an ad-based revenue model (you guessed it, search engines, but also online news and many other sites) use it to show more ads.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/pagination-google-742305.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 259px; height: 57px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-google-742304.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;For those kinds of sites, pagination makes sense, although doing it right still matters, like giving its controls large click targets and putting them in the same place on every page.&lt;br /&gt;&lt;br /&gt;And, for content that spills across multiple screens, including the pagination controls at both the top and bottom of the content, the two scroll positions at which users often find themselves when they want to change pages; or positioning them absolutely, so they're always visible; or only loading a screenful of content at a time, so users never have to both page and scroll; or using &lt;a href="http://www.37signals.com/svn/archives2/no_more_more_pages.php"&gt;endless/infinite scrolling&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Are there even better approaches, and are there ways for the web platform to support them so that web sites don't have to roll their own? Perhaps browsers and servers could collaborate to provide content in screenfuls with integrated scrolling and paging controls that play well together and don't change from site to site.&lt;br /&gt;&lt;br /&gt;What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1287699979278620781?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/1287699979278620781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=1287699979278620781' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1287699979278620781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1287699979278620781'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/04/problems-with-pagination.html' title='The Problems With Pagination'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7974255395631974196</id><published>2009-04-16T18:17:00.001-07:00</published><updated>2009-04-16T19:24:48.355-07:00</updated><title type='text'>syntaxes for iterating arrays in JavaScript</title><content type='html'>&lt;a href="https://developer.mozilla.org/en/JavaScript"&gt;JavaScript&lt;/a&gt; lets you iterate arrays using the &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for_each...in"&gt;&lt;span style="font-style: italic;"&gt;for each...in&lt;/span&gt; statement&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;for each (var item in [1, 2, 3]) alert(item);&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/New_in_JavaScript_1.6"&gt;JavaScript 1.6&lt;/a&gt; added the &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach"&gt;&lt;span style="font-style: italic;"&gt;Array.forEach&lt;/span&gt; method&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;[1, 2, 3].forEach(function(item) { alert(item) });&lt;/pre&gt;&lt;br /&gt;I've always preferred &lt;a href="http://perldoc.perl.org/perlsyn.html#Statement-Modifiers"&gt;Perl's statement modifiers&lt;/a&gt;, though, for the popular English-like order of their clauses ("do this for each of those"):&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;print $_ foreach (1, 2, 3);&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/En/New_in_JavaScript_1.7"&gt;JavaScript 1.7&lt;/a&gt; added &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Arrays#Array_comprehensions"&gt;array comprehensions&lt;/a&gt; for array initialization:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;var squares = [item * item for each (item in [1, 2, 3])];&lt;/pre&gt;&lt;br /&gt;I just realized I can (ab)use comprehensions to iterate arrays with Perl-like syntax by throwing away the result:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;[alert(item) for each (item in [1, 2, 3])];&lt;/pre&gt;&lt;br /&gt;I can iterate object properties the same way:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;var obj = { foo: 1, bar: 2, baz: 3 };&lt;br /&gt;[alert(name + "=" + obj[name]) for (name in obj)];&lt;/pre&gt;&lt;br /&gt;Sweet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7974255395631974196?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/7974255395631974196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=7974255395631974196' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7974255395631974196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7974255395631974196'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/04/syntaxes-for-iterating-arrays-in.html' title='syntaxes for iterating arrays in JavaScript'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6609413790681181898</id><published>2009-04-09T15:00:00.000-07:00</published><updated>2009-04-09T15:00:00.977-07:00</updated><title type='text'>Snowl Integration with Places</title><content type='html'>alta88 has recently done a bunch of work to integrate Snowl with Places. His initial efforts have focused on getting sources and people into Places, as he describes in &lt;a href="https://labs.mozilla.com/forum/comments.php?DiscussionID=5445"&gt;this post to the discussion forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This will make the list of collections in the next version of Snowl work like Firefox's list of bookmarks in the Bookmarks Sidebar, and sources/people will also show up in the AwesomeBar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-3-709941.png"&gt;&lt;img style="cursor: pointer; width: 399px; height: 295px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-3-709939.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Snowl doesn't yet register the &lt;span style="font-style: italic;"&gt;snowl:&lt;/span&gt; protocol, however, so selecting those items doesn't do anything (yet). What do you think it should do?&lt;br /&gt;&lt;br /&gt;And what additional Places-backed features would be useful?&lt;br /&gt;&lt;br /&gt;(Picking up on something &lt;a href="http://twitter.com/dietrich/status/1412995579"&gt;dietrich said on Twitter&lt;/a&gt; last week, I'd love to see Places get populated with tweets that reference a URL, setting the title of the Places entry to the content of the tweet, so you can use the AwesomeBar to find that site you saw last week in a tweet, as &lt;a href="http://brian.kingsonline.net/talk/?p=386"&gt;other folks have done with Delicious&lt;/a&gt;.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6609413790681181898?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/6609413790681181898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=6609413790681181898' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6609413790681181898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6609413790681181898'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/04/snowl-integration-with-places.html' title='Snowl Integration with Places'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6642316858017254871</id><published>2009-04-07T16:09:00.002-07:00</published><updated>2009-04-09T16:25:17.120-07:00</updated><title type='text'>Snowl development builds</title><content type='html'>I've created a distribution channel to get Snowl changes out to its testing community faster. I'll push development snapshots to the channel on a regular basis as significant fixes are committed (or perhaps nightly, if I can automate the process).&lt;br /&gt;&lt;br /&gt;Once you install a development build, Firefox will automatically check for newer ones and prompt you to update when it finds one, just as it does for the release builds on AMO.&lt;br /&gt;&lt;br /&gt;This is truly the slicing edge. If you use these builds, &lt;span style="font-weight: bold;"&gt;be prepared for the possibility of regressions and bustage&lt;/span&gt;. On the other hand, you'll also get to test new features earlier, like &lt;a href="http://www.melez.com/mykzilla/2009/04/snowl-integration-with-places.html"&gt;alta88's Places integration work&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Install the &lt;a href="https://people.mozilla.com/%7Emyk/snowl/dist/snowl-dev-latest.xpi"&gt;latest development build&lt;/a&gt;, then &lt;a href="https://labs.mozilla.com/forum/?CategoryID=27"&gt;discuss it&lt;/a&gt; and &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;component=Snowl"&gt;report bugs&lt;/a&gt; you find. (If you don't want to be on the slicing edge, try the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8397/"&gt;latest stabler release&lt;/a&gt; instead.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6642316858017254871?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/6642316858017254871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=6642316858017254871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6642316858017254871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6642316858017254871'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/04/snowl-development-builds.html' title='Snowl development builds'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7502720403339773467</id><published>2009-04-07T00:24:00.000-07:00</published><updated>2009-04-07T00:48:33.423-07:00</updated><title type='text'>ISO simple open web image editor</title><content type='html'>Is there a simple open web image editor? I know about &lt;a href="http://www.pixlr.com/"&gt;Pixlr&lt;/a&gt;, &lt;a href="http://www.picnik.com/"&gt;Picnik&lt;/a&gt;, and &lt;a href="http://aviary.com/"&gt;Aviary&lt;/a&gt;, but those all use Flash. It seems like it should be possible to make one using &lt;a href="https://developer.mozilla.org/En/HTML/Canvas"&gt;Canvas&lt;/a&gt; and other modern open web technologies.&lt;br /&gt;&lt;br /&gt;In addition to using it for simple photo manipulations, I'd like one that can be embedded into other applications, like &lt;a href="http://labs.mozilla.com/projects/firefox-personas/"&gt;Personas&lt;/a&gt; (to make it easy for users to make and refine their own personas) and image hosting sites (so users don't have to go to a separate website and import their images to edit them).&lt;br /&gt;&lt;br /&gt;In other words, I want the web-based image editing equivalent of Gecko+Firefox: a great open-source image rendering and editing engine with a flagship product that demonstrates its capabilities and an API for embedding it into other applications.&lt;br /&gt;&lt;br /&gt;Is there such a thing? Does anyone want to create one?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7502720403339773467?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/7502720403339773467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=7502720403339773467' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7502720403339773467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7502720403339773467'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/04/iso-simple-open-web-image-editor.html' title='ISO simple open web image editor'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-310923379342044586</id><published>2009-04-06T11:23:00.001-07:00</published><updated>2009-04-06T12:52:14.451-07:00</updated><title type='text'>The Extension Bootcamp Tutorial</title><content type='html'>A few weeks ago, as part of &lt;a href="http://labs.mozilla.com/"&gt;Mozilla Labs&lt;/a&gt;' &lt;a href="http://design-challenge.mozilla.com/spring09/"&gt;Design Challenge&lt;/a&gt;, I taught a tutorial on extension development. My goal was to impart the minimum necessary information to build a simple extension using modern best practices. I called it &lt;span style="font-style: italic;"&gt;Extension Bootcamp: Zero to "Hello world!" in 45 Minutes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The tutorial, which borrowed from other ones (including my ancient &lt;a href="https://developer.mozilla.org/en/Creating_a_Mozilla_Extension"&gt;Tinderstatus tutorial&lt;/a&gt;, the venerable &lt;a href="https://developer.mozilla.org/en/Building_an_Extension"&gt;Building an Extension&lt;/a&gt;, and the new &lt;a href="https://developer.mozilla.org/En/Firefox_addons_developer_guide"&gt;Firefox addons developer guide&lt;/a&gt;), covered:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;what extensions are, what they can do, and what they're made of;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;how to configure your development environment on Windows, Mac OS X, or Linux;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;how to construct an extension, including required files and directory structure;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;how to package and test your extension;&lt;/li&gt;&lt;li&gt;a simple extension that inserts XUL into the main browser window via an overlay, styles it with CSS, listens for and responds to a DOM event on it using JavaScript, and localizes its strings with both a DTD and a properties file.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It explicitly excluded:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;archiving chrome files into a JAR archive (valuable for large, popular, and stable extensions, but not worth the added complexity for the rest);&lt;/li&gt;&lt;li&gt;developing XPCOM components (most extensions should use JavaScript modules instead);&lt;/li&gt;&lt;li&gt;putting CSS/image files into a separate skin package (Firefox doesn't ship with two themes, which was the original impetus for segregating these files thusly, and most extensions don't support third-party themes, so this is unnecessary).&lt;/li&gt;&lt;/ul&gt;To conserve time, I didn't cover:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;developing JavaScript modules;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;accessing XPCOM components;&lt;/li&gt;&lt;li&gt;using tools and documentation to introspect and learn Mozilla code and APIs.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Developing a Firefox extension is pretty complicated, since there are so many different pieces to it, and the tutorial ended up taking two hours, including time for the students to practice each lesson on their own computers (for which my colleague &lt;a href="http://jonoscript.wordpress.com/"&gt;Jono&lt;/a&gt;'s assistance in fielding questions was invaluable).&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://design-challenge.mozilla.com/spring09/index.html#extension_bootcamp"&gt;video of the tutorial&lt;/a&gt;, edited down to 1.5 hours, as well as the &lt;a href="http://people.mozilla.com/%7Emyk/bootcamp/"&gt;slides and accompanying files&lt;/a&gt; are available. If I had time to work more on this, I'd expand it to include the essential topics I didn't cover. I'd also update the &lt;a href="https://developer.mozilla.org/en/Building_an_Extension"&gt;Building an Extension&lt;/a&gt; tutorial to adopt the pedagogy of this one. If you'd like to do either of those things, please do!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-310923379342044586?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/310923379342044586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=310923379342044586' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/310923379342044586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/310923379342044586'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/04/extension-bootcamp-tutorial.html' title='The Extension Bootcamp Tutorial'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8481225304758219196</id><published>2009-03-31T10:18:00.002-07:00</published><updated>2009-04-01T11:28:10.060-07:00</updated><title type='text'>Personas in Thunderbird</title><content type='html'>Huang Yaoquan recently &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=483743"&gt;contributed a patch&lt;/a&gt; to make Personas work in Thunderbird! Here's Thunderbird with the &lt;a href="http://www.getpersonas.com/store/gallery/persona/3/3/33"&gt;Groovy Blue persona&lt;/a&gt; selected:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-1-708661.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 339px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-1-708655.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The patch requires a Thunderbird 3 beta, and it landed after the cutoff for the Personas 1.0 release, so it's not in the version on AMO, but it is in the &lt;a href="http://people.mozilla.com/%7Emyk/personas/dist/personas-dev.xpi"&gt;latest development build&lt;/a&gt;, so give that one a spin if you're developmentally inclined, and provide feedback in the &lt;a href="https://labs.mozilla.com/forum/?CategoryID=18"&gt;discussion forums&lt;/a&gt; or by &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;component=Personas"&gt;filing bugs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8481225304758219196?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/8481225304758219196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=8481225304758219196' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8481225304758219196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8481225304758219196'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/03/personas-in-thunderbird.html' title='Personas in Thunderbird'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4985739686493851286</id><published>2009-03-25T18:23:00.000-07:00</published><updated>2009-04-01T11:35:23.551-07:00</updated><title type='text'>JSON JS module for Firefox 3.0/3.5 API compatibility</title><content type='html'>&lt;p&gt;I've written a &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/JSON.js" class="external text" title="http://hg.mozdev.org/jsmodules/file/tip/JSON.js" rel="nofollow"&gt;JSON module&lt;/a&gt; to wrap the incompatible Firefox 3.0 and 3.5 JSON APIs, presenting the 3.5 API on both versions of Firefox, which is useful for extensions that support them both. Import this module to parse and stringify JSON in both 3.0 and 3.5 without having to check the host application's version each time. &lt;/p&gt;&lt;p&gt;Note: don't import this into the global namespace! If you do, you'll hork native Firefox 3.0 code that expects the 3.0 API. Instead, import it into your own object like this: &lt;/p&gt; &lt;pre style="border: 1px solid rgb(136, 136, 136); padding: 5px; background-color: rgb(221, 221, 221); color: rgb(0, 0, 0);"&gt;let MyExtension = {&lt;br /&gt;JSON: null,&lt;br /&gt;...&lt;br /&gt;};&lt;br /&gt;Components.utils.import("chrome://myextension/modules/JSON.js", MyExtension);&lt;br /&gt;// Now MyExtension.JSON is an object implementing the Firefox 3.5 JSON API.&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;The module also works in Thunderbird 3.0, which uses Firefox 3.5's API (although there's no need to use it for an extension that only supports Thunderbird 3.0). I use it in &lt;a href="http://labs.mozilla.com/projects/firefox-personas/"&gt;Personas&lt;/a&gt;, which supports both Firefox 3.0 and 3.5 as well as Thunderbird 3.0.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Firefox 3.5 JSON API is documented in the Mozilla Developer Center article &lt;a href="https://developer.mozilla.org/En/Using_JSON_in_Firefox" class="external text" title="https://developer.mozilla.org/En/Using_JSON_in_Firefox" rel="nofollow"&gt;Using JSON in Firefox&lt;/a&gt;. This JSON module is documented on Mozilla Labs' &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules"&gt;JS Modules wiki page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4985739686493851286?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/4985739686493851286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=4985739686493851286' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4985739686493851286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4985739686493851286'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/03/json-js-module-for-firefox-3035-api.html' title='JSON JS module for Firefox 3.0/3.5 API compatibility'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2096866215127809719</id><published>2009-03-18T18:32:00.000-07:00</published><updated>2009-03-18T19:18:17.145-07:00</updated><title type='text'>Merging with Mercurial 1.0 and Meld</title><content type='html'>In an &lt;a href="http://www.melez.com/mykzilla/2008/06/merging-with-mercurial-and-meld.html"&gt;earlier post&lt;/a&gt;, I described my experience merging changes with Mercurial 0.9.5 and Meld 1.1.5.1 on Ubuntu 8.04.&lt;br /&gt;&lt;br /&gt;Things have changed in Ubuntu 8.10, which ships Mercurial 1.0.1. Now Meld displays your version of the file on the left, the other version on the right, and the base version (from which yours and the other are descended) in the middle.&lt;br /&gt;&lt;br /&gt;Here it is handling the &lt;a href="http://hgbook.red-bean.com/hgbookch3.html#x7-600003.2"&gt;&lt;span style="font-style: italic;"&gt;Merging conflicting changes&lt;/span&gt; example&lt;/a&gt; from the &lt;a href="http://hgbook.red-bean.com/hgbook.html"&gt;hg book&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-717708.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 176px;" src="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-717703.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Your job is to reconcile the conflicts between your version on the left and the other version on the right, turning your version on the left into the result of the reconciliation, which you then save to your working directory.&lt;br /&gt;&lt;br /&gt;I understand why it can be useful to show the base version, and I think it's ok to use the same pane to show both your version and the final result (although kdiff3 provides a fourth pane beneath these three for the latter, which seems better).&lt;br /&gt;&lt;br /&gt;But I don't understand why the base version is in the middle, given that one's primary task in this situation is to compare the differences between the two versions on either side of the window, copying changes from one to the other as needed. Putting another file in the middle just gets in the way of that process (which is presumably why kdiff3 puts the base version on the left and your version in the middle according to the screenshot in the aforementioned example in the hg book).&lt;br /&gt;&lt;br /&gt;In fact, I frequently find myself starting a merge by copying the other version of the file into the base version in its entirety. That destroys my ability to refer to the base version, but it places the other version and my version side by side, at which point it's much easier to compare the two and edit my version accordingly:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-2-746096.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 176px;" src="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-2-746085.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But maybe I'm missing the point or misusing the tool, and there's some valid reason for the way Mercurial uses Meld. Can someone tell me what it is?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2096866215127809719?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/2096866215127809719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=2096866215127809719' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2096866215127809719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2096866215127809719'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/03/merging-with-mercurial-10-and-meld.html' title='Merging with Mercurial 1.0 and Meld'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-644793084211281747</id><published>2009-02-04T17:48:00.001-08:00</published><updated>2009-02-04T19:27:24.446-08:00</updated><title type='text'>A XULRunner-Based Unit Test Harness</title><content type='html'>&lt;h3&gt;Prologue&lt;/h3&gt;After finding a couple bugs in the &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#Observers"&gt;Observers JS module&lt;/a&gt; recently, I looked around for a simple test harness to exercise it and other &lt;a href="http://wiki.mozilla.org/Labs/JS_Modules"&gt;JS modules&lt;/a&gt;. &lt;a href="http://labs.mozilla.com/projects/weave/"&gt;Weave&lt;/a&gt;'s (based on &lt;a href="https://developer.mozilla.org/en/Writing_xpcshell-based_unit_tests"&gt;Mozilla's xpcshell harness&lt;/a&gt;) seemed promising, although it has to hack around various limitations of &lt;a href="https://developer.mozilla.org/en/xpcshell"&gt;xpcshell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.toolness.com/"&gt;Atul Varma&lt;/a&gt; had suggested some time ago that a &lt;a href="https://developer.mozilla.org/en/XULRunner"&gt;XULRunner&lt;/a&gt;-based harness might make sense, so I decided to see if I could modify Weave's harness to run JS module tests using XULRunner instead of xpcshell.&lt;br /&gt;&lt;h3&gt;Act 1&lt;/h3&gt;That proved doable, although some details were tricky.  Sometimes I wondered whether I wouldn't have been better off reusing &lt;a href="https://developer.mozilla.org/en/Mochitest"&gt;MochiTest&lt;/a&gt;, although it's heavier weight.  Other times I wondered why I didn't find this &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=359830"&gt;bug about XULRunner-based unit tests&lt;/a&gt; sooner, although it's not clear that reusing the attachment in that bug would have been faster.&lt;br /&gt;&lt;br /&gt;In any case, I got the harness working with XULRunner and wrote an initial set of tests of the Observers module.  To run them, pull the &lt;code&gt;jsmodules&lt;/code&gt; repository, change to its &lt;code&gt;test/unit/&lt;/code&gt; subdirectory, and run &lt;code&gt;make&lt;/code&gt; with the location of your XULRunner executable (or set the &lt;code&gt;XULRUNNER_BIN&lt;/code&gt; environment variable to its location):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;hg clone https://hg.mozdev.org/jsmodules&lt;br /&gt;cd jsmodules/test/unit/&lt;br /&gt;make xulrunner_bin=/usr/bin/xulrunner&lt;/pre&gt;&lt;br /&gt;Since Firefox 3.0 comes with XULRunner, you can use any Firefox 3.0 (or newer) executable instead (except on Linux distros that ship Firefox as a XULRunner app--you have to use the XULRunner executable on those), like &lt;code&gt;/Applications/Firefox.app/Contents/MacOS/firefox-bin&lt;/code&gt; on Mac and &lt;code&gt;/c/Program\ Files/Mozilla\ Firefox/firefox.exe&lt;/code&gt; on Windows.&lt;br /&gt;&lt;h3&gt;Epilogue&lt;/h3&gt;Once I got the harness working for jsmodules, I backported it to Weave, where it mostly works, except that &lt;a href="http://hg.mozilla.org/labs/weave/file/de9f2a53bda4/src/IWeaveCrypto.idl#l101"&gt;IWeaveCrypto.generateKeypair&lt;/a&gt; (which calls &lt;a href="http://hg.mozilla.org/mozilla-central/file/6c1090838778/security/nss/lib/pk11wrap/pk11akey.c#l1188"&gt;PK11_GenerateKeyPair&lt;/a&gt;) fails, apparently because of &lt;code&gt;SEC_ERROR_TOKEN_NOT_LOGGED_IN&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;I have no idea why, but if you do, comment here or in &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476539"&gt;bug 476539&lt;/a&gt;, since that's the last blocker to Weave using this harness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-644793084211281747?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/644793084211281747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=644793084211281747' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/644793084211281747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/644793084211281747'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/02/xulrunner-based-unit-test-harness.html' title='A XULRunner-Based Unit Test Harness'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7249977648066146146</id><published>2009-02-04T17:44:00.000-08:00</published><updated>2009-02-04T19:25:20.651-08:00</updated><title type='text'>Observers JS Module Improvements</title><content type='html'>I've updated the &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#Observers"&gt;Observers JS module&lt;/a&gt; with a number of changes.  In particular, it's now possible to specify a &lt;span style="font-style: italic;"&gt;this&lt;/span&gt; object when adding an observer that is a method, so instead of doing this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let MyObserver = {&lt;br /&gt;  onFoo: function(subject) {...},&lt;br /&gt;  onBar: function(subject) {...},&lt;br /&gt;  onBaz: function(subject) {...},&lt;br /&gt;  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),&lt;br /&gt;  observe: function(subject, topic, data) {&lt;br /&gt;    switch(topic) {&lt;br /&gt;      case "foo":&lt;br /&gt;        this.onFoo(subject);&lt;br /&gt;        break;&lt;br /&gt;      case "bar":&lt;br /&gt;        this.onBar(subject);&lt;br /&gt;        break;&lt;br /&gt;      case "baz":&lt;br /&gt;        this.onBaz(subject);&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Observers.add("foo", MyObserver);&lt;br /&gt;Observers.add("bar", MyObserver);&lt;br /&gt;Observers.add("baz", MyObserver);&lt;/pre&gt;&lt;br /&gt;You can do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let MyObserver = {&lt;br /&gt;  onFoo: function(subject) {...},&lt;br /&gt;  onBar: function(subject) {...},&lt;br /&gt;  onBaz: function(subject) {...}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Observers.add("foo", MyObserver.onFoo, MyObserver);&lt;br /&gt;Observers.add("bar", MyObserver.onBar, MyObserver);&lt;br /&gt;Observers.add("baz", MyObserver.onBaz, MyObserver);&lt;/pre&gt;&lt;br /&gt;Other changes include a couple of bug fixes and some backwards-incompatible API improvements.  See the &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#Observers"&gt;documentation&lt;/a&gt; for all the details (including steps to update from the previous version of the module).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7249977648066146146?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/7249977648066146146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=7249977648066146146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7249977648066146146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7249977648066146146'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/02/observers-js-module-improvements.html' title='Observers JS Module Improvements'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4220389101602206157</id><published>2009-01-09T17:55:00.000-08:00</published><updated>2009-01-09T18:01:18.152-08:00</updated><title type='text'>Snowl Roadmap</title><content type='html'>Based on Snowl's potential &lt;a title="futures" href="http://www.melez.com/mykzilla/2009/01/with-snowl-0.html" id="i8p2"&gt;futures&lt;/a&gt;, and in line with its &lt;a title="principles" href="http://www.melez.com/mykzilla/2009/01/snowl-principles.html" id="eaif"&gt;principles&lt;/a&gt;, I've put together a &lt;a title="roadmap" href="https://wiki.mozilla.org/Labs/Snowl/Roadmap" id="c3z4"&gt;roadmap&lt;/a&gt; for its next three releases (beyond the imminent 0.2 release).&lt;br /&gt;&lt;br /&gt;Generally, I'm aiming for six week development cycles that are that ambiguous mixture of date-, feature set-, and quality-driven, so the goal is to hit the target date with high quality implementations of the specified set of features.  But work may be pushed to later releases or the schedule extended as appropriate.&lt;br /&gt;&lt;br /&gt;Each cycle has a theme on which I'll focus my efforts, and I'll publish regular preview releases, which will be numbered with consecutive "pre[n]" suffixes (f.e. 0.3pre1, 0.3pre2).&lt;br /&gt;&lt;br /&gt;Most of the work on the roadmap is stuff I'm planning to do myself, although it also lists tasks that other developers have expressed an interest in tackling.  And it's ambitious, so I probably won't get to all of these tasks (although I'll probably do other things that come up along the way).&lt;br /&gt;&lt;br /&gt;If you want to do something with Snowl, whether or not it's on the roadmap, &lt;a title="check out the source code" href="http://hg.mozilla.org/labs/snowl/" id="zhgx"&gt;check out the source code&lt;/a&gt;  and go for it! (And &lt;a title="let me know what you're doing" href="https://labs.mozilla.com/forum/?CategoryID=27" id="yg-x"&gt;let us know what you're doing&lt;/a&gt;  so others don't duplicate your work.)&lt;br /&gt;&lt;br /&gt;Caveat: nothing is written in stone, it's the best laid plans of mice and men, take it with a grain of salt, etc.  Among other things, this roadmap doesn't account for time I may spend working on other projects, nor am I any better than other hackers at estimating the time it takes to do work I haven't already done.  And the farther out the roadmap goes, the fuzzier its plans.&lt;br /&gt;&lt;br /&gt;Also, your suggestions are welcome.  Are you missing something from the roadmap?  Is there something on it that shouldn't be there? &lt;a title="your suggestions are welcome" href="https://labs.mozilla.com/forum/?CategoryID=27" id="f17m"&gt;Let us know!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The latest version lives on the Mozilla wiki at &lt;span&gt;&lt;a title="https://wiki.mozilla.org/Labs/Snowl/Roadmap" href="https://wiki.mozilla.org/Labs/Snowl/Roadmap" id="oqbd"&gt;https://wiki.mozilla.org/Labs/Snowl/Roadmap&lt;/a&gt;&lt;/span&gt;.  Currently, it looks like this:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Priorities&lt;br /&gt;&lt;/h3&gt;&lt;span&gt;As with Firefox development &lt;/span&gt;(f.e. with &lt;a title="Firefox 3.1 features" href="https://wiki.mozilla.org/Firefox3.1/Features" id="r3.t"&gt;Firefox 3.1 features&lt;/a&gt;)&lt;span&gt;, Snowl tasks are prioritized.  For Snowl, the fuzzy prioritization scheme is:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;P1: really want&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P2: want&lt;/li&gt;&lt;li&gt;P3: nice to have&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Releases&lt;/h3&gt;These are the target release dates for the imminent 0.2 release and the three releases after that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;0.2: Monday, January 12&lt;/li&gt;&lt;li&gt;0.3: Monday, March 9&lt;/li&gt;&lt;li&gt;0.4: Monday, April 20&lt;/li&gt;&lt;li&gt;0.5: Tuesday, May 26&lt;/li&gt;&lt;/ul&gt;(Note: The 0.3 cycle is eight weeks long to accommodate twoish weeks of vacation I have planned in January and February.)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;0.3: simpler and smarter&lt;br /&gt;&lt;/h3&gt; &lt;h4&gt;Feeds&lt;/h4&gt; &lt;ul&gt;&lt;li&gt;P1 expose feeds from frecent (frequent + recent) websites [atul]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P1 pick a feed automatically from among feeds with equivalent content&lt;/li&gt;&lt;li&gt;P1 let users subscribe to feeds by entering the location of a website&lt;/li&gt;&lt;li&gt;P2 automatically subscribe to feeds in live bookmarks [atul]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P2 automatically discard old feed items and tweets&lt;/li&gt;&lt;li&gt;P2 automatically determine how often to refresh feeds&lt;/li&gt;&lt;li&gt;P2 let users specify how long to retain feed items and tweets&lt;/li&gt;&lt;/ul&gt;      &lt;br /&gt;&lt;h4&gt;Twitter&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 support replying to messages&lt;/li&gt;&lt;li&gt; P2 support direct messages (private messages to specific users)&lt;/li&gt;&lt;li&gt;P2 automatically subscribe to Twitter account in browser history&lt;br /&gt;&lt;/li&gt;&lt;li&gt;  P3 shorten long URLs when composing messages&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Architecture/Extensibility&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 simplify composition of messaging service implementations from Source and Target prototypes&lt;/li&gt;&lt;/ul&gt;   &lt;br /&gt;&lt;h4&gt;Misc&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 split collections view into resizable accounts/people sections [alta88]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P1 support email protocols [alta88]&lt;/li&gt;&lt;li&gt;P2 integrate Snowl into Thunderbird&lt;/li&gt;&lt;li&gt;P2 organize river view into editions&lt;/li&gt;&lt;li&gt;P3 use JS templates to build stream, river views&lt;/li&gt;&lt;/ul&gt;     &lt;br /&gt;&lt;h3&gt;0.4: people and extensibility&lt;br /&gt;&lt;/h3&gt;&lt;h4&gt;People&lt;/h4&gt;&lt;ul&gt;&lt;li&gt; P1 add a person-centric view&lt;/li&gt;&lt;li&gt;P1 automatically associate identities that represent the same person&lt;/li&gt;&lt;li&gt;P1 let users associate identities that represent the same person&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;        &lt;br /&gt;&lt;h4&gt;Extensibility&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 optimize database schema for sparse/custom attributes (f.e. username for Twitter, website URI for feeds)&lt;/li&gt;&lt;li&gt;P2 move OPML import/export processing into messaging service connectors so they can provide custom attributes (f.e. username for Twitter)&lt;/li&gt;&lt;li&gt;P2 compose subscription dialog from messaging service connector-specific overlays&lt;/li&gt;&lt;li&gt;P3 factor out common functionality from Feed and Twitter implementations into Source and Target prototypes&lt;/li&gt;&lt;/ul&gt;           &lt;br /&gt;&lt;h4&gt;Conversations&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;P2 derive conversations from message metadata&lt;/li&gt;&lt;li&gt;P2 display messages in the contexts of the conversations to which they belong&lt;/li&gt;&lt;/ul&gt;  &lt;br /&gt;&lt;h4&gt;Misc&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;P2 add a wordle-like view of messages&lt;/li&gt;&lt;/ul&gt;  &lt;br /&gt;&lt;h3&gt;0.5: broader horizons&lt;br /&gt;&lt;/h3&gt;&lt;h4&gt;Feed Conversations&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;P1 retrieve comments on feed items automatically&lt;/li&gt;&lt;li&gt; P2 enable users to post comments on feed items&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;People&lt;/h4&gt;&lt;ul&gt;&lt;li&gt; P1 consume contact info from Portable Contacts service providers&lt;/li&gt;&lt;li&gt; P2 provide contact info to Portable Contacts consumers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Misc&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 support several additional messaging services/social networks&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;P2 support categorization of accounts and messages via tagging&lt;/li&gt;&lt;li&gt;P2 synchronize subscriptions to a cloud datastore&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P3 synchronize all message data to a cloud datastore&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4220389101602206157?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/4220389101602206157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=4220389101602206157' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4220389101602206157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4220389101602206157'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/01/snowl-roadmap.html' title='Snowl Roadmap'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3542775603962603803</id><published>2009-01-08T21:34:00.000-08:00</published><updated>2009-01-08T21:52:39.238-08:00</updated><title type='text'>Snowl Principles</title><content type='html'>Over the course of working on Snowl, I've established a set of principles to guide its development.  They're aspirational, but they have many practical ramifications.  And while the current implementation doesn't embody them yet by a long shot, I expect it conform more and more closely to them over time.&lt;br /&gt;&lt;br /&gt;The principles are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;feeds are a transport format, not a feature;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;people and conversations are first-class objects;&lt;/li&gt;&lt;li&gt;one app can satisfy a broad range of users;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;searching is better than pre-categorization;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;browser features are useful for messaging;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a messaging app is a platform.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;  feeds are a transport format, not a feature&lt;br /&gt;&lt;/h3&gt; &lt;div style="text-align: left;"&gt;Feeds are currently presented in many application interfaces (including Firefox's) as a user-facing feature of the web.  But feeds are data formats defining generic mechanisms for syndicating content.  They're designed to be machine-readable, not human-consumable, and interfaces that expose them directly are often too technical, like the way websites publish both RSS and Atom feeds and Firefox asks users to pick between them (as aptly &lt;a title="noted by Atul" href="http://www.toolness.com/wp/?p=158" id="lnw:"&gt;described by Atul Varma&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Treating feeds as a transport format means that rather than exposing them directly, Snowl should use them internally to give users a way to do the things they want to do, like find out when a website changes or keep up with what their friends are doing on the web.&lt;br /&gt;&lt;br /&gt;So when a website provides RSS and Atom feeds of the same content, Snowl should pick a format instead of asking the user to do so.  And when a website provides comment feeds, Snowl shouldn't expose those feeds to users, it should just show the conversations embodied in them to the users following that site.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;The same is true for feeds provided by social network APIs.  For example, the &lt;a title="Last.fm API" href="http://www.last.fm/api" id="srf3"&gt;Last.fm API&lt;/a&gt; exposes the listening habits of its users' friends as individual feeds, but Snowl shouldn't make users manage individual feed subscriptions when they're really just interested in what their friends are listening to.  Instead, it should present those individual feeds as &lt;span style="font-style: italic;"&gt;Last.fm friend updates&lt;/span&gt;, separating them by friend--not feed--where appropriate.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt; people and conversations are first-class objects&lt;br /&gt;&lt;/h3&gt; There's no unique identifier for people on the internet.  We each have an ever growing number of email addresses, usernames, and nicks on various websites, social networks, and messaging services.  But we think of each person's various identifiers as representing the same being, and so should Snowl, so its users never have to figure out how they received a message (email, blog post, tweet, etc.) when looking for one from a particular person.&lt;br /&gt;&lt;br /&gt;Also, context is crucial in conversations, and it's rarely obvious which message contains a particular portion of an extended conversation, so Snowl should let users interact with conversations rather than just their constituent messages, searching and browsing them as easily as they search and browse individual messages, and displaying messages in context.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;one app can satisfy a broad range of users&lt;/h3&gt; Most users don't want to configure their experience, they just want things to work.  And Snowl shouldn't force them to make unnecessary decisions.  In fact, Snowl should need no preferences, because it always knows exactly what its users want.&lt;br /&gt;&lt;br /&gt;Realistically, that's not possible, but the closer we can get, the better (while not trying to be too smart in ways that frustrate users).  For example, a number of feed readers let users specify how often to update each feed.  But this is information that it's possible to derive based on how often a feed is updated.  There's no reason for Snowl to expose this question to users who shouldn't need to answer it.&lt;br /&gt;&lt;br /&gt;Some users, however, do want to configure their experience.  Others have unusual needs.  And some have great ideas about how to create better experiences.&lt;br /&gt;&lt;br /&gt;Firefox has shown that it's possible to build an application that satisfies all these users, and Snowl should follow in its pawsteps, using hidden preferences, subtle affordances, extensibility APIs, and other techniques to make it possible for those users to customize and modify Snowl to their hearts' content, while keeping the interface simple for everyone else.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;searching is better than pre-categorization&lt;/h3&gt; Traditional messaging interfaces use pre-categorization to help you find messages.  But the evolution of web search engines has shown that it's faster and simpler in many cases to simply search for what you want.  Snowl should make it trivial to find any message quickly by searching for its content or metadata.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;browser features are useful for messaging&lt;/h3&gt; Web browsers have developed a variety of features over the last dozenish years to make it easier for users to browse, find, save, and recall the web pages they visit.  Snowl should take advantage of all these innovations to make accessing messages better, utilizing features like tabs for opening multiple messages, bookmarks to flag them for later reference, tagging for categorization, and the awesomebar for searching them.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; a messaging app is a platform&lt;/h3&gt; Snowl was never intended to be just a feed and tweet reader.  Feeds and Twitter are just two popular services with open APIs whose disparate kinds of messaging were good testbeds for early architectural and user experience decisions.  Communication over the internet is evolving rapidly, and messaging apps have to evolve alongside it.&lt;br /&gt;&lt;br /&gt;The best way to do that is to make Snowl a platform that others can extend to new messaging services and user experiences.&lt;br /&gt;&lt;br /&gt;So Snowl comprises a datastore of subscriptions, messages, and people; a set of APIs for retrieving, storing, and sending messages; and a variety of interfaces for accessing them.  And it should employ a flexible schema (like &lt;a title="CouchDB" href="http://couchdb.apache.org/" id="m9tk"&gt;CouchDB&lt;/a&gt;'s) to make it trivial to extend its data model; expose an API that makes it easy to add support for new messaging services; and provide useful primitives for building innovative new ways of looking at messages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3542775603962603803?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/3542775603962603803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=3542775603962603803' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3542775603962603803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3542775603962603803'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/01/snowl-principles.html' title='Snowl Principles'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2146340664228072900</id><published>2009-01-07T23:59:00.000-08:00</published><updated>2009-01-08T00:00:58.038-08:00</updated><title type='text'>Snowl Futures</title><content type='html'>&lt;div class="moz-text-html" lang="x-western"&gt;      With Snowl 0.2 almost out the door, I've been thinking about potential directions for its future development, and I've identified three possibilities.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Message Reader&lt;/h3&gt; The first is the idea that started the project: a message reader integrated into the browser, which uses Firefox features like tabs, bookmarks, history, the awesomebar, the sidebar, etc. to present messages.&lt;br /&gt;&lt;br /&gt;Internet users live in their browsers, and much of their messaging is web-centric (feed items, tweets, messages sent via social networks, etc.).  A message reader built into Firefox can aggregate those messages, store them locally (where their recipients have control over them), and provide a unified interface to them no matter where they come from and what protocols delivered them.&lt;br /&gt;&lt;br /&gt;And it can help users uncover unknown sources of useful messages, like feeds from websites they frequent and updates from social networks to which they belong.&lt;br /&gt;&lt;br /&gt;Snowl's biggest weakness relative to web-based alternatives (webmail, web feed readers, messaging apps built into social networks) is that it doesn't persist messages to a remote datastore, so users can't access them from anywhere.  But it certainly could do so using &lt;a href="http://labs.mozilla.com/projects/weave/"&gt;Weave&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, or some other technology for synchronization to cloud storage.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Social Activity Tracker&lt;/h3&gt; The second potential direction for Snowl is for it to utilize feeds and social network APIs to keep users  informed about what their friends are doing on the web.  In other words, it could take up the mantle of &lt;a href="https://wiki.mozilla.org/Labs/The_Coop"&gt;The Coop&lt;/a&gt;, the idea for a Firefox-based social activity tracker that labs prototyped in 2007.&lt;br /&gt;&lt;br /&gt;Just as with a message reader, a social activity tracker built into the browser would be in a unique position to expose useful updates to users across all of the sites they visit.&lt;br /&gt;&lt;br /&gt;Snowl would need some modifications to behave in this way.  In particular, it would need to get better at retrieving and aggregating lists of friends across multiple social networks.  But its architecture is already well-suited to the task in a number of respects, since social activity is frequently exposed through messaging protocols, which Snowl has been designed to support.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Better Feed Reader for Thunderbird&lt;/h3&gt; The third potential is to integrate Snowl into Thunderbird as a better feed reader for that application.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt; Thunderbird's current feed reading feature is based on the &lt;a title="Forumzilla" href="http://forumzilla.mozdev.org/" id="hyy-"&gt;Forumzilla&lt;/a&gt; feed reading extension I originally started working on in 1999/2000, and it suffers from a number of limitations and archaicisms.  For example, it confines its messages to a separate "server" within the Thunderbird folder pane, and it provides only the traditional three-pane interface for reading them.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Snowl integrated into Thunderbird could break feed messages out of their "separate folder" ghetto, integrating them into the stream of messages from other sources, and provide a variety of useful views on them.  And it would bring Twitter messaging to Thunderbird, too.  Plus, Snowl developers would gain exposure to some of the interesting and innovative work happening in Thunderbird these days, which could benefit Snowl on Firefox.&lt;br /&gt;&lt;br /&gt;The biggest challenge would be integrating Snowl into the very different capabilities provided by Thunderbird.  Recent improvements to Thunderbird's extensibility and support for browser-like features such as tabs will make this easier, however.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I think all these directions have potential and are worth exploring.  And while I'm going to remain focused primarily on Snowl as a message reader for now, I'll be conducting experiments along the way to learn more about the other possibilities.  I'd also love to see other folks tackling them, so if you're interested in doing so, &lt;a title="let's talk" href="https://labs.mozilla.com/forum/?CategoryID=27" id="ivhp"&gt;let's talk&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2146340664228072900?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/2146340664228072900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=2146340664228072900' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2146340664228072900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2146340664228072900'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/01/with-snowl-0.html' title='Snowl Futures'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3729536929165976830</id><published>2009-01-07T23:47:00.001-08:00</published><updated>2009-01-07T23:55:52.359-08:00</updated><title type='text'>Snowl 0.2rc2</title><content type='html'>The second release candidate of Snowl 0.2 is now available.  This version fixes a few minor issues discovered in the first release candidate.  Barring the discovery of additional issues that would block the release, this is the build that will be released as Snowl 0.2.&lt;br /&gt;&lt;br /&gt;Give it a try, and let us know what you think.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;&lt;a href="https://people.mozilla.com/%7Emyk/snowl/snowl-test.xpi"&gt;Install Snowl&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl Central&lt;/a&gt; | &lt;a href="https://labs.mozilla.com/forum/?CategoryID=27"&gt;Discussion Forum&lt;/a&gt; | &lt;a href="ircs://irc.mozilla.org:6697/%23labs"&gt;IRC Channel&lt;/a&gt; | &lt;a href="https://bugzilla.mozilla.org/buglist.cgi?product=Mozilla%20Labs&amp;amp;component=Snowl"&gt;Bug Reports&lt;/a&gt; | &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;component=Snowl"&gt;Report a Bug&lt;/a&gt; | &lt;a href="http://hg.mozilla.org/labs/snowl/"&gt;Source Code&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3729536929165976830?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/3729536929165976830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=3729536929165976830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3729536929165976830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3729536929165976830'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2009/01/snowl-02rc2.html' title='Snowl 0.2rc2'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5551553385873069575</id><published>2008-12-31T17:37:00.001-08:00</published><updated>2008-12-31T19:44:23.729-08:00</updated><title type='text'>Snowl 0.2rc1</title><content type='html'>The first release candidate of Snowl 0.2 is now available.&amp;nbsp; This version sports no new features relative to the &lt;a  href="http://www.melez.com/mykzilla/2008/11/third-and-final-preview-of-snowl-02.html"&gt;last preview release&lt;/a&gt;, just a bunch of bug fixes.&amp;nbsp; Barring the discovery of unexpected issues, this is the build that will be released as Snowl 0.2.&lt;br&gt; &lt;br&gt; Notable bug fixes include:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;an updated visual design with platform-specific icons for feeds and people;&lt;/li&gt;   &lt;li&gt;Firefox is more responsive when Snowl is refreshing sources and building views;&lt;/li&gt;   &lt;li&gt;multiple Twitter accounts no longer occasionally get confused for each other;&lt;/li&gt;   &lt;li&gt;views update more consistently when messages and sources are added or removed;&lt;/li&gt;   &lt;li&gt;the river and stream views always show messages in the order they were received.&lt;/li&gt; &lt;/ul&gt; As of this release, I've also switched to hosting Snowl development on the same infrastructure (source code repository, bug tracker, discussion forums, etc.) as other labs projects to make it easier for participants in those other projects to contribute to Snowl.&lt;br&gt; &lt;br&gt; Give the release candidate a try, and let me know what you think.&lt;br&gt; &lt;br&gt; &lt;b&gt;&lt;a href="https://people.mozilla.com/%7Emyk/snowl/snowl-test.xpi"&gt;Install Snowl&lt;/a&gt;&lt;/b&gt;&lt;br&gt; &lt;br&gt; &lt;a href="https://labs.mozilla.com/forum/?CategoryID=27"&gt;Discussion Forum&lt;/a&gt; | &lt;a  href="https://bugzilla.mozilla.org/buglist.cgi?product=Mozilla%20Labs&amp;amp;amp;component=Snowl"&gt;Bug Reports&lt;/a&gt; | &lt;a  href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;amp;component=Snowl"&gt;Report a Bug&lt;/a&gt; | &lt;a href="http://hg.mozilla.org/labs/snowl/"&gt;Source Code&lt;/a&gt;&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5551553385873069575?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/5551553385873069575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=5551553385873069575' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5551553385873069575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5551553385873069575'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/12/snowl-02rc1.html' title='Snowl 0.2rc1'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8223228565666214935</id><published>2008-11-30T22:35:00.000-08:00</published><updated>2008-11-30T22:50:54.661-08:00</updated><title type='text'>simpler, easier string bundle API</title><content type='html'>In the process of improving localizability in &lt;a href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl&lt;/a&gt; today, I put together a &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/StringBundle.js"&gt;StringBundle JS module&lt;/a&gt; to make it easier to access string bundles from other JS modules (and JS XPCOM components and chrome JS, for that matter).&lt;br /&gt;&lt;br /&gt;The module has a simple, easy-to-use API with a single &lt;code&gt;get&lt;/code&gt; method that retrieves both plain and formatted strings:&lt;br /&gt;&lt;pre style="border: 1px dashed black; padding: 5px; overflow: auto; color: black; background-color: lightgrey;"&gt;let strings = new StringBundle("chrome://example/locale/strings.properties");&lt;br /&gt;let foo = strings.get("foo");&lt;br /&gt;let barFormatted = strings.get("bar", [arg1, arg2]);&lt;br /&gt;for each (let string in strings.getAll())&lt;br /&gt;  dump(string.key + " = " + string.value + "\n");&lt;br /&gt;&lt;/pre&gt;  However, it also supports the API for the &lt;a href="http://mxr.mozilla.org/mozilla/source/toolkit/content/widgets/stringbundle.xml"&gt;stringbundle XBL binding&lt;/a&gt; to make it easier to move from the binding to the module:&lt;br /&gt;&lt;pre style="border: 1px dashed black; padding: 5px; overflow: auto; color: black; background-color: lightgrey;"&gt;let strings = &lt;strike&gt;document.getElementById("myStringBundleElement");&lt;/strike&gt;&lt;br /&gt;              new StringBundle("chrome://example/locale/strings.properties");&lt;br /&gt;let foo = strings.getString("foo");&lt;br /&gt;let barFormatted = strings.getFormattedString("bar", [arg1, arg2]);&lt;br /&gt;let enumerator = strings.strings;&lt;br /&gt;while (enumerator.hasMoreElements()) {&lt;br /&gt;  let string = enumerator.getNext().QueryInterface(Ci.nsIPropertyElement);&lt;br /&gt;  dump(string.key + " = " + string.value + "\n");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; The &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/StringBundle.js"&gt;module is available&lt;/a&gt; with the other &lt;a href="http://hg.mozdev.org/jsmodules/file/tip"&gt;useful JS modules&lt;/a&gt; in the jsmodules project on mozdev.org.  Documentation is embedded inside the module as well as &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#StringBundle"&gt;on the project wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8223228565666214935?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/8223228565666214935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=8223228565666214935' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8223228565666214935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8223228565666214935'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/11/simpler-easier-string-bundle-api.html' title='simpler, easier string bundle API'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2447306625868099694</id><published>2008-11-26T23:14:00.000-08:00</published><updated>2008-11-26T23:54:15.088-08:00</updated><title type='text'>Third (and Final) Preview of Snowl 0.2</title><content type='html'>I've pushed a new preview release of the next version of Snowl.  It includes an updated design for the "river of news" view with many improvements suggested by &lt;a href="http://blog.mozilla.com/faaborg/"&gt;Alex Faaborg&lt;/a&gt; and others.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-1-789444.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 251px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-1-789440.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It also supports sending tweets in addition to receiving them via an interface built into the river and stream views.  Just click on the "write a message" icon to expose it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-4-778682.png"&gt;&lt;img style="cursor: pointer; width: 222px; height: 204px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-4-778679.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And it supports multiple Twitter accounts (thanks to &lt;a href="http://weblogs.mozillazine.org/bz/"&gt;Boris Zbarsky&lt;/a&gt;, who helped resolve a final vexing issue with HTTP auth), so if you happen to have more than one, you can keep track of all of them:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-6-769961.png"&gt;&lt;img style="cursor: pointer; width: 182px; height: 75px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-6-769955.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;alta88 also contributed a bunch of improvements and bug fixes, including a context menu for sources with some common commands (like Refresh and Unsubscribe).  And &lt;a href="http://www.toolness.com/wp/"&gt;Atul Varma&lt;/a&gt; contributed a patch that will make it easier to plug in support for other sources of messages.&lt;br /&gt;&lt;br /&gt;Finally, I fixed a big performance bug that was slowing down database queries for message content linearly with the database's growth in size.  It looked something like this (courtesy &lt;a href="http://flickr.com/photos/beneneuman/"&gt;beneneuman&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/big-fat-bug-779029.jpg"&gt;&lt;img style="cursor: pointer; width: 358px; height: 400px;" src="http://www.melez.com/mykzilla/uploaded_images/big-fat-bug-779023.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This preview is feature complete, which means no additional features will land in 0.2.  From here on out, it's only important bug fixes, minor look and feel enhancements, localization support, and other low risk/polish/completeness issues until the release of 0.2.&lt;br /&gt;&lt;br /&gt;So try it out, and let me know if you run into any of those kinds of problems (or any others, for that matter, as 0.3 development will be gearing up soon).&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="http://www.blogger.com/img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8397/"&gt;Install&lt;/a&gt; | &lt;a href="http://snowl.mozdev.org/drupal/forum/1"&gt;Discuss&lt;/a&gt; | &lt;a href="irc://moznet/%23labs"&gt;Chat&lt;/a&gt; | &lt;a href="https://www.mozdev.org/bugs/buglist.cgi?product=snowl"&gt;Bug Reports&lt;/a&gt; | &lt;a href="https://www.mozdev.org/bugs/enter_bug.cgi?product=snowl"&gt;Report a Bug&lt;/a&gt; | &lt;a href="http://hg.mozdev.org/snowl"&gt;Source Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Warning: this version is a primitive implementation with many bugs, and subsequent versions will include changes that break functionality and delete all your messages, making you start over from scratch.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2447306625868099694?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/2447306625868099694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=2447306625868099694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2447306625868099694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2447306625868099694'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/11/third-and-final-preview-of-snowl-02.html' title='Third (and Final) Preview of Snowl 0.2'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4689189991894147367</id><published>2008-11-19T12:02:00.000-08:00</published><updated>2008-11-19T12:16:50.738-08:00</updated><title type='text'>making OS X stop prompting me for my wireless password</title><content type='html'>I've long had problems automatically reconnecting to a certain WPA Enterprise wireless network from my MacBook Pro running Mac OS X 10.5.&lt;br /&gt;&lt;br /&gt;Despite deleting the network from System Preferences &gt; Network &gt; AirPort &gt; Advanced... &gt; Preferred Networks, deleting its password from the login and System keychains using Applications &gt; Utilities &gt; Keychain Access, and then saving the network and credentials anew, the OS would prompt me to reenter my password for it every time I reconnected to it.&lt;br /&gt;&lt;br /&gt;Some digging around on the web suggested that folks having a variety of Mac OS X wireless networking problems can sometimes solve them by deleting various configuration files, including /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist.&lt;br /&gt;&lt;br /&gt;I checked that file, and strangely, it listed a very old password for that wireless network.  Turning off AirPort, deleting that file (I made a backup first just in case), and turning AirPort back on has resolved the problem.  I can now reconnect to the network repeatedly (including after a reboot) without being prompted for my password.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4689189991894147367?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/4689189991894147367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=4689189991894147367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4689189991894147367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4689189991894147367'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/11/making-os-x-stop-prompting-me-for-my.html' title='making OS X stop prompting me for my wireless password'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5208510983881943124</id><published>2008-11-17T22:54:00.000-08:00</published><updated>2008-11-18T11:21:12.737-08:00</updated><title type='text'>news: links to Google Groups</title><content type='html'>(&lt;strong&gt;Note: updated with a more reliable representation of the link.&lt;/strong&gt;)&lt;br /&gt;(&lt;strong&gt;Note: updated again to support news:&amp;lt;newsgroup-name&gt; links.&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;Here's an obscure hack.&lt;br /&gt;&lt;br /&gt;Firefox 3 supports web protocol handlers (f.e. sending mailto: links to Gmail), while Google Groups archives Usenet.  But as far as I can tell, Google Groups doesn't support news: links, even though Firefox can send them to it.  It does, however, support retrieving messages by their IDs or newsgroup names, which news: links contain.&lt;br /&gt;&lt;br /&gt;So how could we get Google Groups to load news: links passed to it by Firefox?&lt;br /&gt;&lt;br /&gt;The solution is to pass them to an intermediary that extracts the IDs/names from the links and passes them to Google Groups.  Here's a data: URL that does that:&lt;br /&gt;&lt;pre style="border: 1px solid black; padding: 5px; overflow: auto; background-color: rgb(204, 204, 204); color: black;"&gt;data:text/html,\&lt;br /&gt;  &amp;lt;html&gt;&amp;lt;body&gt;&amp;lt;script&gt;\&lt;br /&gt;    var url = '%s';\&lt;br /&gt;    var stripPrefix = /^news:(\\/\\/[^\\/]+\\/)?/;\&lt;br /&gt;    if (/@/.test(url))\&lt;br /&gt;      window.location = 'http://groups.google.com/groups?selm='+url.replace(stripPrefix, '');\&lt;br /&gt;    else\&lt;br /&gt;      window.location = 'http://groups.google.com/group/'+url.replace(stripPrefix, '');\&lt;br /&gt;  &amp;lt;/script&gt;&amp;lt;/body&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, it isn't easy to configure Firefox to use this URL as the news: protocol handler.  Manually hacking &lt;a href="http://kb.mozillazine.org/MimeTypes.rdf"&gt;mimeTypes.rdf&lt;/a&gt; is most unpleasant, while &lt;a href="https://developer.mozilla.org/en/DOM/window.navigator.registerProtocolHandler"&gt;window.navigator.registerProtocolHandler&lt;/a&gt; only registers http(s): URLs.&lt;br /&gt;&lt;br /&gt;But it's possible to construct a javascript: URL that does the same thing registerProtocolHandler does, namely call the &lt;a href="http://mxr.mozilla.org/mozilla/source/uriloader/exthandler/nsIHandlerService.idl"&gt;handler service&lt;/a&gt; and register the handler with it directly.&lt;br /&gt;&lt;br /&gt;The only trick is that you have to enter and run it in the Error Console, which has chrome privileges.  Otherwise the URL won't have the privileges it needs to register the handler.&lt;br /&gt;&lt;br /&gt;Here's a javascript: URL that registers the handler:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid black; padding: 5px; background-color: rgb(204, 204, 204); color: black;"&gt;javascript: var Cc = Components.classes; var Ci = Components.interfaces; var handler = Cc['@mozilla.org/uriloader/web-handler-app;1'].createInstance(Ci.nsIWebHandlerApp); handler.name = 'Google Groups'; handler.uriTemplate = "data:text/html, &amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script&amp;gt; var url = '%s'; var stripPrefix = /^news:(\\/\\/[^\\/]+\\/)?/; if (/@/.test(url)) window.location = 'http://groups.google.com/groups?selm='+url.replace(stripPrefix, ''); else window.location = 'http://groups.google.com/group/'+url.replace(stripPrefix, ''); &amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"; var eps = Cc['@mozilla.org/uriloader/external-protocol-service;1'].getService(Ci.nsIExternalProtocolService); var handlerInfo = eps.getProtocolHandlerInfo('news'); handlerInfo.possibleApplicationHandlers.appendElement(handler, false); handlerInfo.alwaysAskBeforeHandling = true; var hs = Cc['@mozilla.org/uriloader/handler-service;1'].getService(Ci.nsIHandlerService); hs.store(handlerInfo); window.location = "data:text/html, &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;The news: link handler for Google Groups has been installed. Try it with these links:&amp;lt;/p&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news:mozilla.support.firefox'&amp;gt;news:mozilla.support.firefox&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news://news.mozilla.org/mozilla.support.firefox'&amp;gt;news://news.mozilla.org/mozilla.support.firefox&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news:37604264.65F502CD@netscape.com'&amp;gt;news:37604264.65F502CD@netscape.com&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news://news.mozilla.org/37604264.65F502CD@netscape.com'&amp;gt;news://news.mozilla.org/37604264.65F502CD@netscape.com&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/body&amp;gt;"; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To use it, copy the URL, open the Error Console (Tools &gt; Error Console or Ctrl/Command+Shift+J), paste the URL into the evaluation field, and press the Evaluate button.&lt;br /&gt;&lt;br /&gt;Once you've done that, try it out with these links:&lt;ul&gt;&lt;li&gt;&lt;a href='news:mozilla.support.firefox'&gt;news:mozilla.support.firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='news://news.mozilla.org/mozilla.support.firefox'&gt;news://news.mozilla.org/mozilla.support.firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='news:37604264.65F502CD@netscape.com'&gt;news:37604264.65F502CD@netscape.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='news://news.mozilla.org/37604264.65F502CD@netscape.com'&gt;news://news.mozilla.org/37604264.65F502CD@netscape.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;When you click one, Firefox will ask you what you want to do with the link, and Google Groups should be an option on the list.&lt;br /&gt;&lt;br /&gt;For the curious, here's a nicely formatted version of the code inside that javascript: URL, which is based on &lt;a href="http://mxr.mozilla.org/mozilla/ident?i=WCCR_addProtocolHandlerButtonCallback"&gt;WCCR_addProtocolHandlerButtonCallback&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px solid black; padding: 5px; overflow: auto; background-color: rgb(204, 204, 204); color: black;"&gt;javascript:&lt;br /&gt;var Cc = Components.classes;&lt;br /&gt;var Ci = Components.interfaces;&lt;br /&gt;&lt;br /&gt;var handler = Cc['@mozilla.org/uriloader/web-handler-app;1'].createInstance(Ci.nsIWebHandlerApp);&lt;br /&gt;handler.name = 'Google Groups';&lt;br /&gt;handler.uriTemplate = "data:text/html,\&lt;br /&gt;  &amp;lt;html&gt;&amp;lt;body&gt;&amp;lt;script&gt;\&lt;br /&gt;    var url = '%s';\&lt;br /&gt;    var stripPrefix = /^news:(\\/\\/[^\\/]+\\/)?/;\&lt;br /&gt;    if (/@/.test(url))\&lt;br /&gt;      window.location = 'http://groups.google.com/groups?selm='+url.replace(stripPrefix, '');\&lt;br /&gt;    else\&lt;br /&gt;      window.location = 'http://groups.google.com/group/'+url.replace(stripPrefix, '');\&lt;br /&gt;  &amp;lt;/script&gt;&amp;lt;/body&gt;&amp;lt;/html&gt;";&lt;br /&gt;&lt;br /&gt;var eps = Cc['@mozilla.org/uriloader/external-protocol-service;1'].getService(Ci.nsIExternalProtocolService);&lt;br /&gt;var handlerInfo = eps.getProtocolHandlerInfo('news');&lt;br /&gt;handlerInfo.possibleApplicationHandlers.appendElement(handler, false);&lt;br /&gt;handlerInfo.alwaysAskBeforeHandling = true;&lt;br /&gt;&lt;br /&gt;var hs = Cc['@mozilla.org/uriloader/handler-service;1'].getService(Ci.nsIHandlerService);&lt;br /&gt;hs.store(handlerInfo);&lt;br /&gt;&lt;br /&gt;window.location = "data:text/html,\&lt;br /&gt;  &amp;lt;body&gt;\&lt;br /&gt;    &amp;lt;p&gt;The news: link handler for Google Groups has been installed.\&lt;br /&gt;       Try it with these links:&amp;lt;/p&gt;\&lt;br /&gt;    &amp;lt;ul&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news:mozilla.support.firefox'&gt;news:mozilla.support.firefox&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news://news.mozilla.org/mozilla.support.firefox'&gt;news://news.mozilla.org/mozilla.support.firefox&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news:37604264.65F502CD@netscape.com'&gt;news:37604264.65F502CD@netscape.com&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news://news.mozilla.org/37604264.65F502CD@netscape.com'&gt;news://news.mozilla.org/37604264.65F502CD@netscape.com&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;    &amp;lt;/ul&gt;\&lt;br /&gt;  &amp;lt;/body&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course Google Groups could make this hack moot by simply supporting news: links and protocol handler registration natively.  For info on how to do that, Google Groups, see the news: URL standard in &lt;a href="http://tools.ietf.org/html/rfc1738"&gt;RFC 1738&lt;/a&gt; and &lt;a href="http://www.eyrie.org/%7Eeagle/nntp/drafts/"&gt;these subsequent IETF drafts&lt;/a&gt;, then read the Devmo docs on &lt;a href="https://developer.mozilla.org/en/DOM/window.navigator.registerProtocolHandler"&gt;window.navigator.registerProtocolHandler&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5208510983881943124?l=www.melez.com%2Fmykzilla' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/5208510983881943124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18929277&amp;postID=5208510983881943124' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5208510983881943124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5208510983881943124'/><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/11/news-links-to-google-groups.html' title='news: links to Google Groups'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02701243523134449463'/></author><thr:total>9</thr:total></entry></feed>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               