<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='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' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-18929277</atom:id><lastBuildDate>Wed, 14 Apr 2010 16:28:41 +0000</lastBuildDate><title>mykzilla</title><description>Myk Melez working on Mozilla projects</description><link>http://www.melez.com/mykzilla/</link><managingEditor>noreply@blogger.com (Myk)</managingEditor><generator>Blogger</generator><openSearch:totalResults>92</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-6583468542975089893</guid><pubDate>Sat, 06 Mar 2010 07:03:00 +0000</pubDate><atom:updated>2010-03-05T23:03:40.516-08:00</atom:updated><title>This blog has moved</title><description>&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;</description><link>http://www.melez.com/mykzilla/2010/03/this-blog-has-moved.html</link><author>noreply@blogger.com (Myk)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-7015776887411907934</guid><pubDate>Wed, 18 Nov 2009 01:26:00 +0000</pubDate><atom:updated>2009-11-17T17:26:50.807-08:00</atom:updated><title>The Skinny on Raindrop's Mailing List Extensions</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/11/skinny-on-raindrops-mailing-list.html</link><author>noreply@blogger.com (Myk)</author><thr:total>7</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-7740719470656815276</guid><pubDate>Wed, 04 Nov 2009 23:58:00 +0000</pubDate><atom:updated>2009-11-04T15:58:03.687-08:00</atom:updated><title>Building/Releasing Personas</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/11/buildingreleasing-personas.html</link><author>noreply@blogger.com (Myk)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-3631027799136148808</guid><pubDate>Tue, 13 Oct 2009 02:32:00 +0000</pubDate><atom:updated>2009-10-12T19:32:19.699-07:00</atom:updated><title>Makefile for building/distributing extensions</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/10/makefile-for-buildingdistributing.html</link><author>noreply@blogger.com (Myk)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-6089802576414913288</guid><pubDate>Sat, 29 Aug 2009 14:54:00 +0000</pubDate><atom:updated>2009-08-29T08:10:43.751-07:00</atom:updated><title>Personas for Email Messages</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/08/personas-for-email-messages.html</link><author>noreply@blogger.com (Myk)</author><thr:total>11</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-1287699979278620781</guid><pubDate>Thu, 23 Apr 2009 15:15:00 +0000</pubDate><atom:updated>2009-04-23T08:19:39.021-07:00</atom:updated><title>The Problems With Pagination</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/04/problems-with-pagination.html</link><author>noreply@blogger.com (Myk)</author><thr:total>10</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-7974255395631974196</guid><pubDate>Fri, 17 Apr 2009 01:17:00 +0000</pubDate><atom:updated>2009-04-16T19:24:48.355-07:00</atom:updated><title>syntaxes for iterating arrays in JavaScript</title><description>&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;</description><link>http://www.melez.com/mykzilla/2009/04/syntaxes-for-iterating-arrays-in.html</link><author>noreply@blogger.com (Myk)</author><thr:total>16</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-6609413790681181898</guid><pubDate>Thu, 09 Apr 2009 22:00:00 +0000</pubDate><atom:updated>2009-04-09T15:00:00.977-07:00</atom:updated><title>Snowl Integration with Places</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/04/snowl-integration-with-places.html</link><author>noreply@blogger.com (Myk)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-6642316858017254871</guid><pubDate>Tue, 07 Apr 2009 23:09:00 +0000</pubDate><atom:updated>2009-04-09T16:25:17.120-07:00</atom:updated><title>Snowl development builds</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/04/snowl-development-builds.html</link><author>noreply@blogger.com (Myk)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-7502720403339773467</guid><pubDate>Tue, 07 Apr 2009 07:24:00 +0000</pubDate><atom:updated>2009-04-07T00:48:33.423-07:00</atom:updated><title>ISO simple open web image editor</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/04/iso-simple-open-web-image-editor.html</link><author>noreply@blogger.com (Myk)</author><thr:total>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-310923379342044586</guid><pubDate>Mon, 06 Apr 2009 18:23:00 +0000</pubDate><atom:updated>2009-04-06T12:52:14.451-07:00</atom:updated><title>The Extension Bootcamp Tutorial</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/04/extension-bootcamp-tutorial.html</link><author>noreply@blogger.com (Myk)</author><thr:total>8</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-8481225304758219196</guid><pubDate>Tue, 31 Mar 2009 17:18:00 +0000</pubDate><atom:updated>2009-04-01T11:28:10.060-07:00</atom:updated><title>Personas in Thunderbird</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/03/personas-in-thunderbird.html</link><author>noreply@blogger.com (Myk)</author><thr:total>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-4985739686493851286</guid><pubDate>Thu, 26 Mar 2009 01:23:00 +0000</pubDate><atom:updated>2009-04-01T11:35:23.551-07:00</atom:updated><title>JSON JS module for Firefox 3.0/3.5 API compatibility</title><description>&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;</description><link>http://www.melez.com/mykzilla/2009/03/json-js-module-for-firefox-3035-api.html</link><author>noreply@blogger.com (Myk)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-2096866215127809719</guid><pubDate>Thu, 19 Mar 2009 01:32:00 +0000</pubDate><atom:updated>2009-03-18T19:18:17.145-07:00</atom:updated><title>Merging with Mercurial 1.0 and Meld</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/03/merging-with-mercurial-10-and-meld.html</link><author>noreply@blogger.com (Myk)</author><thr:total>8</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-644793084211281747</guid><pubDate>Thu, 05 Feb 2009 01:48:00 +0000</pubDate><atom:updated>2009-02-04T19:27:24.446-08:00</atom:updated><title>A XULRunner-Based Unit Test Harness</title><description>&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;</description><link>http://www.melez.com/mykzilla/2009/02/xulrunner-based-unit-test-harness.html</link><author>noreply@blogger.com (Myk)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-7249977648066146146</guid><pubDate>Thu, 05 Feb 2009 01:44:00 +0000</pubDate><atom:updated>2009-02-04T19:25:20.651-08:00</atom:updated><title>Observers JS Module Improvements</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/02/observers-js-module-improvements.html</link><author>noreply@blogger.com (Myk)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-4220389101602206157</guid><pubDate>Sat, 10 Jan 2009 01:55:00 +0000</pubDate><atom:updated>2009-01-09T18:01:18.152-08:00</atom:updated><title>Snowl Roadmap</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/01/snowl-roadmap.html</link><author>noreply@blogger.com (Myk)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-3542775603962603803</guid><pubDate>Fri, 09 Jan 2009 05:34:00 +0000</pubDate><atom:updated>2009-01-08T21:52:39.238-08:00</atom:updated><title>Snowl Principles</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/01/snowl-principles.html</link><author>noreply@blogger.com (Myk)</author><thr:total>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-2146340664228072900</guid><pubDate>Thu, 08 Jan 2009 07:59:00 +0000</pubDate><atom:updated>2009-01-08T00:00:58.038-08:00</atom:updated><title>Snowl Futures</title><description>&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;</description><link>http://www.melez.com/mykzilla/2009/01/with-snowl-0.html</link><author>noreply@blogger.com (Myk)</author><thr:total>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-3729536929165976830</guid><pubDate>Thu, 08 Jan 2009 07:47:00 +0000</pubDate><atom:updated>2009-01-07T23:55:52.359-08:00</atom:updated><title>Snowl 0.2rc2</title><description>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;</description><link>http://www.melez.com/mykzilla/2009/01/snowl-02rc2.html</link><author>noreply@blogger.com (Myk)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-5551553385873069575</guid><pubDate>Thu, 01 Jan 2009 01:37:00 +0000</pubDate><atom:updated>2008-12-31T19:44:23.729-08:00</atom:updated><title>Snowl 0.2rc1</title><description>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;</description><link>http://www.melez.com/mykzilla/2008/12/snowl-02rc1.html</link><author>noreply@blogger.com (Myk)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-8223228565666214935</guid><pubDate>Mon, 01 Dec 2008 06:35:00 +0000</pubDate><atom:updated>2008-11-30T22:50:54.661-08:00</atom:updated><title>simpler, easier string bundle API</title><description>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;</description><link>http://www.melez.com/mykzilla/2008/11/simpler-easier-string-bundle-api.html</link><author>noreply@blogger.com (Myk)</author><thr:total>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-2447306625868099694</guid><pubDate>Thu, 27 Nov 2008 07:14:00 +0000</pubDate><atom:updated>2008-11-26T23:54:15.088-08:00</atom:updated><title>Third (and Final) Preview of Snowl 0.2</title><description>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;</description><link>http://www.melez.com/mykzilla/2008/11/third-and-final-preview-of-snowl-02.html</link><author>noreply@blogger.com (Myk)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-4689189991894147367</guid><pubDate>Wed, 19 Nov 2008 20:02:00 +0000</pubDate><atom:updated>2008-11-19T12:16:50.738-08:00</atom:updated><title>making OS X stop prompting me for my wireless password</title><description>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;</description><link>http://www.melez.com/mykzilla/2008/11/making-os-x-stop-prompting-me-for-my.html</link><author>noreply@blogger.com (Myk)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-18929277.post-5208510983881943124</guid><pubDate>Tue, 18 Nov 2008 06:54:00 +0000</pubDate><atom:updated>2008-11-18T11:21:12.737-08:00</atom:updated><title>news: links to Google Groups</title><description>(&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;</description><link>http://www.melez.com/mykzilla/2008/11/news-links-to-google-groups.html</link><author>noreply@blogger.com (Myk)</author><thr:total>9</thr:total></item></channel></rss>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      