<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title />
	
	<link>http://www.salsitasoft.com</link>
	<description />
	<lastBuildDate>Wed, 08 Feb 2012 14:45:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/justdiscourse/browsing" /><feedburner:info uri="justdiscourse/browsing" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>There is War!</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/RUkPhJ-Y9C8/</link>
		<comments>http://www.salsitasoft.com/blog/2012/02/06/there-is-war/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 19:33:30 +0000</pubDate>
		<dc:creator>Arne Seib</dc:creator>
				<category><![CDATA[Just Browsing]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1986</guid>
		<description><![CDATA[No, I don&#8217;t want to write this article. Not at all. But I have to. I recently had to look up a phrase that didn&#8217;t mean anything to me so far, the phrase &#8220;flame war&#8221;. Wikipedia defines &#8220;flaming&#8221; as &#8220;hostile and insulting interaction between Internet users&#8221;. So when I learned the meaning of &#8220;flame wars&#8221; my first thought was: &#8220;Ok, I understand, it has something to do with religion.&#8221; Usually discussions between religions are hostile and often insulting, and in all cases they state that one party is right and the other is wrong. Regarding religions this might be the only way of discussing things, since religions don&#8217;t have solid facts that can be contributed as arguments. They are based [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.salsitasoft.com/wp-content/uploads/2012/02/religious.jpg"><img class="alignnone size-medium wp-image-1998" title="religious" src="http://www.salsitasoft.com/wp-content/uploads/2012/02/religious-300x208.jpg" alt="" width="300" height="208" /></a></p>
<p>No, I don&#8217;t want to write this article. Not at all. But I have to.</p>
<p>I recently had to look up a phrase that didn&#8217;t mean anything to me so far, the phrase &#8220;flame war&#8221;. Wikipedia defines &#8220;flaming&#8221; as &#8220;hostile and insulting interaction between Internet users&#8221;. So when I learned the meaning of &#8220;flame wars&#8221; my first thought was: &#8220;Ok, I understand, it has something to do with religion.&#8221; Usually discussions between religions are hostile and often insulting, and in all cases they state that one party is right and the other is wrong. Regarding religions this might be the only way of discussing things, since religions don&#8217;t have solid facts that can be contributed as arguments. They are based on beliefs and opinions, and only some religions derive these rules and opinions from observations and experiences (usually the ones that don&#8217;t go into flame wars).</p>
<p>Unfortunately the flame war I was dragged in was not about religion, it was about programming &#8211; but it was fought how only religious discussions are fought. I was pretty startled when I found myself in the middle of such a war, although I never was a religious person! Thank God(!) a wise man from a foreign country (Great Britain) knocked on my door and stopped me before someone could chop off my head, so here a short warning to you all: You can&#8217;t win with those people. Don&#8217;t get into a fight. Shrug your shoulders and mind your own business.</p>
<p>But what was all this about? Well&#8230; let&#8217;s see.</p>
<p>There is a very basic fear that all animals share: The fear of the unknown or the incomprehensible.</p>
<p>If you are the father or mother of a child and you belong to a ethnic minority you might know what I&#8217;m talking about. Your child looks different. It may speak a bit different. Maybe it plays different games. Some of your child&#8217;s classmates might be curious and ask questions like &#8220;Why do you always wear these funny rings around your neck?&#8221; or &#8220;What does your name mean?&#8221;. Others (usually the ones that are more bound to instincts than to thinking) might react with rejection or even aggression. They follow their fundamental fear, and, in the case of aggression, also the rule &#8220;Kill it before it kills us&#8221;. Okay, that might be a bit strong, but basically it goes like &#8220;I don&#8217;t know what the foreign child is doing, so I don&#8217;t like it, it might be (no, it <strong>is</strong>!) evil.&#8221; So in the end non-understanding results in rejection.</p>
<p>And what does that have to do with programming?.</p>
<p>Sometimes programmers behave like children &#8212; or animals, or bigots. Sad, but true. For example when they state that &#8220;their&#8221; programming language is the only language and all others are stupid. You might then ask them &#8220;And why you say feature-A of language-A is evil?&#8221;. And you get the answer &#8212; usually after some deeper digging &#8212; &#8220;Because I don&#8217;t like it&#8221;, which then (again after some discussion about the benefits of feature-A) turns out to mean &#8220;I don&#8217;t (totally) understand it&#8221;. This is sad. Not only because it doesn&#8217;t do justice to those &#8220;other languages&#8221;, but also because these people are limiting themselves and their advancement.</p>
<p>Also a very childish behaviour is their effort to find something where other languages are not as good as their own favourite language. When they find it, they behave like children who are bullying another child with a disability. &#8220;Haha, you have to indicate the type of a variable, I can pass anything to my function! Retype, retype!&#8221; A good programmer on the other hand will always be interested in finding the best solution for his problem, and he will be excited to learn new techniques and features that allow him to get better, especially when he discovers the weaknesses of his own favourite language.</p>
<p>All in all this kind of informatics chauvinism or IT-racism is immature, self-limiting and results in unnecessary flame wars that have no winner.</p>
<p>To say it in religious words: The best way to get an impression of what God might really be is to have a look at as many religions as possible, because God is everything. Whenever you exclude something you won&#8217;t get the whole picture.</p>
<p>A small joke to finish this:</p>
<p>A priest, a minister, and a rabbi were all sitting at a table, finishing dinner and discussing theology. Suddenly an angel appeared before them. &#8220;I have been sent to grant each of you one wish,&#8221; he said. &#8220;Who will go first?&#8221;</p>
<p>The Catholic priest stood up. &#8220;I wish for the destruction of all Protestants!&#8221;</p>
<p>Then the Protestant minister bolted up. &#8220;I wish for the destruction of all Catholics!&#8221;</p>
<p>The rabbi kept seated, so the angel asked, &#8220;How about you? What do you wish for, rabbi?&#8221;</p>
<p>The rabbi answered, &#8220;Well, if you&#8217;re going to grant their wishes, I&#8217;ll just settle for another cup of coffee.&#8221;</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/RUkPhJ-Y9C8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2012/02/06/there-is-war/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2012/02/06/there-is-war/</feedburner:origLink></item>
		<item>
		<title>Lexical Dispatch in JavaScript</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/S_JORmij-Pw/</link>
		<comments>http://www.salsitasoft.com/blog/2012/01/29/lexical-dispatch-in-javascript/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 20:20:10 +0000</pubDate>
		<dc:creator>Tomas Brambora</dc:creator>
				<category><![CDATA[Technical Articles]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1953</guid>
		<description><![CDATA[Using a big switch statement to fake polymorphism is evil. Everybody knows that. But how do you get rid of it? Let&#8217;s say you&#8217;ve got a method that receives a string describing some state (&#8220;normal&#8221;, &#8220;error&#8221; etc.). And depending on the value of that string (state) you want to react. If you ask around, an OOP afficionado might tell you to replace the switch with classes and use polymorphism. Yeah, well, that&#8217;s not the greatest of solutions &#8211; you just replace an ugly statement with a handful of ugly classes. Functional programming fan would tell you to use pattern matching (A.K.A. &#8220;case statement on steroids&#8221;), which would work nice&#8230;only you&#8217;re stuck with an imperative language. Tough luck. So, isn&#8217;t there [...]]]></description>
			<content:encoded><![CDATA[<p>Using a big switch statement to fake polymorphism is evil. Everybody knows that. But how do you get rid of it?</p>
<p>Let&#8217;s say you&#8217;ve got a method that receives a string describing some state (&#8220;normal&#8221;, &#8220;error&#8221; etc.). And depending on the value of that string (state) you want to react.</p>
<p>If you ask around, an OOP afficionado might tell you to replace the switch with classes and use polymorphism. Yeah, well, that&#8217;s not the greatest of solutions &#8211; you just replace an ugly statement with a handful of ugly classes. Functional programming fan would tell you to use pattern matching (A.K.A. &#8220;case statement on steroids&#8221;), which would work nice&#8230;only you&#8217;re stuck with an imperative language. Tough luck. So, isn&#8217;t there another way?</p>
<p>No, there isn&#8217;t.</p>
<p>Nah, just kidding. Turns out we can use a neat little design pattern familiarly reffered to as &#8220;lexical dispatch&#8221; (see <a href="http://wordaligned.org/articles/lexical-dispatch-in-python">this article</a> about a similar pattern in Python).</p>
<p>Observe:</p>
<pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee; font-size: 12px; border: 1px dashed #999999; line-height: 14px; padding: 5px; overflow: auto; width: 100%;"><code>myDispatcher = {};

myDispatcher.dispatch = function (eventName /*, other args...*/ ) {
    // Get the handler.
    var handlerName = "handle" + _.string.capitalize(eventName.toLowerCase());
    var handler = this[handlerName];
    // Handle unknown event.
    if (!_.isFunction(handler)) {
        throw _.string.sprintf("ERROR: Handler for event %s not found!", eventName);
    }
    // Call the handler.
    handler.apply(this, _.tail(arguments));
}; 

myDispatcher.handleNormal = function(msg, details) {
    console.log(_.string.sprintf("Everything is %s...%", msg, details));
}; 

myDispatcher.handleError = function(msg, details) {
    console.log(_.string.sprintf("%s...%s", msg, details));
};

myDispatcher.dispatch("normal", "just, you know...fine");
myDispatcher.dispatch("error", "AAAAARHG!", "AAAAAAAAAAAARGH!");</code></pre>
<p>(We&#8217;re using <a href="http://documentcloud.github.com/underscore/">underscore.js</a> and <a href="http://epeli.github.com/underscore.string/">underscore.string.js</a> in the example).</p>
<p>The important piece is the myDispatcher.dispatch method. It takes any number of arguments, but the first one is a state string. We use it to construct the name of the handler that will be invoked for that particular state.</p>
<p>So:<br />
<strong>myDispatcher.dispatch(&#8220;normal&#8221;,&#8230;)</strong> is delegated to handleNormal.<br />
<strong>myDispatcher.dispatch(&#8220;error&#8221;,&#8230;)</strong> is delegated to handleError.<br />
<strong>myDispatcher.dispatch(&#8220;foo&#8221;,&#8230;)</strong> would be delegated to handleFoo.</p>
<p>If we want to add a new state, it&#8217;s as simple as adding a new method to myDispatcher. No more searching for that ugly case statement.</p>
<p>And a big boo-yah to static languages . <img src='http://www.salsitasoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/S_JORmij-Pw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2012/01/29/lexical-dispatch-in-javascript/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2012/01/29/lexical-dispatch-in-javascript/</feedburner:origLink></item>
		<item>
		<title>On Using Jasmine in xpcshell Tests.</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/-7MbCOluQoA/</link>
		<comments>http://www.salsitasoft.com/blog/2011/11/19/on-using-jasmine-in-xpcshell-tests/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 12:31:59 +0000</pubDate>
		<dc:creator>Tomas Brambora</dc:creator>
				<category><![CDATA[Technical Articles]]></category>
		<category><![CDATA[Tips & Tricks]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1862</guid>
		<description><![CDATA[Jasmine is a JavaScript framework for supporting behaviour-driven development in your projects. Like most JS frameworks, when used for client side development Jasmine expects an environment that meets certain conditions (e.g. it assumes the existence of a global window object). In Salsita, however, we&#8217;re in the business of creating browser add-ons &#8211; which happens to mean that most of the time, some of those conditions are not met. In the world of XUL-based Firefox add-ons, code is (or should be anyway) usually structured in code modules, which import each other and are themselves imported from the XUL window in a manner similar to HTML. This provides a nice way to encapsulate the logic into individual files. Furthemore, Firefox add-ons can [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<p><a href="http://pivotal.github.com/jasmine/">Jasmine</a> is a JavaScript framework for supporting <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">behaviour-driven development</a> in your projects.</p>
<p>Like most JS frameworks, when used for client side development Jasmine expects an environment that meets certain conditions (e.g. it assumes the existence of a global window object).</p>
<p>In Salsita, however, we&#8217;re in the business of creating browser add-ons &#8211; which happens to mean that most of the time, some of those conditions are not met.</p>
<p>In the world of XUL-based Firefox add-ons, code is (or should be anyway) usually structured in code modules, which import each other and are themselves imported from the XUL window in a manner similar to HTML. This provides a nice way to encapsulate the logic into individual files. Furthemore, Firefox add-ons can use a special console application, <a href="https://developer.mozilla.org/en/Writing_xpcshell-based_unit_tests">xpcshell</a>, that allows for relatively convenient (and more importantly &#8211; fast) automated testing of these modules. When it comes to BDD (and Jasmine in particular), however, there are some flies to be found in our agile testing ointment.</p>
<p>First, as has already been said, there is no global window object. That should come as no surprise, since, well, xpcshell is a console application. Luckily enough, when we go through Jasmine&#8217;s code, it is clear that we need just a handful of methods from the window object &#8211; namely those related to timers: <em>setTimeout</em>, <em>setInterval</em> and the respective clear* counterparts. Hence, the solution is easy &#8211; we make a fake window object and fob it off to Jasmine.</p>
<pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee; font-size: 12px; border: 1px dashed #999999; line-height: 14px; padding: 5px; overflow: auto; width: 100%;"><code>/**
 * Fake global window object and some global functions (used to allow us to
 * import scripts that require those). */
var EXPORTED_SYMBOLS = ["window", "setTimeout", "clearTimeout", "setInterval", "clearInterval"];
if (!Cc) var Cc = Components.classes;
if (!Cu) var Cu = Components.utils;
if (!Ci) var Ci = Components.interfaces;
var window = {
    document: {},
    location: {},
    setTimeout: setTimeout,
    setInterval: setInterval,
    clearTimeout: clearTimeout,
    clearinterval: clearInterval
};
var _timers = [];

function setTimer(fun, timeout, type) {
    var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
    _timers.push(timer);
    var event = {
        notify: function (timer) {
            fun();
        }
    };
    timer.initWithCallback(event, timeout, type);
    return timer;
}
function setTimeout(fun, timeout) {
    return setTimer(fun, timeout, Ci.nsITimer.TYPE_ONE_SHOT);
};

function setInterval(fun, timeout) {
    return setTimer(fun, timeout, Ci.nsITimer.TYPE_REPEATING_SLACK);
};

function clearTimeout(timer) {
    if (!timer) {
        return;
    }
    timer.cancel();
    var i = _timers.indexOf(timer);
    if (i & gt; = 0) {
        _timers.splice(_timers.indexOf(timer), 1);
    }
}
var clearInterval = clearTimeout; </code></pre>
<p>We&#8217;re going to import this fake window object in the <em>head_init.js</em> fixture file that is run before the tests in our test directory (in the newer Firefox versions, you have to specify the fixtures in the xpcshell.ini file).</p>
<p>An important point to note is that we do not want to use the standard <em>Component.utils.import</em> call to import Jasmine within our tests. Doing that would require changes to the library code, because JS code modules expect exported symbols to be specified explicitly using EXPORTED_SYMBOLS. Instead, we use <em>mozIJSSubScriptLoader</em> and load the library into the test scope (after importing the fake window object).</p>
<pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee; font-size: 12px; border: 1px dashed #999999; line-height: 14px; padding: 5px; overflow: auto; width: 100%;"><code>var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader);
loader.loadSubScript("resource://myAppId/frameworks/jasmine.js");
loader.loadSubScript("resource://myAppId/frameworks/jasmineReporter.js");</code></pre>
<p>Next, we create the alias so that <em>resource://&lt;addonid&gt;/</em> URLs map to the correct path (and the <em>Cu.import</em>s in our modules work when the code is run in xpcshell). The following snippet is taken from a <a href="https://developer.mozilla.org/en/JavaScript_code_modules/Using#Extending_resource:_URLs">recipe on MDC</a>.</p>
<pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee; font-size: 12px; border: 1px dashed #999999; line-height: 14px; padding: 5px; overflow: auto; width: 100%;"><code>file = do_get_file(".", false);
var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var resProt = ioService.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
var aliasURI = ioService.newFileURI(file);
resProt.setSubstitution("myAppId", aliasURI);</code></pre>
<p>And we&#8217;re almost there! The last thing is to make sure the BDD specs are actually run. Jasmine runs all the specs asynchronously, whereas xpcshell expects synchronous tests. That means if we don&#8217;t tell xpcshell to wait until the specs have finished, none of the specs will actually be run. Therefore, we use a little trick here.</p>
<pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee; font-size: 12px; border: 1px dashed #999999; line-height: 14px; padding: 5px; overflow: auto; width: 100%;"><code>// Initialize Jasmine BDD framework.
var jasmineEnv = jasmine.getEnv();
var reporter = new jasmine.ConsoleReporter(dump, function(runner) {
  var results = runner.results();
  if (results.failedCount &gt; 0) {
    // throw using xpcshell do_throw to report an error (and make the test fail).
    do_throw("Test failed");
  }
  // Inform xpcshell that we're done.
  do_test_finished();
}, false);
jasmineEnv.addReporter(reporter);
function runSpecs(specFun) {
  // Tell xpcshell that we're doing asynchronous stuff.
  do_test_pending();
  // Load the test suite.
  specFun();
  // Run the test specs.
  jasmineEnv.execute();
} </code></pre>
<p>The <em>runSpecs</em> function is to be called from the test_* files that contain the actual test code (the parameter is a wrapper function for the Jasmine test suite). It sets a &#8220;pending&#8221; flag that tells xpcshell we&#8217;re running something asynchronous here and it should not quit right away but rather wait for us to signal that we are done.</p>
<p>We&#8217;re using the reporter&#8217;s callback function to check whether all the specs have been run. If there were any failures, we call xpcshell&#8217;s <em>do_throw</em> to make the test fail (which quits the tests, so there&#8217;s no need to unset the pending flag). Otherwise, we just unset the flag and &#8211; we&#8217;re done!</p>
</div>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/-7MbCOluQoA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/11/19/on-using-jasmine-in-xpcshell-tests/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/11/19/on-using-jasmine-in-xpcshell-tests/</feedburner:origLink></item>
		<item>
		<title>Firefox: Product or Platform?</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/z52IkDo922o/</link>
		<comments>http://www.salsitasoft.com/blog/2011/10/13/firefox-product-or-platform/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 17:47:22 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Just Browsing]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[steve yegge]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1851</guid>
		<description><![CDATA[Steve Yegge&#8217;s sprawling Amazon vs. Google platform rant (linking to Hacker News as Steve has since pulled his original post) has finally spurred me to expand on something I wrote recently about Firefox: In essence, Mozilla wants to focus on creating the best browser possible. The distractions inherent in maintaining a platform for third-party developers (then XULRunner, now sophisticated extensions) undeniably detract from this goal. But what if being the best browser, in the sense of being truly differentiated from the competition, actually means that Firefox must be a great platform? In tackling the Chrome insurgent by seeking parity with its rapid release schedule, simple extension API, sparser user interface, process-isolated tabs and so forth, Firefox may be losing its strongest [...]]]></description>
			<content:encoded><![CDATA[<p>Steve Yegge&#8217;s <a href="http://news.ycombinator.com/item?id=3101876">sprawling Amazon vs. Google platform rant</a> (linking to Hacker News as Steve has since pulled his original post) has finally spurred me to expand on something <a href="http://www.salsitasoft.com/blog/2011/07/14/firefoxs-version-controversy-isnt-just-about-marketing-its-about-the-strategic-direction-of-the-company/">I wrote recently</a> about Firefox:</p>
<p style="padding-left: 30px;">In essence, Mozilla wants to focus on creating the best browser possible. The distractions inherent in maintaining a platform for third-party developers (then XULRunner, now sophisticated extensions) undeniably detract from this goal. But what if being the best browser, in the sense of being truly differentiated from the competition, actually means that Firefox must be a great platform? In tackling the Chrome insurgent by seeking parity with its rapid release schedule, simple extension API, sparser user interface, process-isolated tabs and so forth, Firefox may be losing its strongest reason for existing.</p>
<p>Firefox is underpinned by a remarkably flexible platform. Most of the core functionality of the browser is organized around components that can be accessed (usually from JavaScript as well as C++) via well-defined interfaces. The user interface is specified using a declarative markup language and can be modified almost arbitrarily using overlays that add, change or remove stuff. The component model resembles and is doubtless inspired by Microsoft, which has a muscular platform of its own (as Steve points out). The UI extensibility is far beyond anything I&#8217;ve seen in other desktop software.</p>
<p>The peerless extension ecosystem that has grown up around Firefox is a direct result of the strength of its platform. You can make Firefox do pretty much anything with an extension, including many things that the browser&#8217;s creators could never have imagined when they designed it. The platform is also the reason why many parties (present company included) have tried at various junctures to promote the platform-as-a-product known as XULRunner. Considering the scope of its ambitions, the platform seemed underutilized to them. This idea was considered and <a href="http://blog.lizardwrangler.com/2007/05/13/xul-and-xulrunner-investment/">eventually rejected</a> by Mozilla in 2007.</p>
<p>Various subsequent decisions and initiatives imply that Mozilla is now pursuing a path of &#8220;deplatformization&#8221; for Firefox: <a href="https://wiki.mozilla.org/Gecko:DeCOMtamination">deCOMtamination</a>, the <a href="https://developer.mozilla.org/en/Interfaces/About_Frozen_Interfaces">thawing</a> of all XPCOM interfaces, the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=656331">death blow</a> struck to binary XPCOM components and the new, much more limited <a href="https://addons.mozilla.org/en-US/developers/docs/sdk/1.1/">Add-on SDK</a>.</p>
<p>Granted, the Firefox platform faces many intimidating challenges. Inevitably, many interfaces could do with a redesign. XUL is proprietary and being overtaken by newer revisions of HTML. XBL is great when it works and baffling when it doesn&#8217;t, due to patchy error reporting. There is a general lack of good tools when compared to other modern software platforms. The macro-laden C++ syntax is ponderous and doesn&#8217;t make much use of the last 15 years of language innovations. More fundamentally, all the cool but unexpected extension functionality that hooks into relatively low-level platform features has put Firefox into a straightjacket that inhibits its evolution.</p>
<p>Killing off the platform is one solution. It&#8217;s hard not to be jealous of Chrome, a green-field development free of the shackles of third-party legacy code. Why not become more like Chrome then? Not a platform, just a damn good browser. Focus on responsiveness and minimalistic user interface design, arguably the main drivers of Chrome&#8217;s rise to 25% (or so) market share in only three years. Slim down the add-on SDK so that extension developers have enough rope to skip but not enough to hang themselves.</p>
<p>Perhaps this path will prove fruitful, but to me it&#8217;s hard to see how Chrome can be dethroned by chasing its tail. Firefox has a much stronger play to make: face the issues with the current platform head-on. Replace the XUL user interface with HTML 5. Develop and deploy tools on par with those available for iOS and .NET. Redesign interfaces that have proven inadequate (they&#8217;re mostly pretty good in my experience). Make a commitment to Firefox developers to converge on a set of stable, actively maintained and well-documented interfaces.</p>
<p>I won&#8217;t dwell on the arguments for why a strong platform is important. Steve Yegge makes a more compelling case in his 4500-odd words than I ever could. For Firefox the case has even more resonance because it represents a return to its platform-centric roots.</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/z52IkDo922o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/10/13/firefox-product-or-platform/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/10/13/firefox-product-or-platform/</feedburner:origLink></item>
		<item>
		<title>Firefox 7 and Browser Memory Consumption</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/i3GEqirth2U/</link>
		<comments>http://www.salsitasoft.com/blog/2011/09/28/firefox-7-and-browser-memory-consumption/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 07:58:18 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Industry News]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[memory consumption]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1844</guid>
		<description><![CDATA[Firefox 7 is out with an emphasis on improved memory consumption. Mozilla developer Nicholas Nethercote: Firefox 7 uses less memory than Firefox 6 (and 5 and 4): often 20% to 30% less, and sometimes as much as 50% less. In particular, Firefox 7?s memory usage will stay steady if you leave it running overnight, and it will free up more memory when you close many tabs. This sounds like real progress even if the figures cited seem a bit overblown, based as they are on an artificial scenario (opening 150 browser windows on a machine with 16Gb of RAM). Web pages take up RAM mainly because their in-memory representation (DOM) is large. Browsers with a lot of pages open unavoidably [...]]]></description>
			<content:encoded><![CDATA[<p>Firefox 7 is <a href="http://www.mozilla.org/en-US/firefox/7.0/releasenotes/">out</a> with an emphasis on improved memory consumption. Mozilla developer <a href="http://blog.mozilla.com/nnethercote/2011/08/09/firefox-7-is-lean-and-fast-2/">Nicholas Nethercote</a>:</p>
<p style="padding-left: 30px;">Firefox 7 uses less memory than Firefox 6 (and 5 and 4): often 20% to 30% less, and sometimes as much as 50% less. In particular, Firefox 7?s memory usage will stay steady if you leave it running overnight, and it will free up more memory when you close many tabs.</p>
<p>This sounds like real progress even if the figures cited seem a bit overblown, based as they are on an artificial scenario (opening 150 browser windows on a machine with 16Gb of RAM). Web pages take up RAM mainly because their in-memory representation (DOM) is large. Browsers with a lot of pages open unavoidably use a lot of memory (and I can attest personally that Chrome is no exception). It therefore makes sense to focus on areas where big improvements can be made, like freeing memory more quickly when pages are closed. Don&#8217;t expect memory usage to halve during real world usage, but it should improve significantly if you open and close pages a lot (and who doesn&#8217;t?).</p>
<p>The other memory-related improvement is to memory consumption when the browser is left idle. Apparently this is related primary to a <a href="http://gregor-wagner.com/?p=27">subtle bug</a> introduced in Firefox 4. As a result, JavaScript garbage collection was not being triggered in some cases (especially on machines with limited RAM).</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/i3GEqirth2U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/09/28/firefox-7-and-browser-memory-consumption/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/09/28/firefox-7-and-browser-memory-consumption/</feedburner:origLink></item>
		<item>
		<title>Wonder How Chrome is Growing Market Share? Ask Adobe</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/exwSqrcst-Q/</link>
		<comments>http://www.salsitasoft.com/blog/2011/09/23/wonder-how-chrome-is-growing-market-share-ask-adobe/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 07:43:08 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Just Browsing]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1833</guid>
		<description><![CDATA[Yesterday one of my colleagues started grumbling and swearing even more vociferously than usual. He had installed Adobe Flash in Firefox in order to test some changes to our website and claimed that Google Chrome had been installed as well. &#8220;Impossible,&#8221; I said. &#8220;Remember Google&#8217;s motto is Don&#8217;t Be Evil. They wouldn&#8217;t do anything as sneaky as that.&#8221; Nonetheless, my curiosity was piqued and I googled around (oh, the irony!) to see if anyone had reported something similar. Sure enough, this immediately turned up some mozillaZine forum posts and a blog entry by an outraged German blogger. I fired up a clean Windows virtual machine, installed Firefox, headed to the Adobe Flash Update page and &#8212; holy hound of hell! [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday one of my colleagues started grumbling and swearing even more vociferously than usual. He had installed Adobe Flash in Firefox in order to test some changes to our website and claimed that Google Chrome had been installed as well.</p>
<p>&#8220;Impossible,&#8221; I said. &#8220;Remember Google&#8217;s motto is Don&#8217;t Be Evil. They wouldn&#8217;t do anything as sneaky as that.&#8221;</p>
<p>Nonetheless, my curiosity was piqued and I googled around (oh, the irony!) to see if anyone had reported something similar. Sure enough, this immediately turned up some <a href="http://forums.mozillazine.org/viewtopic.php?f=7&amp;t=2251061">mozillaZine forum posts</a> and a <a href="http://mobilesociety.typepad.com/mobile_life/2011/09/outrage-adobe-flash-installs-chrome-during-security-update.html">blog entry</a> by an outraged German blogger. I fired up a clean Windows virtual machine, installed Firefox, headed to the Adobe Flash Update page and &#8212; holy hound of hell! &#8212; it turns out to be true:</p>
<p><a href="http://www.salsitasoft.com/wp-content/uploads/2011/09/Adobe-Flash-Update.png"><img class="aligncenter size-medium wp-image-1834 MagicZoom" title="Adobe Flash Update" src="http://www.salsitasoft.com/wp-content/uploads/2011/09/Adobe-Flash-Update-300x255.png" alt="" width="300" height="255" /></a></p>
<p>Now software bundling is a widely practiced &#8212; if vaguely creepy &#8212; way of distributing software, but to me this crosses an invisible line (particularly in light of Google&#8217;s self-professed non-evilness). I&#8217;ve just installed Firefox, and the first thing Adobe does is propose to install Chrome? At very least, the link should be an opt-in rather than opt-out. (The rule of thumb I&#8217;ve heard is that about 80% of users download opt-out software versus 20% for opt-in.) It&#8217;s a bit sad that Google is willing to go to these lengths to grow market share. And it&#8217;s arguably even sadder that Adobe hasn&#8217;t come up with a better way to monetize the enormous number of Flash downloads they serve.</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/exwSqrcst-Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/09/23/wonder-how-chrome-is-growing-market-share-ask-adobe/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/09/23/wonder-how-chrome-is-growing-market-share-ask-adobe/</feedburner:origLink></item>
		<item>
		<title>In Defense of Netflix</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/7n1t785X8X8/</link>
		<comments>http://www.salsitasoft.com/blog/2011/09/21/in-defense-of-netflix/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 17:28:34 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Just Browsing]]></category>
		<category><![CDATA[digital media]]></category>
		<category><![CDATA[netflix]]></category>
		<category><![CDATA[rants]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1792</guid>
		<description><![CDATA[According to investment blog Seeking Alpha, Netflix is going to lower fourth quarter guidance because, among other things, &#8220;Everybody hates the split of the brand into Netflix and Qwikster.&#8221; A couple of web comics, Oatmeal and The Joy of Tech, rip into the company even more mercilessly. Press coverage has been almost universally negative. This after its stock has taken a brutal battering in the past few days, plummeting over 40%. As the pundits would have it, Netflix is a basket case run by a bunch of nincompoops who can barely dress themselves in the morning, let alone run a fast-growing media company. The funny thing is until a couple of months ago, they were perceived as having some of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.salsitasoft.com/wp-content/uploads/2011/09/netflix.jpg"><img class="alignleft size-medium wp-image-1794" title="Netflix logo" src="http://www.salsitasoft.com/wp-content/uploads/2011/09/netflix-300x224.jpg" alt="" width="300" height="224" /></a>According to investment blog Seeking Alpha, Netflix is going to <a href="http://seekingalpha.com/article/294893-why-netflix-will-cut-fourth-quarter-guidance">lower fourth quarter guidance</a> because, among other things, &#8220;Everybody hates the split of the brand into Netflix and Qwikster.&#8221; A couple of web comics, <a href="http://theoatmeal.com/comics/netflix">Oatmeal</a> and <a href="http://www.geekculture.com/joyoftech/joyarchives/1593.html">The Joy of Tech</a>, rip into the company even more mercilessly. Press coverage has been almost universally negative. This after its stock has taken a brutal battering in the past few days, plummeting over 40%.</p>
<p>As the pundits would have it, Netflix is a basket case run by a bunch of nincompoops who can barely dress themselves in the morning, let alone run a fast-growing media company. The funny thing is until a couple of months ago, they were perceived as having some of the savviest top management in Silicon Valley. This was reflected by their success in a cutthroat market, with <a href="http://www.sandvine.com/news/pr_detail.asp?ID=312">nearly 30% of total internet traffic</a> (yes, you read that right) attributable to their streaming service.</p>
<p>So how did Netflix go from superstar to pathetic loser almost overnight? The answer is simple: they didn&#8217;t. They are continuing to execute brilliantly in a market littered with dismal failures among both incumbents and hype-fueled startups. Their recent pricing changes and even more recent split into two companies (one for DVDs and one for streaming) is hardly a refutation of this brilliance. It&#8217;s a symptom of it.</p>
<p>The irony is that the same digerati who constantly mock Big Media for failing to &#8220;get it&#8221; are the first to bash Netflix when they demonstrate that they do. The DVD-by-post subscription service was an exceedingly clever and well-executed hack. Sending a bunch of bits back and forth on a clunky disk is slower, more expensive and more wasteful than streaming, but it got around the lack of bandwidth and the thorny copyright issues that existed when the service was launched. Needless to say, it&#8217;s been a stunning success, and a lesser company would cling to it for dear life. Eventually some nimble startup would eat their lunch with a modern digital delivery service unburdened by a legacy DVD business. Everyone would laugh at how the hidebound former market leader had failed to adapt.</p>
<p>But Netflix has done everything right. They&#8217;ve separated the two services and prepared for a time in the not too distant future when DVDs will be obsolete. The stock movements mean nothing except that the normal myopic herd mentality of day traders and institutional investors continues to reign supreme (and as a newly minted shareholder, I thank them). As Andy Grove would say, Netflix has reached an <a href="http://www.amazon.com/Only-Paranoid-Survive-Andrew-Grove/dp/0385482582">inflection point</a> and has rightly focused on where the market is going, not where it is today. They deserve praise, not mockery, for having the foresight and courage to avoid the trap that the vast majority of successful companies succumb to.</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/7n1t785X8X8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/09/21/in-defense-of-netflix/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/09/21/in-defense-of-netflix/</feedburner:origLink></item>
		<item>
		<title>Social Squatting and the Case for Decentralized Identity</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/ANMYTf0QYjI/</link>
		<comments>http://www.salsitasoft.com/blog/2011/09/20/social-squatting-and-the-case-for-decentralized-identity/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 17:33:14 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Just Browsing]]></category>
		<category><![CDATA[domains]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[identity]]></category>
		<category><![CDATA[kevin rose]]></category>
		<category><![CDATA[milk]]></category>
		<category><![CDATA[twit]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1780</guid>
		<description><![CDATA[Listening to TWiT yesterday, I started wondering again whether domain names are really the best way to identity resources on the web. Just as I griped that salsita.com is unavailable but totally empty, Leo Laporte complained that leo.com is parked and yet he can&#8217;t get his hands on it, despite being a tech celebrity with the successful business and consequent cash flow to back him up. The conversation started when someone commented that Kevin Rose (of Digg fame) couldn&#8217;t get milk.com for his new company and had to settle for mi.lk instead. (Just my luck that no country has claimed the .ta top-level domain.) The guy who owns milk.com simply isn&#8217;t interested in selling. Well actually he&#8217;d probably sell for [...]]]></description>
			<content:encoded><![CDATA[<p>Listening to <a href="http://twit.tv/show/this-week-in-tech/319">TWiT</a> yesterday, I started wondering <a href="http://www.salsitasoft.com/blog/2011/05/23/url-musings/">again</a> whether domain names are really the best way to identity resources on the web. Just as I griped that salsita.com is unavailable but totally empty, Leo Laporte complained that leo.com is parked and yet he can&#8217;t get his hands on it, despite being a tech celebrity with the successful business and consequent cash flow to back him up.</p>
<p>The conversation started when someone commented that Kevin Rose (of Digg fame) couldn&#8217;t get milk.com for <a href="http://www.mi.lk">his new company</a> and had to settle for mi.lk instead. (Just my luck that no country has claimed the .ta top-level domain.) The guy who owns milk.com simply <a href="http://www.milk.com/value/">isn&#8217;t interested in selling</a>. Well actually he&#8217;d probably sell for $10 million, which would make it the <a href="http://www.domaining.com/topsales/">second most valuable domain</a> of all time. Heaven knows, if there&#8217;s one thing people like almost as much as sex, it&#8217;s milk.</p>
<p>What struck me about the discussion was that Twitter and Facebook handles are now discussed in the same breath as domain names themselves. Leo is not just bitter that he can&#8217;t have www.leo.com, he&#8217;s equally bitter that he can&#8217;t be twitter.com/leo or facebook.com/leo. In other words, if you&#8217;re an established company or want to seem like one, you&#8217;ve got to go out and haggle with not one, but three separate parties in order to get all your social naming bases covered. If the future is more diversity of private services for communicating with the greater public, the problem is only going to get worse.</p>
<p>Now if you&#8217;re Kevin Rose then you can call up your buddy Mark Zuckerberg and your other buddy the-guy-who-runs-Twitter and ask them to kick out those dirty lousy squatters so you can have cool <a href="http://www.facebook.com/milk">vanity</a> <a href="http://twitter.com/#!/milk">domains</a> on their services. In a way this is a good thing since those squatters really are shockingly dirty and appallingly lousy. On the other hand, it seems a bit unfair that the well-connected would have this recourse when normal folks <a href="http://twitter.zendesk.com/entries/18370-name-squatting-policy">do not</a>. At least the URL situation applies to everyone equally. (To be clear, this isn&#8217;t a dig &#8212; no pun intended &#8212; at Kevin Rose, as I&#8217;d do the same thing in a heartbeat if I could.)</p>
<p>I still feel the market is the best way to allocate domain names. It may seem unfair that some geeky dude with a strange sense of humor has been sitting on milk.com for so long that he stills declares it a &#8220;blink-free zone&#8221;, while giving the middle finger to people who could put it to much better use. But, as your parents used to tell you, life isn&#8217;t fair, and it&#8217;s no less irksome when someone far less intelligent, charming, good-looking and talented than you is worth a fortune because their great uncle bought a brownstone in Manhattan for $400 in the 1920&#8242;s that&#8217;s now worth zillions.</p>
<p>On the other hand, a sound principle can be taken too far, and it doesn&#8217;t seem plausible that successful businesses and well-funded startups will have to engage in negotiations with an increasing number of social service squatters in addition to bidding on the domain name of their dreams. This strengthens the already compelling case for decentralized identity. After all, we never had to worry about getting a cool name for our RSS feed back when people still used RSS. We just tied it to our domain. Hopefully the same will be true of our activity streams in the future.</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/ANMYTf0QYjI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/09/20/social-squatting-and-the-case-for-decentralized-identity/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/09/20/social-squatting-and-the-case-for-decentralized-identity/</feedburner:origLink></item>
		<item>
		<title>Discontinuing WebRunner</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/2Sx_RDqPsko/</link>
		<comments>http://www.salsitasoft.com/blog/2011/09/08/discontinuing-webrunner/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 10:16:02 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Just Browsing]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ssb]]></category>
		<category><![CDATA[webrunner]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=1694</guid>
		<description><![CDATA[Perhaps the hardest decision for a software developer to take is to discontinue a moderately successful product. Some products are outright failures and thus relatively easy to let go. Some are runaway hits for which this is not even a consideration. Those that lie in the middle are the problematic ones: they have plenty of fans, some extremely passionate. But after a while you have to ask yourself: is this the most productive way for me to be spending my time? This is the situation with WebRunner today. According to Mozilla Add-ons there are between 5000 and 6000 active users. To put this in perspective, consider that the 100th most popular add-on has almost 200,000 users. At the same time, I [...]]]></description>
			<content:encoded><![CDATA[<p>Perhaps the hardest decision for a software developer to take is to discontinue a moderately successful product. Some products are outright failures and thus relatively easy to let go. Some are runaway hits for which this is not even a consideration. Those that lie in the middle are the problematic ones: they have plenty of fans, some extremely passionate. But after a while you have to ask yourself: is this the most productive way for me to be spending my time?</p>
<p>This is the situation with WebRunner today. According to Mozilla Add-ons there are between 5000 and 6000 active users. To put this in perspective, consider that <a href="https://addons.mozilla.org/en-US/firefox/extensions/?sort=users&amp;page=5">the 100th most popular add-on</a> has almost 200,000 users. At the same time, I know from many public and private conversations that the product has its share of ardent fans. I strongly believe that with sufficient effort in technology and marketing, the product could be a top add-on with a much larger user base.</p>
<p>One problem is that this effort carries a huge opportunity cost. Salsita is flourishing and the 10-20 hours/week I spend personally on WebRunner is precious time that I could otherwise spend managing our growing team, developing our business and exploring various exciting side projects that are currently undernourished. The lamentable fact is that we&#8217;ve been neglecting WebRunner for a while for exactly this reason, and it would now need significant work to turn it into a hit product. This includes deep architectural changes like moving away from binary XPCOM and towards js-ctypes, which is essential now that Firefox releases break binary XPCOM compatibility. It also means integrating a host of newer web standards (e.g. for desktop notifications) that didn&#8217;t exist when WebRunner was first released.</p>
<p>Moreover, the logical place to get WebRunner-like functionality is from the browser vendors themselves. Chrome has been <a href="http://www.google.com/support/chrome/bin/answer.py?answer=95710">offering this</a> for ages (though lamentably Mac support still requires <a href="http://www.lessannoyingcrm.com/blog/2010/08/149/Create+application+shortcuts+in+Google+Chrome+on+a+Mac">some hacking</a>). Internet Explorer 9 has <a href="http://msdn.microsoft.com/en-us/ie/dd797411">pinned sites</a>. The day that Mozilla catches up and releases this functionality, WebRunner will be rendered instantly obsolete.</p>
<p>Mozilla is <a href="http://groups.google.com/group/mozilla.dev.platform/browse_thread/thread/1285e6fbfdee1799#">now discussing exactly this</a>, and personally I see this as great news. I&#8217;m sad to see WebRunner go but a whole lot happier to see its legacy live on where it truly belongs: built into Firefox. I do hope that some of the concrete ideas and even code from WebRunner will be picked up by the Mozilla team. I also hope that they will take the opportunity to mine an incredible resource: the ideas, impressions and lessons that the users of the Prism and WebRunner can offer after using these products over the past four years.</p>
<p><strong>What does this mean?</strong></p>
<p>As of today, Salsita Software will no longer be actively maintaining the free version of WebRunner. We submitted the latest version (for Firefox 6.0) to the Mozilla Add-ons site last week and expect it to be approved in the next week or so. We will not be releasing new versions after that, so as soon as Firefox 7.0 comes out, WebRunner will no longer work.</p>
<p>We will make the source code available, and if anyone wants to take over maintenance of the code base, they are welcome to do so. Be forewarned, however, that with the amount of binary code in WebRunner, building release versions on all platforms every six weeks is a considerable effort that has contributed to our decision to discontinue the product.</p>
<p>Naturally we remain interested in working on single-site browser projects for clients, whether based on WebRunner or not, and we have unparalleled expertise in this area. In particular, if your company is using WebRunner and you would like to discuss continued maintenance, don&#8217;t hesitate to <a href="http://www.salsitasoft.com/contact-us/">contact us</a>.</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/2Sx_RDqPsko" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/09/08/discontinuing-webrunner/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/09/08/discontinuing-webrunner/</feedburner:origLink></item>
		<item>
		<title>Packaging WebRunner Applications… For Dummies!</title>
		<link>http://feedproxy.google.com/~r/justdiscourse/browsing/~3/xvMMkCYY7f4/</link>
		<comments>http://www.salsitasoft.com/blog/2011/08/01/packaging-webrunner-applications-for-dummies/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 16:55:52 +0000</pubDate>
		<dc:creator>Matthew Gertner</dc:creator>
				<category><![CDATA[Just Browsing]]></category>
		<category><![CDATA[packaging]]></category>
		<category><![CDATA[webrunner]]></category>

		<guid isPermaLink="false">http://www.salsitasoft.com/?p=709</guid>
		<description><![CDATA[For some reason people have been complaining that they don&#8217;t understand my tutorial for packaging WebRunner applications. I&#8217;m not sure why since when I tried to reread it just now my head started hurting and I had to stop. The good news is that Stefan has created a much more user-friendly tutorial (with screenshots and everything). Thanks, Stefan! The one drawback is that the tutorial is Windows only. If anyone feels like whipping up something similar for Mac and/or Linux, that would be stupendous. As I mentioned in my last post, I have an internal version of a simple packager that I&#8217;ve written to automate this process (on Windows and Mac). I&#8217;ve had a few requests for it, so I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>For some reason people have been complaining that they don&#8217;t understand my <a href="http://www.salsitasoft.com/blog/2011/04/18/packaging-webrunner-applications/">tutorial for packaging WebRunner applications</a>. I&#8217;m not sure why since when I tried to reread it just now my head started hurting and I had to stop.</p>
<p>The good news is that Stefan has created a <a href="http://www.astuteq.de/blog/webrunner-packaging-howto/">much more user-friendly tutorial</a> (with screenshots and everything). Thanks, Stefan! The one drawback is that the tutorial is Windows only. If anyone feels like whipping up something similar for Mac and/or Linux, that would be stupendous.</p>
<p>As I mentioned in my last post, I have an internal version of a simple packager that I&#8217;ve written to automate this process (on Windows and Mac). I&#8217;ve had a few requests for it, so I&#8217;m planning to check whether it works with the latest Firefox and, if so, put it up somewhere over the next week or so for people to play with.</p>
<img src="http://feeds.feedburner.com/~r/justdiscourse/browsing/~4/xvMMkCYY7f4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.salsitasoft.com/blog/2011/08/01/packaging-webrunner-applications-for-dummies/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.salsitasoft.com/blog/2011/08/01/packaging-webrunner-applications-for-dummies/</feedburner:origLink></item>
	</channel>
</rss>

