<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Allen Wirfs-Brock</title>
	<atom:link href="http://www.wirfs-brock.com/allen/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wirfs-brock.com/allen</link>
	<description>Thoughts and Things</description>
	<lastBuildDate>Tue, 07 May 2013 16:35:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Working Outside the Blue Bubble</title>
		<link>http://www.wirfs-brock.com/allen/posts/490</link>
		<comments>http://www.wirfs-brock.com/allen/posts/490#comments</comments>
		<pubDate>Tue, 07 May 2013 02:42:43 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[ambient compting]]></category>
		<category><![CDATA[computing eras]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[pervasive]]></category>
		<category><![CDATA[transitional periods]]></category>
		<category><![CDATA[ubiquitous]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=490</guid>
		<description><![CDATA[I written before about a transition period to a new era of computing. Earlier this month I gave a keynote talk at the Front-Trends conference in Warsaw.  In preparing this talk I discovered a very interesting graphic created by Asymco for an article about the Rise and Fall of Personal Computing.   It was so [...]]]></description>
				<content:encoded><![CDATA[<p></p><p>I written before about a transition period to a <a title="The Third Era of Computing" href="http://www.wirfs-brock.com/allen/posts/74">new era of computing</a>. Earlier this month I gave a <a title="Front-Trends Keynote slides" href="http://www.slideshare.net/allenwb/fronttrends-awb" target="_blank">keynote talk</a> at the <a title="Front-Trends 2013" href="http://2013.front-trends.com/" target="_blank">Front-Trends</a> conference in Warsaw.  In preparing this talk I discovered a very interesting graphic created by <a title="Asymco" href="http://www.asymco.com/" target="_blank">Asymco</a> for an article about the <a title="Asymco: Rise and Fall of Personal computing" href="http://www.asymco.com/2012/01/17/the-rise-and-fall-of-personal-computing/" target="_blank">Rise and Fall of Personal Computing</a>.   It was so interesting that I used it to frame my talk. Here is what my first slide looked like, incorporating the Asymco visualization:</p>
<p style="text-align: center;"><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/05/rise-and-fall-pc.png"><img class="wp-image-505 aligncenter" alt="rise-and-fall-pc" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/05/rise-and-fall-pc.png" width="592" height="426" /></a></p>
<p style="text-align: left;">This graph is showing market-share of various computing platforms since the very first emergence of what can be characterize as a personal computer.  I urge you to read the <a href="http://www.asymco.com/2012/01/17/the-rise-and-fall-of-personal-computing/" target="_blank">Asymco article</a> if you are interested in the details of this visualization.   Keep in mind that it is showing percentage share of a rapidly expanding market. Over on the left edge we are talking about a total world-wide computer population that could be measured in the low hundreds of thousands.  On right we are talking about a market size in the high hundreds of millions of computers.</p>
<p style="text-align: left;">For my talk, I used the graph as an abstraction of the entire personal computing era. The important thing was that there was a period of around ten years before the Windows/Intel PC platform really began to dominate.  I remember those days. I was a newly graduated software engineer and those were exciting times.  We knew sometime big was happening, we just didn&#8217;t know for sure what it was and how it was all going to shake out.  Each year there was one or more new technologies and companies that seems to be establishing themselves  as the dominant platform.  But then something changed and within a year or two somebody else seemed to be winning.  It wasn&#8217;t until  the latter part of the 1980&#8242;s that the Wintel platform could be identified as the clear winner. That was the beginning of a 20+ year period that, based upon this graph, I&#8217;m calling the blue bubble.</p>
<p style="text-align: left;">While many interesting things (for examaple, the Web)  happened during the period of the blue bubble, overall it was a much less exciting time to be working in the software industry. For most of us, there was no option other than to work within the confines of the Wintel platform.  There were good aspects to this as a fixed and relatively stable platforms provided a foundation for the evolution of PC-based applications and ultimately the applications were what  was most important from a user perspective. But as a software developer, it just wasn&#8217;t the same as that earlier period before the bubble formed. To those of us who were around for the first decade of the PC era there were just too many constraints inside the bubble. There were still plenty of technical challenges, but there wasn&#8217;t the broad sense that we were all collectively changing the world.  But then, the blue bubble became normal. Until very recently,  must active software developers have never experienced a professional life outside that bubble.</p>
<p style="text-align: left;">The most important thing for today is what is happening on the right-hand side of this graph.  Clearly, the big blue bubble is coming to an end. This coincides with what I call the transition from the Personal Computing Era to the Ambient Computing Era.  Many people thank we are already inside the next blue bubble.  That Apple, or Google, or many be even &#8220;the Web&#8221; has already won platform dominance for the next computing era.  Maybe so, but I doubt it.  Here is a slide I used at the end of my recent talk:</p>
<p style="text-align: center;"><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/05/rise-and-fall-ambient.png"><img class="aligncenter  wp-image-511" alt="rise-and-fall-ambient" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/05/rise-and-fall-ambient.png" width="584" height="406" /></a></p>
<p style="text-align: left;">It&#8217;s the same graphic.  I only removed the platform legend and changed the title and time line. The key point is that we probably aren&#8217;t yet inside the next blue bubble.  Instead, we are most likely in a period that is more similar to the first ten years of the PC Era.  It&#8217;s a time of chaotic transition.  We don&#8217;t know for sure which companies and technologies map to the colors in the  graph.  We also don&#8217;t know the exact time scale;  2013 isn&#8217;t necessarily equivalent to 1983.  It&#8217;s probably the case that the dominant platform  of the Ambient Computing Age is not yet established. The ultimate winner may  already be out there along with several other contenders.  We just don&#8217;t know with certainty how it&#8217;s all going to come out.</p>
<p style="text-align: left;">Things are really exciting again. Times of chaos are times of opportunity. The constraints of the last blue bubble are gone and the next blue bubble isn&#8217;t set yet. We all need to drop our blue bubble habits and seize the opportunity to shape the new computing era. It&#8217;s a time to be aggressive and to take risks. It&#8217;s a time for new thinking and new perspectives.  This is the best of times to be a software developer. Don&#8217;t get trapped by blue bubble thinking and don&#8217;t wait too long. The window of opportunity will probably only last a few years before the next blue bubble is firmly set. After that it will be decades  until the next such opportunity.</p>
<p style="text-align: left;">We&#8217;re all collectively creating a new era of computing.  Own it and enjoy the experience!</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/490/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ambient Computing Challenge: Please Abstract My Digital Life</title>
		<link>http://www.wirfs-brock.com/allen/posts/473</link>
		<comments>http://www.wirfs-brock.com/allen/posts/473#comments</comments>
		<pubDate>Thu, 07 Feb 2013 22:28:16 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[ambient compting]]></category>
		<category><![CDATA[challenges]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[computing eras]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[pervasive]]></category>
		<category><![CDATA[post-PC]]></category>
		<category><![CDATA[ubiquitous]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=473</guid>
		<description><![CDATA[My plan is for this to be the first in a series of posts that talk about specific medium term challenges facing technologists as we move forward in the Ambient Computing Era.  The challenges will concern things that I think are inevitable but which may not be getting enough attention right now. But with attention, [...]]]></description>
				<content:encoded><![CDATA[<p></p><p class="MsoNormal"><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/02/Tom-Otterness-Computer-Pile.jpg"><img class="alignright size-full wp-image-474" title="Tom Otterness-Computer Pile" alt="" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/02/Tom-Otterness-Computer-Pile.jpg" width="375" height="500" /></a>My plan is for this to be the first in a series of posts that talk about specific medium term challenges facing technologists as we move forward in the <a title="The Third Era of Computing" href="http://www.wirfs-brock.com/allen/posts/74">Ambient Computing Era</a>.<span style="mso-spacerun: yes;">  </span>The challenges will concern things that I think are inevitable but which may not be getting enough attention right now. But with attention, we should see significant progress towards solutions over the next five years.</p>
<p class="MsoNormal">Here’s the first challenge.<span style="mso-spacerun: yes;">  </span>I have too many loosely coordinated digital devices and digital services. Everyday, I spend hours using my mobile phone, my tablet, and my desktop Mac PC. I also regularly use a laptop, a FirefoxOS test phone, and my DirecTV set-top box/DVR.<span style="mso-spacerun: yes;">  </span>Less, regularly I use the household iPad, an Xbox/Kinect in our family room, and a couple of Denon receivers with network access.<span style="mso-spacerun: yes;">   </span>Then, of course, there are various other active digital devices like cameras, a FitBit, runner’s watches, an IPod shuffle, etc.<span style="mso-spacerun: yes;">  </span>My car is too old to have much user facing intelligence but I sure that won’t be the case with the next one.</p>
<p class="MsoNormal">Each of these devices is connected (at least indirectly) to the Internet and most of them have some sort of web browser. Each of them locally hold some of my digital possessions. I try to configure and use services like Dropbox and Evernote to make sure that my most commonly used possessions are readily available on all my general-purpose devices, but sometimes I still resort to emailing things to myself.</p>
<p class="MsoNormal">I also try to similarly configure all my MacOS devices and all my Android devices. But even so, everything I need isn’t always available on the device I’m using at any instance, even in cases where the device is perfectly capable of hosting it.</p>
<p class="MsoNormal">Even worse, each device is different in non-essential, but impossible to ignore ways.<span style="mso-spacerun: yes;">  </span>I’m never just posting a tweet or reading my favorite new streams.<span style="mso-spacerun: yes;">  </span>I’m always doing it on my tablet, or at my desk, or with my phone and the experience is different for each of them in some ways.<span style="mso-spacerun: yes;">  </span>In every case, I have to focus as much attention on the device I’m physically using and how it differs from my other devices as I do on the actual task I’m interested in accomplishing.<span style="mso-spacerun: yes;">  </span>And, its getting worse. Each new device I acquire may give me some new capability but it also adds to the chaos.</p>
<p class="MsoNormal">Now, I have the technical skills that enable me to deal with this chaos and get a net positive benefit from most of these devices. But it isn’t where I really want to be investing my valuable time.</p>
<p class="MsoNormal">I simply want to think about all my “digital stuff” as things that are always there and always available.<span style="mso-spacerun: yes;">  </span>No mater where I am or which device I’m using. <span style="mso-spacerun: yes;"> </span>When I get a new device, I don’t want to spend a day installing apps and configuring it.<span style="mso-spacerun: yes;">  </span>I just want to identify myself and have all my stuff immediately available. I want my stuff to look and operate familiarly.<span style="mso-spacerun: yes;">  </span>The only differences should be those that are fundamental to the specific device and its primary purpose. <span style="mso-spacerun: yes;"> </span>My attention should always be on my stuff.<span style="mso-spacerun: yes;">   </span>Different devices and different services should fade into the background. &#8220;Digital footprint&#8221; was the term I used my <a title="A Cloud on Your Ceiling?" href="http://www.wirfs-brock.com/allen/posts/449">Cloud on Your Ceiling</a> to refer to all this digital stuff.</p>
<p class="MsoNormal">Is any progress being made towards achieving this? Cloud hosted services from major industry players such as Google and Apple may feel like they are addressing some of these needs. But, they generally force you to commit all your digital assets to a single corporate caretaker and whatever limitations they choose to impose upon you.<span style="mso-spacerun: yes;">  </span>Sometimes such services are characterized as “digital lockers”.<span style="mso-spacerun: yes;">  </span>That’s not really what I’m looking for. I don’t want to have to go to a locker to get my stuff; I just want it to appear to always be with me and under my complete control.</p>
<p class="MsoNormal"><a title="Locker Project" href="http://lockerproject.org/http://" target="_blank">The Locker Project</a> is something that I discovered while researching this post that sounded like relevant work but it appears to be moribund.<span style="mso-spacerun: yes;">  </span>However, it led me to discover an <a title="Jeremie Miller talk" href="http://www.youtube.com/watch?v=pTNO5npNq28" target="_blank">inspirational short talk by one of its developers, Jeremie Miller,</a>  who paints a very similar vision to mine. The Locker Project appears to have morphed in to the <a title="Singly product" href="https://singly.com/product/" target="_blank">Singly AppFabric</a>  product, which seems to be a cloud service for integrating social media data into mobile apps.<span style="mso-spacerun: yes;">  </span>This is perhaps a step in the right direction, but not really the same vision.<span style="mso-spacerun: yes;">  </span>I suspect there is a tension between achieving the full vision and the short-term business realities of a startup.</p>
<p class="MsoNormal">So, that’s my first Ambient Computing challenge. Create the technology infrastructure and usage metaphors that make individual devices and services fade into the background and allow us all to focus our attention on actually living our digitally enhanced lives.</p>
<p class="MsoNormal">I’m interested in hearing about other relevant projects that readers may know about and other challenges you think are important.</p>
<p class="MsoNormal">(<a href="http://www.flickr.com/photos/bigmikeyeah/4913622068/" target="_blank">Photo</a> by “<a href="http://www.flickr.com/people/littlesister/" target="_blank">IndyDina with Mr. Wonderful</a>”, Creative Commons Attribution License. Sculpture by Tom Otterness)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/473/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Does the Web Matter Anymore?</title>
		<link>http://www.wirfs-brock.com/allen/posts/459</link>
		<comments>http://www.wirfs-brock.com/allen/posts/459#comments</comments>
		<pubDate>Fri, 25 Jan 2013 19:11:15 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[This blog]]></category>
		<category><![CDATA[ambient compting]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[computing eras]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[pervasive]]></category>
		<category><![CDATA[post-PC]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=459</guid>
		<description><![CDATA[Recently a friend of mine asked this question.  His theory was that the open web, as described in the Mozilla Mission no longer mattered because much of what we used to do using web browsers is now rapidly shifting to &#8220;apps&#8221;.  Why worry about the open web if nobody is going to be using it? [...]]]></description>
				<content:encoded><![CDATA[<p></p><p><span style="font-size: 12.0pt; font-family: Helvetica; mso-fareast-font-family: 'ＭＳ 明朝'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: Helvetica; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"><a href="http://www.flickr.com/photos/mind_scratch/2434031231/"><img class="alignright size-full wp-image-464" title="small-visionary-eye" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/01/small-visionary-eye.jpg" alt="" width="320" height="213" /></a>Recently a friend of mine asked this question.  His theory was that the open web, as described in the <a title="Mozilla Mission Statement Link" href="http://www.mozilla.org/en-US/mission/" target="_blank">Mozilla Mission</a> no longer mattered because much of what we used to do using web browsers is now rapidly shifting to &#8220;apps&#8221;.  Why worry about the open web if nobody is going to be using it?</span></p>
<p><span style="font-size: 12.0pt; font-family: Helvetica; mso-fareast-font-family: 'ＭＳ 明朝'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: Helvetica; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">To me, this is really a question about what do we mean by &#8220;the web&#8221;. If by  &#8221;the web&#8221; we are just referring to the current worldwide collection of information made available by http servers and accessed most commonly using desktop browsers, then maybe he&#8217;s right.  While I use it all the time, I don&#8217;t think very much about the future of that web. Much about it will surely  change over the next decade. The 1995 era technologies do not necessarily need to be protected and nourished. They aren&#8217;t all good.</span></p>
<p><span style="font-size: 12.0pt; font-family: Helvetica; mso-fareast-font-family: 'ＭＳ 明朝'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: Helvetica; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">What I think about is the <a title="The Third Era of Computing" href="http://www.wirfs-brock.com/allen/posts/74">rapidly emerging pervasive and ambient information ecology</a> that we are living within. This includes every digital device we regularly interact with. It includes devices that provide access to information but also devices that collect information. Some devices are &#8220;mobile&#8221;, others are build into physical infrastructure that surrounds us. It includes the sort of high production-value creative works that we see today &#8220;on the web&#8221; and still via pre-web media.  But it also includes, every trivial digital artifact that I create while going about my daily life and work.</span></p>
<p><span style="font-size: 12.0pt; font-family: Helvetica; mso-fareast-font-family: 'ＭＳ 明朝'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: Helvetica; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Is this &#8220;the web&#8221;?   I&#8217;m perfectly happy to call it that.  It certainly encompasses the web, as we know it today.  But we need to be careful using that term to ensure that our thinking and actions aren&#8217;t over constrained by our perception of yesterday’s &#8220;web&#8221;.  This is why I like to tell people we are still in the very early stages of the next digital era.  I believe that the web we have today is, at most, the <a title="Woz's Byte Mag Apple-II Intro Article" href="http://www.informationweek.com/byte/personal-tech/desktop-pc/system-description-the-apple-ii-by-steph/240000361?pgno=1" target="_blank">Apple-||</a> or <a title="TRS-80 Summary" href="http://oldcomputers.net/trs80i.html" target="_blank">TRS-80</a> of this new era. If we are going to continue to use  &#8221;the web&#8221; as a label then it needs to represent a 20+ year vision that transcends http and web browsers. </span></p>
<p><span style="font-size: 12.0pt; font-family: Helvetica; mso-fareast-font-family: 'ＭＳ 明朝'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: Helvetica; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Technology generally evolves incrementally. Almost all of us spend almost all of our time working on things that are just &#8220;tactical&#8221; from the perspective of a twenty-year vision.  We are responding to what is happening today and working for achievement and advantage over the next 1-3 years. I think that the shift from &#8220;websites&#8221; to &#8220;apps&#8221; that my friend mentioned is just one of these tactical technology evolutionary vectors that is a point on the road to the future. The phenomena isn&#8217;t necessarily any more or less important than other point in time alternatives such as Flash vs. HTML or iOS vs. Android.  I think it would be a mistake to assume that &#8220;apps&#8221; is a fundamental shift.  We&#8217;ll know better in five years.</span></p>
<p><span style="font-size: 12.0pt; font-family: Helvetica; mso-fareast-font-family: 'ＭＳ 明朝'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: Helvetica; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">While everybody has to be tactical, a long-term vision still has a vital role.  A vision of a future that we yearn to achieve is an important influence upon our day-to-day tactical work. It&#8217;s the star that we steer by. A personal concern of mine is that we are severely lacking in this sort of long-term visions of  &#8221;the web&#8221;.  That&#8217;s why my plan for this year is to write more posts like <a title="A Cloud on Your Ceiling?" href="http://www.wirfs-brock.com/allen/posts/449" target="_blank">&#8220;A Cloud on your Ceiling&#8221;</a> that explore some of these longer term questions. I encourage you to also spend some time to think long term.  What short of digital enhanced world do you want to be living in twenty years from now?  What are you doing to help us get there? </span></p>
<p>(<a href="http://www.flickr.com/photos/mind_scratch/2434031231/" target="_blank">Photo</a> by “<a href="http://www.flickr.com/photos/mind_scratch/" target="_blank">mind_scratch</a>”, Creative Commons Attribution License)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/459/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>A Cloud on Your Ceiling?</title>
		<link>http://www.wirfs-brock.com/allen/posts/449</link>
		<comments>http://www.wirfs-brock.com/allen/posts/449#comments</comments>
		<pubDate>Fri, 18 Jan 2013 01:40:44 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[ambient compting]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[computing eras]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[pervasive]]></category>
		<category><![CDATA[post-PC]]></category>
		<category><![CDATA[ubiquitous]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=449</guid>
		<description><![CDATA[I’ve previously written that we are in the early stages of a new era of computing that I call “The Ambient Computing Era”.  If we are truly entering a new era then it is surely the case that the computers we will be using twenty or more years from now will exist in forms that [...]]]></description>
				<content:encoded><![CDATA[<p></p><p class="MsoNormal"><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/01/lightbulb-clouds.jpg"><img class="alignright size-medium wp-image-450" title="lightbulb-clouds" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2013/01/lightbulb-clouds-300x168.jpg" alt="" width="300" height="168" /></a>I’ve previously written that we are in the early stages of a new era of computing that I call “<a title="The Third Era of Computing" href="http://www.wirfs-brock.com/allen/posts/74">The Ambient Computing Era</a>”.<span style="mso-spacerun: yes;">  </span>If we are truly entering a new era then it is surely the case that the computers we will be using twenty or more years from now will exist in forms that are quite unlike the servers, desktop PCs, phones, and tablets we use today.<span style="mso-spacerun: yes;">  </span>We can at best speculate or dream about what that world may be like.<span style="mso-spacerun: yes;">  </span>But some of my recent readings about emerging technologies have inspired me to think about how things might evolve.</p>
<p class="MsoNormal">This week I learned about “<a title="Ars Technica on WiGig" href="http://arstechnica.com/information-technology/2013/01/fastest-wi-fi-ever-is-almost-ready-for-real-world-use/" target="_blank">WiGig</a>” which is WiFi operating on 60GHz radio frequencies.<span style="mso-spacerun: yes;">  </span>WiGig router chip sets already exist and support a theoretical throughput of 7Gbps.<span style="mso-spacerun: yes;">  </span>The catch is that 60GHz radio wave won’t penetrate walls or furniture. <span style="mso-spacerun: yes;"> </span>So if you want to have really high bandwidth wireless communications from something in your lap or on your sleeve to that wall-size display, you are probably going to want to hang a WiGig router on your ceiling. If your room is large or has a lot of furniture you may need several.</p>
<p class="MsoNormal">This got me thinking about what other sort of intelligent devices we may be hanging on our ceilings. The first thing that came to mind was LED lighting. <span style="mso-spacerun: yes;"> </span>Until very recently, I was one of those people who would make jokes about assigning IP address to light bulbs.<span style="mso-spacerun: yes;">  </span>But recently I was at a friend’s house where I saw exactly that: <a href="http://arstechnica.com/gadgets/2012/11/in-living-color-ars-reviews-the-hacker-approved-philips-hue-leds/" target="_blank">network addressable smart LED light bulbs</a>.<span style="mso-spacerun: yes;">  </span>It turns out that a little intelligence is actually useful in producing optimal room light with LEDs and when you have digital intelligence you really want to control it with something more sophisticated than a simple on/off switch.<span style="mso-spacerun: yes;">  </span>So get ready for lighting with IP6 addresses. But they probably won’t be bulb shaped.</p>
<p class="MsoNormal">Both WiGig routers and networked LED room lighting are still too expensive for wide adoption, but like all solid state electronic devices we can expect their actual cost to approach zero over the next twenty or so years.<span style="mso-spacerun: yes;">  </span>So there we have at least two kinds of intelligent devices that we probably will have hanging from our ceilings. But will they really be separate devices?<span style="mso-spacerun: yes;">  </span>I could easily image a standardized ceiling panel, let’s say a half meter square consisting of LED lighting, a WiGig router, and other room electronics.<span style="mso-spacerun: yes;">  </span>A standardized form factor would allow our homes and offices to be built (or updated) to include the infrastructure (power, external connectivity, physical mounting) that lets us easily service and evolve these devices. In honor of one of the most important web memes, I suggest that we call such a panel, a “CAT” or Ceiling Attached Technology.</p>
<p class="MsoNormal">So, what other functionality might be integrated on a CAT? Certainly we can expect sensors including cameras that allow the panel to “see” into the room. A 256 or 512 core computing cluster with several terabytes of local storage also seems very plausible. <span style="mso-spacerun: yes;"> </span>Multiple CATs in the same or adjoining rooms would presumably participate in a mesh network that ultimately links to the rest of the digital world via high-speed wired or wireless “last mile” connections. Basically, our ceilings and walls could become what we think of today as “cloud” data centers.</p>
<p class="MsoNormal">What sort of computing would be taking place in those ceiling clouds? One possibility is that our entire digital footprint (applications, services, active digital archives) might migrate to and be cached in the CATs that are physically closest to us.<span style="mso-spacerun: yes;">  </span>As we move about or from location to location, our digital footprint just follows us.<span style="mso-spacerun: yes;">  </span>No need to make long latency round trips to massive data centers in eastern Oregon or contend for resources with millions of other active users.</p>
<p class="MsoNormal">Of course, there are tremendous technology challenges standing between what we have today and this vision. <span style="mso-spacerun: yes;"> </span>How do we maintain the integrity of our digital assets as they follow us around from CAT to CAT? How do we keep them secure and maintain our personal privacy?<span style="mso-spacerun: yes;">  </span>What programs get to migrate into our CATs?<span style="mso-spacerun: yes;">  </span>How do we make sure it’s not malicious? How do we keep our homes from becoming massive botnets?<span style="mso-spacerun: yes;">  </span>That’s why I think it’s important for some of us to start thinking about where this new computing era is heading and how we want to shape it. We can start inventing the ambient computing world just like Alan Kay and his colleagues at Xerox PARC started in the early 1970’s with the vague concept of a “<a title="Dynabook origins" href="http://www.w2vr.com/archives/Kay/01_Dynabook.html#" target="_blank">Dynabook</a>“ and went on to invent most of the foundational concepts that define personal computing.</p>
<p class="MsoNormal">If you find yourself thinking about “Post-PC Computing” keep in mind that the canonical computer twenty years from now will probably look nothing like a cell phone or tablet. It may look like a ceiling tile. I hope this warps your thinking.</p>
<p class="MsoNormal">(<a href="http://www.flickr.com/photos/bigmikeyeah/4913622068/" target="_blank">Photo</a> by “<span id="yui_3_7_3_3_1358472996071_1308" class="name" style="color: #000000;"><a id="yui_3_7_3_3_1358472996071_1331" href="http://www.flickr.com/photos/bigmikeyeah/"><span style="color: #000000;">Suicine</span></a></span>”, Creative Commons Attribution License)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/449/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>B2G:  From Browser to Platform</title>
		<link>http://www.wirfs-brock.com/allen/posts/394</link>
		<comments>http://www.wirfs-brock.com/allen/posts/394#comments</comments>
		<pubDate>Mon, 25 Jul 2011 19:58:03 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[ambient compting]]></category>
		<category><![CDATA[application platform]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[computing eras]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[native apps]]></category>
		<category><![CDATA[pervasive]]></category>
		<category><![CDATA[post-PC]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=394</guid>
		<description><![CDATA[In my post, The Browser is a Transitional Technology, I wrote that I thought  web browsers were really Personal Computing Era applications and that browsers were unlikely to continue to exist as such as we move deeply into the Ambient Computing Era. However,  I expect browser technologies to have a key role in the Ambient [...]]]></description>
				<content:encoded><![CDATA[<p></p><p>In my post, <a title="The Browser is a Transitonal Technology" href="http://www.wirfs-brock.com/allen/posts/115" target="_self">The Browser is a Transitional Technology,</a> I wrote that I thought  web browsers were really Personal Computing Era applications and that browsers were unlikely to continue to exist as such as we move deeply into the <a title="3rd Era of Computing" href="http://www.wirfs-brock.com/allen/posts/74" target="_self">Ambient Computing Era.</a> However,  I expect browser technologies to have a key role in the Ambient Computing Era. In <a title="Why Mozilla" href="http://www.wirfs-brock.com/allen/posts/210" target="_self">Why Mozilla</a>, I talked about the inevitable emergence of a universal application platform for the Ambient Era and how open web technologies could serve that role. Last month I gave a talk where I tried to pull some of these ideas together:</p>
<div style="width:425px" id="__ss_8402770"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/allenwb/is-the-browser-a-transitional-technology" title="Is the Browser a Transitional Technology?" target="_blank">Is the Browser a Transitional Technology?</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8402770" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px">  </div>
</p></div>
<p>For slides, 14-19 I talked about how when you remove that PC application facade from a modern browser you have essentially an open web-based application platform that is appropriate for all classes of ambient computing devices.</p>
<p>Today Mozilla announced an embryonic project that is directed towards that goal.    <a title="B2G Project Page" href="https://wiki.mozilla.org/B2G" target="_blank">B2G</a> or (Booting to the Web) is about showing that the open the web application platform can be the primarily platform for running native-grade applications.  As the project page says:</p>
<blockquote><p>Mozilla believes that the web can displace proprietary, single-vendor stacks for application development. To make open web technologies a better basis for future applications on mobile and desktop alike, we need to keep pushing the envelope of the web to include &#8212; and in places exceed &#8212; the capabilities of the competing stacks in question.</p></blockquote>
<p>One of the first steps is to directly boot devices into running <a title="Gecko on Wikipedia" href="http://en.wikipedia.org/wiki/Gecko_%28layout_engine%29" target="_blank">Gecko</a>, Mozilla’s core browser engine.  Essentially the devices will boot directly into the browser platform, but without the baggage and overhead of a traditional PC based web browser.  This is essentially the vision of slide 17 of my presentation.  The “G” in B2G comes from the use of Gecko, but the project is really about the open web. Any other set of browser technologies could potentially be used in the same way.  As the <a title="B2G Project Page" href="https://wiki.mozilla.org/B2G" target="_blank">project web site</a> says: “We aren&#8217;t trying to have these native-grade apps just run on Firefox, we&#8217;re trying to have them run on the web.”</p>
<p>This project is just starting, so nobody yet knows all the details or how successful it will be.  But, like all Mozilla projects it will take place in the <a title="B2G on Github" href="https://github.com/andreasgal/B2G" target="_blank">open</a> and with an open invitation for you involvement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/394/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Web App Platform: Is it a Framework or is it an OS?</title>
		<link>http://www.wirfs-brock.com/allen/posts/379</link>
		<comments>http://www.wirfs-brock.com/allen/posts/379#comments</comments>
		<pubDate>Mon, 23 May 2011 01:31:55 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[Web Standards]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Longhorn]]></category>
		<category><![CDATA[post-PC]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[Taligent]]></category>
		<category><![CDATA[Web IDL]]></category>
		<category><![CDATA[web platfiorm architecture]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=379</guid>
		<description><![CDATA[Recently I&#8217;ve had some conversations with some colleagues about how Web IDL is used to specify the APIs that browsers support for web applications.  I think our discussions raised some interesting questions about  the fundamental nature of the web app platform so I wanted to raise those same questions here. Basically, is the browser web [...]]]></description>
				<content:encoded><![CDATA[<p></p><p><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/05/pbcup2.png"><img class="alignright size-medium wp-image-384" title="pbcup2" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/05/pbcup2-200x300.png" alt="" width="200" height="300" /></a>Recently I&#8217;ve had some conversations with some colleagues about how <a title="Web IDL draft" href="http://www.w3.org/TR/WebIDL/" target="_blank">Web IDL</a> is used to specify the APIs that browsers support for web applications.  I think our discussions raised some interesting questions about  the fundamental nature of the web app platform so I wanted to raise those same questions here.</p>
<p>Basically, is the browser web app platform an application framework or is it really  something that is more like an operating system? Stated more  concretely,  is the web app platform most similar to the Java or .Net platforms or is it more similar to Linux or Windows?  In the long term this is probably a very important question.  It  makes a different  in the sort of capabilities that can be made available to a web app and also in the integrity expectations concerning  the underlying platform.</p>
<p>In a framework, client code directly integrates and extends the platform code.  This allows client code to do very powerful things but the cost of this is that client code can do things that results in platform level errors or even failures.  Modern frameworks are pretty much all defined in terms of object-oriented concepts because those concepts permits the client extensibility that is the primary motivation for building a framework. Frameworks generally have to trust their clients because they frequently have to pass control into client code and their is no way they can anticipate or validate everything client code might do.  Frameworks are great from the perspective of what they allow developers to create, they are less great in turns of robustness and integrity.</p>
<p>In an operating system, client code almost never directly integrates with the platform code. Client code is limited to a fixed set of actions that can be requested via a fairly simple system call interface. In the absence of  platform bugs, client code can&#8217;t cause platform level errors or crash the platforms because the platform carefully validates every aspect of every system call request and never directly executes untrusted client code. Operating systems don&#8217;t trust their clients. Successful operating system API are pretty much all expressed in terms of procedure calls that only accept scalars and simple structs as arguments because such arguments can be fully validated before the platform uses them to perform any action. Operating systems are great from a robustness and integrity perspective but they don&#8217;t offer much direct help to clients that need to do complex things.</p>
<p>Historically, there have been various attempts to create operating systems that uses framework style object-oriented client interfaces.  All the major attempts at doing this that I am aware of have been dismal failures.  <a title="Taligent Wikipedia" href="http://en.wikipedia.org/wiki/Taligent" target="_blank">Taligent</a> and <a title="decouple .net and longhorm" href="http://www.theregister.co.uk/2005/05/26/dotnet_longhorn/" target="_blank">Windows Longhorn</a> are two notorious examples. The problem seems to be that the power and extensibility that comes with framework style interfaces is in direct conflict  with robustness and integrity requirements of an OS.  It is very difficult and perhaps impossible to find a comprise that provides sufficient power, extensibility, robustness, and integrity all at the same time. Systems like Taligent and Longhorn also have had significant durability issues because one of the ways they  tried to balance power and integrity was by describing their APIs in terms of static recursive object-oriented typing which are very hard to evolve in an backwards compatible fashion over multiple versions.</p>
<p>This begins to sound a lot like the way Web IDL is being used to describe web app APIs.  It has framework style APIs but browser implementers would like to have OS style system integrity and robustness.</p>
<p>One way OSes have addressed this issue is by using a  kernel.  The kernel is a small part of the overall platform that is very robust, has high integrity, and exposes very stable APIs.  The majority of the platform is outside the kernel.  In general, bugs or misuse of  non-kernel code may crash a application but it can&#8217;t crash the entire system. One way to think about large application frameworks like Java and .Net is that they are the low integrity but high leverage outer-most layer of such a kernelized design.</p>
<p>So what is the Web App platform.  Is it a framework or is it an OS? I think it needs to be designed mostly like a framework.  However, there probably is a kernel of functionality that needs to be treated more like an OS.  That kernel is not yet well identified. It probably needs to be.  Otherwise, the designer of the web application platform run the risk of going down the same dead-end paths that were taken by the designers of &#8220;object-oriented&#8221; OSes like Taligent and Longhorn.</p>
<p>(Photo <a href="http://creativecommons.org/licenses/by/2.0/"><img title="Attribution" src="http://l.yimg.com/g/images/cc_icon_attribution_small.gif" border="0" alt="Attribution" /></a> <a title="Attribution License" href="http://creativecommons.org/licenses/by/2.0/">Some rights reserved</a> by <a href="http://www.flickr.com/photos/pinksherbet/">Pink Sherbet Photography</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/379/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Combining Mirror Facets</title>
		<link>http://www.wirfs-brock.com/allen/posts/314</link>
		<comments>http://www.wirfs-brock.com/allen/posts/314#comments</comments>
		<pubDate>Fri, 29 Apr 2011 22:17:58 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[experimental JavaScript]]></category>
		<category><![CDATA[JavaScript extensions]]></category>
		<category><![CDATA[mirrors]]></category>
		<category><![CDATA[prototypes]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=314</guid>
		<description><![CDATA[In my last couple posts I introduced idea of using Mirrors for JavaScript reflection and took a first look at the introspection interfaces of my jsmirrors prototype. In this post I&#8217;m going to look at the other reflection interfaces in jsmirrors and how they are mixed together to provide various levels of reflection privilege. When [...]]]></description>
				<content:encoded><![CDATA[<p></p><p><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/04/mirrorfacets.png"><img src="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/04/mirrorfacets-300x225.png" alt="" title="mirrorfacets" width="300" height="225" class="alignright size-medium wp-image-349" /></a>In my last couple posts I introduced idea of using <a title="Experimenting with Mirrors for JavaScript" href="http://www.wirfs-brock.com/allen/posts/228" target="_self">Mirrors for JavaScript reflection</a> and took a first look <a title="Looking into Mirrors" href="http://www.wirfs-brock.com/allen/posts/245">at the introspection interfaces</a> of my <a title="jsmirrors on github" href="https://github.com/allenwb/jsmirrors" target="_blank">jsmirrors</a> prototype.  In this post I&#8217;m going to look at the other reflection interfaces in jsmirrors and how they are mixed together to provide various levels of reflection privilege.</p>
<p>When building this prototype I knew that I wanted to have a number of separable sets of reflection capabilities that I could mix and match in various ways.  I also knew that the implementation was likely to change several times as I experimented with the prototype. I wanted to make sure that as I evolved the implementation that I could keep track of what belonged in each separable piece.  The way I ultimately accomplished this was by maintaining a  file of interface definitions  that are separate from the actual code that implements <a title="jsmirrors on github" href="https://github.com/allenwb/jsmirrors" target="_blank">jsmirrors</a>. The interface specifications are contained in the file <a title="mirrorsInterfaceSpec.js" href="https://github.com/allenwb/jsmirrors/blob/master/mirrorsInterfaceSpec.js" target="_blank">mirrorsInterfaceSpec.js</a>. I look at the interface file when I need to remind myself how to use one of the specific reflection interfaces and as a specification as I make changes to the implementaiton.  Also, whenever I perform a major refactoring of the implementation I check it against the interface specification.  Here is the interface specification of the basic object introspection interface that I  demonstrated in the  <a title="Looking into Mirrors" href="http://www.wirfs-brock.com/allen/posts/245">Looking into Mirrors</a> post: </p>
<pre class="brush: jscript; light: true; title: ; notranslate">
//Mirror for introspect upon all objects
var objectMirrorInterface = extendsInterface(objectBasicMirrorInterface, {
   prototype:  getAccess(objectMirrorInterface|null),
     //return a mirror on the reflected object's [[Prototype]]
   extensible: getAccess(Boolean),
     //return true if the reflected object is extensible
   ownProperties: getAccess(array(propertyMirrorInterface)),
     //return an array containing property mirrors
     //on the reflected object's own properties
   ownPropertyNames: getAccess(array(String)),
     //return an array containing the string names
     //of the reflected object's own properties
   keys: getAccess(array(String)),
     //return an array containing the string names of the
     //reflected object's enumerable own properties
   enumerationOrder: getAccess(array(String)),
     //return an array containing the string names of the
     //reflected object's enumerable own and inherited properties
   prop: method({name:String}, returns(propertyMirrorInterface|undefined)),
     //return a mirror on an own property
   lookup: method({name:String},returns(propertyMirrorInterface|undefined)),
     //return mirror on the result of a property lookup. It may be inherited 
   has: method({name:String}, returns(Boolean)),
     //return true if the reflected object has a property named 'name'
   hasOwn: method({name:String}, returns(Boolean)),
     //return true if the reflected object has an own property named 'name'
   specialClass: getAccess(String)
    //return the value of the reflected object's [[Class]] internal property
});
</pre>
<p>I used JavaScript object literals and a few helper functions to describe these interfaces.  Here is the definition of the helper functions used for this interface:</p>
<pre class="brush: jscript; light: true; title: ; notranslate">
function getAccess(returnInterface) {}; //a &quot;get-able&quot; property
function method(arguments,returnInterface){}; // a method property
function extendsInterface(supers,members) {};//a interface adding to supers
function returns(returnInterface) {};   //return value of a method
function array(elementInterface) {};//array elements all support a interface
</pre>
<p>The JavaScript code of the interface definitions don&#8217;t actually do anything but I find that being able to parse the interface specification using JavaScript forces me to apply some useful structuring discipline that I might skip if I was just writing prose descriptions. Plus I think it is going to be quite useful to have these interface specifications in a form that is easily processed.  For example, now that I have an initial implementation of jsmirrors, I may use it to create a little tool that can reflect upon the objects created by the interface specifications and perform useful tasks.  For example I may generate unit test stubs for implementations of the interfaces. I may also use reflection over the interfaces to directly validate the completeness of my implementations.</p>
<p>In factoring the jsmirrors functionality for reflecting upon objects I divided it to three primary interfaces.  <code>objectMirrorInterface</code>, shown above, is the basic introspection interface. <code>objectMutationMirrorInterface</code> allows changes to be made to a reflected object such as adding or removing properties or changing the object&#8217;s prototype. <code>objectEvalMirrorInterface</code> allows various forms of evaluation upon reflected objects such as doing &#8220;puts&#8221; and &#8220;gets&#8221; (which may invoke accessor property functions) to access property values of a reflected object or to invoke a method property.  There are also corresponding introspection, mutation, and evaluation interfaces for function object mirrors and also for property mirrors.</p>
<p>In the actual implementation, these interfaces are combined in various ways to produce five different kinds of concrete mirrors on local objects.  These various kinds of mirrors are accessible via factory functions that are accessed as properties of the <code>Mirrors</code> module object.  The five  local object mirror factories are:</p>
<ul>
<li><code>Mirrors.introspect</code>  &#8211;  supports only introspection using <code>objectMirrorInterface</code>.</li>
<li><code>Mirrors.evaluation</code>  &#8211; supports only  evaluation using <code>objectEvalMirrorInterface</code>.</li>
<li><code>Mirrors.introspectEval</code>  &#8211;  supports introspection and evaluation using <code>objectMirrorInterface</code> and <code>objectEvalMirrorInterface</code>.</li>
<li><code>Mirrors.mutate</code>  &#8211;  supports introspection and mutation using <code>objectMirrorInterface</code> and <code>objectMutationMirrorInterface</code>.</li>
<li><code>Mirrors.fullLocal</code>  &#8211;  supports introspection, mutation, and evaluation using all three interfaces.</li>
</ul>
<p>I demonstrated the use of <code>Mirrors.introspect</code> is my previous  <a title="Looking into Mirrors" href="http://www.wirfs-brock.com/allen/posts/245">post</a>.  The other <code>Mirror</code> factories are used in exactly the same manner and, except for <code>Mirrors.evaluation</code>, could be used to run all the same examples.  However, the other factories expose additional functionality that isn&#8217;t available using <code>Mirrors.introspect</code>. Take a look at the actual interface specification in <a title="mirrorsInterfaceSpec.js" href="https://github.com/allenwb/jsmirrors/blob/master/mirrorsInterfaceSpec.js" target="_blank">mirrorsInterfaceSpec.js</a> to see which capabilities are provided by the mirror objects produced by each of these factories.</p>
<p>The reason for providing multiple mirror factories  is to demonstrate that by using mirror-based reflection we can decide exactly how much reflection capability we will make available to any specific client or tool. We might allow one tool to use the full range of reflective interfaces. For another we may only expose introspection or evaluation capabilities or perhaps introspection and mutation capabilities without the ability to actually do reflective evaluation. However, so far, I&#8217;ve only shown mirrors that know how to reflect upon local objects that exist in the same heap as the mirror objects.  In my next post I&#8217;ll look at how to use the same interfaces to reflect upon non-local objects that might be encoded in a file or exist in a remote environment.</p>
<p>(<a href="http://www.flickr.com/photos/16782093@N03/3951491170/" target="_blank">Photo</a> by “Metro Centric”, Creative Commons Attribution License)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/314/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Looking into Mirrors</title>
		<link>http://www.wirfs-brock.com/allen/posts/245</link>
		<comments>http://www.wirfs-brock.com/allen/posts/245#comments</comments>
		<pubDate>Wed, 27 Apr 2011 22:20:48 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[ES5]]></category>
		<category><![CDATA[experimental JavaScript]]></category>
		<category><![CDATA[JavaScript extensions]]></category>
		<category><![CDATA[mirrors]]></category>
		<category><![CDATA[prototypes]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=245</guid>
		<description><![CDATA[In my last post I introduced the programming language concept of Mirrors and mentioned jsmirrors, the prototype I&#8217;ve been working on to explore using mirrors to support reflection within JavaScript.  In this post I&#8217;m going to take a deeper look into jsmirrors itself.  I had three goals for my first iteration of jsmirrors: Define basic [...]]]></description>
				<content:encoded><![CDATA[<p></p><p><a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/04/js-mirror.png"><img src="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/04/js-mirror-300x224.png" alt="" title="js-mirror" width="300" height="224" class="alignright size-medium wp-image-306" /></a>In my <a title="Experimenting with Mirrors for JavaScript" href="http://www.wirfs-brock.com/allen/posts/228" target="_self">last post</a> I introduced the programming language concept of Mirrors and mentioned <a title="jsmirrors on github" href="https://github.com/allenwb/jsmirrors" target="_blank">jsmirrors</a>, the prototype I&#8217;ve been working on to explore using mirrors to support reflection within JavaScript.  In this post I&#8217;m going to take a deeper look into jsmirrors itself.  I had three goals for my first iteration of jsmirrors:</p>
<ol>
<li>Define basic mirror-based interfaces for reflection upon upon JavaScript objects and properties.</li>
<li>Demonstrate that jsmirrors  can support different levels of reflection privilege.</li>
<li>Demonstrate that the jsmirrors interface can work with both local and external objects.</li>
</ol>
<p>In this post I&#8217;m going to concentrate on showing details of the basic interfaces I designed to meet the first goal.  In subsequent posts I talk about the other two goals.</p>
<p>The actual implementation of jsmirrors is contained in the file <a title="mirrors.js" href="https://github.com/allenwb/jsmirrors/blob/master/mirrors.js" target="_blank">mirrors.js</a>.  Note that jsmirrors requires an ECMAScript 5 compatible JavaScript implementation. The jsmirrors implementation is structured using the <a title="module pattern" href="http://yuiblog.com/blog/2007/06/12/module-pattern/" target="_blank">module pattern</a> and when loaded defines a single global named <code>Mirrors</code> whose properties are factory functions that can be used to create various kinds of mirror objects.  The most basic mirror factory is called <code>introspect</code> and creates a mirror on a local object that only supports introspection (examination without modification):  </p>
<pre class="brush: jscript; title: ; notranslate">  
//create a test object
var obj = {a:1, get b() {return &quot;b value&quot;}, c: undefined};
obj.c = {back: obj};  //make a circular reference to obj

//create an introspection mirror on obj
var m=Mirrors.introspect(obj);
console.log(m);   //output:  &quot;Object Introspection Mirror #0&quot;
</pre>
<p>In the above example, lines 2-3  create a couple of test objects and line 6 is creating an introspection mirror on one of them.  We see from the output of line 7 how such mirror objects identify themselves using the <code>toString</code> method.  Once we have such a mirror, we can use it to examine the structure and state of its reflected object:</p>
<pre class="brush: jscript; first-line: 8; title: ; notranslate">
console.log(m.ownPropertyNames) ;  //output:  &quot;a,b,c&quot;
console.log(m.extensible); //output:  true
console.log(m.has(&quot;toString&quot;)); //output:  true
console.log(m.hasOwn(&quot;toString&quot;)); //output:  false
var p=m.prototype;
console.log(p); //output:  &quot;Object Introspection Mirror #3&quot;
console.log(p.hasOwn(&quot;toString&quot;)); //output:  true
</pre>
<p>Lines 8-11 are querying various characteristics of the object reflected by the mirror <code>m</code> such as a list of its own property names, whether or not additional properties may be added, and whether it locally defines or inherits a specific property. Line 12 queries for the object that is the prototype object for the reflected object.  Note from line 13 that the value returned is also an introspection mirror.  This is one of the important characteristics of this style of mirror interface.  When an object value is accessed a mirror on the object is always returned rather than the actual object.  You may be curious why the mirror <coce>p</code> is "Mirror #3" rather than "Mirror #1".  The reason is that some of the preceding method calls internally generated Mirrors #1-2 as part of their internal implementation.</p>
<p>
Mirror objects aren't unique.  Multiple mirror objects may simultaneously exist that reflect on the same underlying object.  The <code>sameAs</code> method can be used to determine if two mirrors are reflecting the same object:</p>
<pre class="brush: jscript; first-line: 15; title: ; notranslate">
console.log(m.sameAs(p)) ;  //output:  false
var opm = Mirrors.introspect(Object.prototype);
console.log(p.sameAs(opm)); //output:  true
</pre>
<p>Introspection mirrors support several other methods.  The complete list can be seen by looking at the <code>objectMirrorInterface</code> specification in <a title="mirrorsInterfaceSpec.js" href="https://github.com/allenwb/jsmirrors/blob/master/mirrorsInterfaceSpec.js" target="_blank">mirrorsInterfaceSpec.js</a>.  Some of the most important methods provide access to information about specific properties.  Property mirrors are returned to enable introspection of actual property definitions:</p>
<pre class="brush: jscript; first-line: 18; title: ; notranslate">
var pmb = m.lookup(&quot;b&quot;);
console.log(pmb); 
  //output: &quot;Accessor Property Introspection Mirror name: b #6&quot;
</pre>
<p>In line 18 the method <code>lookup</code> on a mirror object is used to retrive the property named "b".  What is return in this case is a property introspection mirror. The interface specifications <code>propertyMirrorInterface</code>, <code>dataPropertyMirrorInteface</code>, and <code>accessorPropertyMirrorInteface</code> in <a title="mirrorsInterfaceSpec.js" href="https://github.com/allenwb/jsmirrors/blob/master/mirrorsInterfaceSpec.js" target="_blank">mirrorsInterfaceSpec.js</a> describe the operations that can be performed on property introspection mirrors.  For example:</p>
<pre class="brush: jscript; first-line: 21; title: ; notranslate">
console.log(pmb.isData);  //output: false
console.log(pmb.isAccessor); //output: true
console.log(pmb.enumerable); //output: true
Object.defineProperty(obj,&quot;b&quot;,{enumerable: false});
console.log(pmb.enumerable); //output: false
</pre>
<p>Lines 21-22 show tests to determine whether the reflected property is a data property or an accessor property and line 23 reports the state of the property's enumerable attribute.  Lines 24-25 demonstrate that the mirror is presenting a live view of the reflected object.  Line 24 modifies the enumerable attribute of the "b" property of the reflected object.  When the mirror is again used in line 25 we see that the reported state of the enumerable attribute has changed to false.  Note that we had to use a built-in reflection function to change the enumerable attribute because the mirrors we are using in the above examples only support introspection and don't allow any changes to the reflected objects to be made using the mirrors.</p>
<pre class="brush: jscript; first-line: 26; title: ; notranslate">
console.log(pmb.definedOn.sameAs(m)); //output: true
var fm=pmb.getter;
console.log(fm);  //output: &quot;Function Introspection Mirror #8&quot;
console.log(fm.source); //output: &quot;function () {return \&quot;b value\&quot;;}&quot;
</pre>
<p>Property mirrors know what object "owns" the reflected property.  Line 26 shows using  <code>definedOn</code>  to get a mirror on the owning object.  We then use <code>sameAs</code> to verify that this mirror is actually reflecting the same object as our original mirror <code>m</code>. Because the property we are reflecting upon is an accessor property it has getter and setter functions.  In line 27 we use the property mirror to access the property's getter  function and in line 28 we see that the results is yet another kind of mirror, a "Function Introspection Mirror".  As specified by the <code/>functionMirrorInterface</code>  in <a title="mirrorsInterfaceSpec.js" href="https://github.com/allenwb/jsmirrors/blob/master/mirrorsInterfaceSpec.js" target="_blank">mirrorsInterfaceSpec.js</a> this is a kind of object mirror that adds reflection capabilities that are specific to function objects. For example, in line 29 we see that we can use the function mirror to retrieve the source code of the getter function.</p>
<p>The above examples provide just a quick overview of the capability of jsmirrors introspection mirrors and how they are used.  But these mirrors only allow the inspection of objects.  In many situations that is the only kind of reflection you need or  that you will want to permit.  However, there are  situations where reflection needs to be able to perform other operations such as modifying the definitions of properties or calling reflected functions. In my next post, I'll explore how jsmirrors supports those kinds of reflection and how it can be used to control or limit access to them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/245/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Experimenting with Mirrors for JavaScript</title>
		<link>http://www.wirfs-brock.com/allen/posts/228</link>
		<comments>http://www.wirfs-brock.com/allen/posts/228#comments</comments>
		<pubDate>Mon, 25 Apr 2011 23:12:40 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[ES5]]></category>
		<category><![CDATA[experimental JavaScript]]></category>
		<category><![CDATA[JavaScript extensions]]></category>
		<category><![CDATA[mirrors]]></category>
		<category><![CDATA[prototypes]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[self]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=228</guid>
		<description><![CDATA[A common capability of many dynamic languages, such as JavaScript, is the ability of a program to inspect and modify its own structure.  This capability is generally called reflection. Examples of reflective capabilities of JavaScript include things like the hasOwnProperty and isPrototypeOf methods. ECMAScript 5 extended the reflection capability to JavaScript via functions such as [...]]]></description>
				<content:encoded><![CDATA[<p></p><p>A common capability of many dynamic languages, such as JavaScript, is the ability of a program to inspect and modify its own structure.  This capability is generally called <em>reflection</em>.  Examples of reflective capabilities of JavaScript include things like the <code>hasOwnProperty</code> and <code>isPrototypeOf</code> methods. ECMAScript 5 extended the reflection capability to JavaScript via functions such as <code>Object.defineProperty</code> and <code>Object.getOwnPropertyDescriptor</code>. There are many reasons you might use reflection but two very common uses are for creating development/debugging tool and for meta-programming.<br />
<a href="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/04/mirrors.jpg"><img class="alignright size-medium wp-image-234" title="mirrors" src="http://www.wirfs-brock.com/allen/wp-content/uploads/2011/04/mirrors-225x300.jpg" alt="" width="225" height="300" /></a><br />
There are many different ways you might define a reflection API for a programming language. For example, in JavaScript <code>hasOwnProperty</code> is a method defined by <code>Object.prototype</code> so it is, in theory,  available to be called as a method on all objects. But there is a problem with this approach.  What happens if an application object defines its own method named <code>hasOwnPro</code><code>perty</code>?  The application object definition will override the definition of <code>hasOwnProperty</code> that is normally inherited from <code>Object.prototype</code>.  Unexpected results are likely to occur if such an object is passed to code that expects to do reflection using the built-in <code>hasOwnProperty</code> method.  This is one of the reasons that the new reflection capabilities in ES5 are defined as functions on <code>Object</code> rather than as methods of <code>Object.prototype</code>.</p>
<p>Another issue that arises with many reflection APIs is that they  typically only work with local objects.  Consider a tool that gives application developers the ability to graphically browse and inspect the objects in an application. If such a tool is effective, developers might want to use it in other situations.  For example, they  might want to inspect the objects on a remote server-based JavaScript application or to inspect a diagnostic JSON dump of objects produced when an application crashed. If JavaScript&#8217;s existing reflection APIs were used to create the tool there is no direct way it can be used to inspect such objects because the JavaScript reflection APIs only operate upon local objects within the current program.</p>
<p>There is also a tension between the power of reflection and security concerns within applications.  Many of the reflection capabilities that are most useful to tool builders and meta-programmers can also be exploited for malicious purposes.  Reflection API designers sometimes exclude potentially useful features in order to eliminate the potential of such exploits.</p>
<p><em>Mirrors</em> is the name of  an approach to reflection API design that attempts to address many of the issue that have been encountered with various programming languages that support reflection. The basic idea of mirrors is that you never perform reflective operations directly upon application objects.  Instead all such operations are performed upon distinct &#8220;mirror&#8221; objects that &#8220;reflect&#8221; the structure of corresponding application objects.  For example, instead of coding something like:</p>
<p style="padding-left: 30px;"><code>if (someObj.hasOwnProperty('customer')) {...</code></p>
<p>you might accomplish the same thing via mirrors via something like:</p>
<p style="padding-left: 30px;"><code>if (Mirror.on(someObj).hasOwnProperty('customer')) {...</code></p>
<p>Mirrors don&#8217;t have the sort of issues I discussed above because when using them you never directly reflect on application objects. There is never any problem  if the application just happens to define a method that  has the same name as a reflection API method.  Because reflection-based tools only indirectly interact with the underlying objects via mirror objects, it is possible to create different mirrors that use a common interface to access either local object, remote objects, or static objects stored in a file. Similar, it is possible to have have mirrors that present a common interface but differ in terms how much reflection they allow.  A trusted tool might be given access to a mirror that supports the must power reflective operations while an untrusted plug-in might be restricted to using mirrors that support only a limited set of reflective operations.</p>
<p>Gilad Bracha and David Ungar are the authors of a paper that explain the principals behind mirror-based reflection: <a href="http://bracha.org/mirrors.pdf">Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages</a>.  I highly recommend it if you are interested in the general topic of reflection.</p>
<p>Mirrors were originally developed for the <a title="selflanguage.org" href="http://selflanguage.org/" target="_blank">self</a> programming language, one of the languages that influenced the original design of JavaScript. Recently, I&#8217;ve been experimenting with defining a mirror based reflection interface for JavaScript.  An early prototype of this interface named <a href="https://github.com/allenwb/jsmirrors">jsmirrors</a> is now up on github.  It uses a common interface to support reflection on both local JavaScript objects and on a JSON-based object encoding that could be used for remote or externally stored objects. It also supports three levels of reflection privilege.</p>
<p>In my <a title="Looking into Mirrors" href="http://www.wirfs-brock.com/allen/posts/245">next post</a> I&#8217;ll explain more of the usage and design details of jsmirrors.  In the meantime, please feel free to take a look at the prototype.</p>
<p><span class="fontsizexsmall">(<a href="http://www.flickr.com/photos/dichohecho/4259487517/" target="_blank">Photo</a> by &#8220;dichohecho&#8221;, Creative Commons Attribution License)</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/228/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Why Mozilla?</title>
		<link>http://www.wirfs-brock.com/allen/posts/210</link>
		<comments>http://www.wirfs-brock.com/allen/posts/210#comments</comments>
		<pubDate>Fri, 25 Mar 2011 20:07:13 +0000</pubDate>
		<dc:creator>allen</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Post-PC/Ambient Computing]]></category>
		<category><![CDATA[ambient compting]]></category>
		<category><![CDATA[computing eras]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[transitional periods]]></category>
		<category><![CDATA[ubiquitous]]></category>

		<guid isPermaLink="false">http://www.wirfs-brock.com/allen/?p=210</guid>
		<description><![CDATA[As somebody who is on record as believing that web browsers are a transitional technology, people occasionally ask me why I decided to go to work for a &#8220;browser company&#8221; like Mozilla. You can find a big part of the answer here: As we move deeper into The Next Era of Computing there are still [...]]]></description>
				<content:encoded><![CDATA[<p></p><p>As somebody who is on record as believing that <a title="The Browser is a Transitonal Technology" href="http://www.wirfs-brock.com/allen/posts/115" target="_self">web browsers are a transitional technology</a>,   people occasionally ask me why I  decided to go to work for a &#8220;browser company&#8221; like Mozilla. You can find a big part of the answer here:</p>
<p><video id="mozilla_firefox_manifesto_video" controls="controls" width="600" height="360" poster="http://www.mozilla.org/images/about/poster.jpg"><br />
    <source src="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.webm" type="video/webm"/><br />
    <source src="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.theora.ogv" type="video/ogg"/><br />
    <source src="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.mp4" type="video/mp4"/><br />
    <object type="application/x-shockwave-flash" style="width: 640px; height: 360px;" data="http://www.mozilla.com/includes/flash/playerWithControls.swf?flv=/serv/brand/Mozilla_Firefox_Manifesto_v0.2_640.mp4&amp;autoplay=false&amp;msg=Play%20Video"><param name="movie" value="http://www.mozilla.com/includes/flash/playerWithControls.swf?flv=/serv/brand/Mozilla_Firefox_Manifesto_v0.2_640.mp4&amp;autoplay=false&amp;msg=Play%20Video"/><param name="wmode" value="transparent" /></object><br />
  </video></p>
<p>As we move deeper into  <a href="http://www.wirfs-brock.com/allen/posts/74">The Next Era of Computing</a> there are still many questions about  which technologies, organizations, and business models will define it. In every previous computing era and sub-era, a single proprietary &#8220;platform&#8221; emerged to dominate it.  Will this happen again for the  Ambient Computing era?  A common platform is essential because it provides the foundation that everything else is built upon. This enables innovators to focus on creating their unique  value rather than wasting most of their time recreating necessary infrastructure. It also enables, these technical innovations to be made ubiquitously available.</p>
<p>The current foundations of the emerging computing era are open web technologies. Can the standards-based open web maintain its role as the universal platform for this era? If so, it will need to continue to evolve and embrace innovation.  Having just returned from a JavaScript standards meeting, I&#8217;m again reminded about how messy and slow  consensus driven &#8220;standards&#8221; processes can be.  Standards committees are not places  where rapid innovation can or necessarily should occur.  Proprietary platform vender have a real advantage in their ability to unilaterally make innovative choices about the evolution of their platform. However, those choices are always first and foremost driven by the business interest of the organizations and their shareholders.</p>
<p>If the standard&#8217;s based open web platform is going to continue to be the dominant platform for this era, its evolution needs to be driven by agile innovative organizations who are dedicated to its success.  We need  pragmatic organizations who are driven by the interests of computing users and not just their own dominance and profitability. Mozilla is such an organization. I think it has an essential role to play in advancing  the next generation of computing technology and I&#8217;m really excited to be a part of it. so, I encourage everybody to <a href="http://www.mozilla.org/about/mission.html">find out more</a> <a href="http://www.mozilla.org/about/manifesto">about Mozilla</a> and <a href="http://www.mozilla.com">how</a>  <a href="http://www.mozilla.org/contribute/">you can</a> <a href="https://donate.mozilla.org/page/contribute/protect-the-web">contribute</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.wirfs-brock.com/allen/posts/210/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.theora.ogv" length="28759931" type="video/ogg" />
<enclosure url="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.webm" length="10484095" type="video/webm" />
<enclosure url="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.mp4" length="37665940" type="video/mp4" />
		</item>
	</channel>
</rss>
