<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;CE4DRH04eip7ImA9WxNVGEg.&quot;"><id>tag:blogger.com,1999:blog-17547394</id><updated>2009-10-29T16:49:35.332-05:00</updated><title>Boris Bokowski</title><subtitle type="html">This blog is not intended to be implemented or extended by clients.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/BorisBokowski" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;A08DQH0_fip7ImA9WxNVFEs.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-333551499310602113</id><published>2009-10-25T06:00:00.000-05:00</published><updated>2009-10-25T06:24:31.346-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-25T06:24:31.346-05:00</app:edited><title>Adventures into web UI land</title><content type="html">To explore how easy or hard it would be to write a UI component using web technologies, and then integrate it as a first class citizen in Eclipse, I reimplemented the PDE "site.xml" editor for the 0.9 release of e4, using HTML, JavaScript, Dojo, and CSS.&lt;br /&gt;&lt;br /&gt;I thought it would be interesting to document the design decisions that I made for this. Since my experience with web UIs is somewhat limited, you should take the following with a grain of salt. I did, however, work on something that could be characterized as an "IDE in a browser" for over three years (2001-2004), so I don't consider myself a complete rookie. :-)&lt;br /&gt;&lt;br /&gt;Note that I won't talk about integrating the web UI component into Eclipse, this posting is just about the actual web UI component itself. The Eclipse integration is a related, but different story, that deserves its own post.&lt;br /&gt;&lt;br /&gt;Let's start with a screenshot of the original PDE editor. It has two panes, a tree on the left showing features and categories, and a bunch of fields on the right with which you can edit the currently selected object in the tree. Depending on the type of object, the right side shows different fields, for example feature environments if the selected object is a feature, or category ID, name, and description if the selected object is a category. To add new categories or features, there are some push buttons on the right side of the tree.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9mAUrmH9eMo/StiOXaJW7fI/AAAAAAAAC3M/YBNREUOApr0/s1600-h/sitexml-original.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 271px;" src="http://2.bp.blogspot.com/_9mAUrmH9eMo/StiOXaJW7fI/AAAAAAAAC3M/YBNREUOApr0/s400/sitexml-original.png" alt="" id="BLOGGER_PHOTO_ID_5393217086582877682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We should be able to achieve a very similar look and feel with a piece of web UI, after all, the "flat look" of the PDE editors was an attempt to mimic the look of a web page.&lt;br /&gt;&lt;br /&gt;The first important decision I had to make was whether to generate the HTML, pre-filled with the data, on the server side. This has the advantage that the resulting HTML can be made to (somewhat) work even if the web browser displaying it has JavaScript disabled. You would probably use a server-side &lt;a href="http://en.wikipedia.org/wiki/Template_engine_%28web%29"&gt;template engine&lt;/a&gt; for this. If you follow the link, you can see one of the disadvantages of this approach - there are a bajillion template engines to choose from. Good luck with deciding which one! ;-)&lt;br /&gt;&lt;br /&gt;But seriously, I had other reasons for deciding to let client-side JavaScript fill in the data instead. For example, this approach scales better because the "filling in data" work is done on the client, with the server doing less work because it only serves raw data. Also, it makes it easier to handle dynamic changes to the data on the client side because there is only one way of turning data into populated widgets. Development and testing is easier because you avoid a complete layer of the cake - you don't need to restart the template engine or reload the template every time you make a change, instead you change the .html or .js file and reload the page in the browser. Finally, this approach quite naturally leads to an interface between client and server that could be used by other kinds of clients as well  (you get an API if you decide to publish and maintain it).&lt;br /&gt;&lt;br /&gt;Oh and I forgot, it wouldn't be buzzword compliant - to claim you're doing Ajax means that you have to use &lt;a href="http://ejohn.org/apps/learn/"&gt;JavaScript&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;XMLHttpRequest&lt;/a&gt;, and to be &lt;a href="http://ajaxpatterns.org/RESTful_Service"&gt;RESTful&lt;/a&gt; means that the server should serve raw data.&lt;br /&gt;&lt;br /&gt;I started with the HTML and CSS first, leaving the client-server communication for later. My first goal was to get the right kind of "look". Many things are easy to do in plain HTML, for example input fields and buttons, and the header area that says "Update Site Map". There were two things that are hard (or maybe impossible) with plain HTML: making the two panes resizable by the user, and displaying a tree of objects. I decided to use Dojo for these two things, because I had a little previous experience with Dojo, and because it had been IP-approved for use by Eclipse projects. Note that I didn't use Dojo widgets for buttons and text fields, mostly because I didn't like their Dojo-styled look and wanted the "plain" look that you get from plain buttons and plain text fields.&lt;br /&gt;&lt;br /&gt;For the resizable panes with a draggable splitter between them, I was able to use a Dojo BorderContainer, which is configured like this:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;pre&gt;&amp;lt;div dojotype="dijit.layout.BorderContainer" design="sidebar"&lt;br /&gt;   livesplitters="false" gutters="false"&lt;br /&gt;   style="width: 100%; height: 90%;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;The tree is created dynamically from JavaScript as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;myTree = new dijit.Tree({&lt;br /&gt;  id: "myTree",&lt;br /&gt;  model: model,&lt;br /&gt;  showRoot: false,&lt;br /&gt;  getLabel: function(item) { /* code to return the label... */ },&lt;br /&gt;  getIconClass: function(item, opened){&lt;br /&gt;     /* code returning a CSS class for the icon */&lt;br /&gt;  },&lt;br /&gt;  onClick: function(item,treeNode) { /* ... */ }&lt;br /&gt;});&lt;br /&gt;myTree.startup();&lt;br /&gt;dojo.byId("tree").appendChild(myTree.domNode);&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;This creates a tree widget based on the model you are passing in, and puts it under the DOM node with the ID "tree". Of course, there is more code than what I am showing here, but I hope that the few snippets I am showing give you enough context to understand the rest.&lt;br /&gt;&lt;br /&gt;I initially ignored the server part completely and just hard-code some example data right in the JavaScript. This allowed me to rapidly test and develop the web UI in a browser. Actually, make that "in all the browsers I cared about". During development, I kept Firefox, IE, and Safari open to make sure it worked in all of them. Some of the things you'd like to do in CSS, in particular with respect to layout, don't work quite the same in all the browsers. :-)&lt;br /&gt;&lt;br /&gt;Here is the result, opened in a standalone web browser:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9mAUrmH9eMo/SuQxCI5inzI/AAAAAAAAC4c/X7I8loOHCf8/s1600-h/site-editor.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 238px;" src="http://1.bp.blogspot.com/_9mAUrmH9eMo/SuQxCI5inzI/AAAAAAAAC4c/X7I8loOHCf8/s400/site-editor.png" alt="" id="BLOGGER_PHOTO_ID_5396492166315024178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;My next decision was about the client-server communication. I decided to use JSON as the data transfer format, because, as you all probably know already, "&lt;a href="http://www.json.org/fatfree.html"&gt;JSON has become the X in Ajax&lt;/a&gt;" (quote: Douglas Crockford). There was a more pragmatic reason, too: the version of Dojo that I used was a bit older and didn't support trees backed by XML data.  With a little help from Dojo, you can make HTTP requests without having to worry about browser differences.&lt;br /&gt;&lt;br /&gt;There is only one thing that is not obvious: if the web UI is in a file like "site-editor.html" that references the necessary CSS and JavaScript pieces, then how does it know its "input", i.e. which resource to operate on? Somehow, the web UI needs to get to know the full path to the site.xml file. One widely used approach for solving this problem is to (mis-)use the "anchor" part of the URL that the browser points at. So for example, if the browser's URL is &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;http://localhost:9234/pde-webui/site-editor.html#/myproject/site.xml&lt;/span&gt;&lt;/span&gt; then it will request &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;/pde-webui/site-editor.html&lt;/span&gt;&lt;/span&gt; from &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;localhost:9234&lt;/span&gt;&lt;/span&gt;, followed by an attempt to find the anchor named &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;/myproject/site.xml&lt;/span&gt;&lt;/span&gt; in the HTML.  Even though it won't find this anchor, the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;document.location&lt;/span&gt;&lt;/span&gt; object will contain the full information. This means that our JavaScript code can just get the value of &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;document.location.hash&lt;/span&gt;&lt;/span&gt; and then make a corresponding XMLHttpRequest to get data from the server, which it then uses to fill the widgets. Once you know about this technique (which by the way has some nice properties with respect to the back button and the browser history), you will start to notice its use in many existing and widely used web-based applications. Like for example, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;https://mail.google.com/mail/#inbox&lt;/span&gt;&lt;/span&gt;, or &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;http://www.facebook.com/home.php#/bokowski?ref=profile&lt;/span&gt;&lt;/span&gt; :-)&lt;br /&gt;&lt;br /&gt;By now, if you are still following, we have a client-side web UI consisting of some HTML, CSS and JavaScript, that will access a server over HTTP to get the data that needs to be displayed. Let's now focus on the server part.&lt;br /&gt;&lt;br /&gt;Obviously, we need a place to serve our static .html, .css, and .js files. The canonical choice for this is to configure Jetty accordingly. I am instantiating my own instance of Jetty and instruct it to pick a port number for me. If I know that the web UI will only be accessed from the local machine, Jetty can be configured to only accept connections from localhost.&lt;br /&gt;&lt;br /&gt;For the RESTful interface, I implemented a servlet that&lt;br /&gt;&lt;ol&gt;&lt;li&gt;responds to a GET request with the data I need in JSON format, and that&lt;/li&gt;&lt;li&gt;accepts PUT requests when the user wants to save changed data.&lt;/li&gt;&lt;/ol&gt;In reality, the servlet does a little more (like e.g. authentication), but this post is already pretty long and I need to gloss over some of the details to not bore everyone to death.&lt;br /&gt;&lt;br /&gt;Let me just add one more thing - how did I implement the part of the servlet that converts the site.xml file into the JSON format I needed?&lt;br /&gt;&lt;br /&gt;The most obvious approach would be to parse the XML as a DOM and then generate JSON based on that DOM. Instead, I decided to use EMF objects as an intermediate "format". My idea was that by using EMF, the example code could easily be adapted to any data model that's already EMF based, and XML files (assuming they have an XML schema) could then be considered a special case.&lt;br /&gt;&lt;br /&gt;If you have an XML schema, you can let EMF create an .ecore file for you (using the New EMF Project wizard). For my use case, I chose to not generate any Java code from the .ecore file, because the code that generates JSON works on any EMF model, using generic EMF calls. This means that it should be very easy to change the schema, or even to use the same code for completely different models.&lt;br /&gt;&lt;br /&gt;Just to be clear, if you know that the format of your XML never changes, or if you want to minimize the external dependencies of your code, or if you enjoy programming against the DOM API ;-), or if adding EMF as another "layer" disturbs you, it's perfectly fine to not use EMF. Maybe it would even make sense to use XML on the client side as well.&lt;br /&gt;&lt;br /&gt;Overall, I was pretty happy with the structure that I came up with and think that it can serve as an example of how to approach the task of writing a web UI component. And now I'm looking forward to your comments, especially ones that explain how I could have made better decisions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-333551499310602113?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/65HSzDybJaw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/333551499310602113/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=333551499310602113" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/333551499310602113?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/333551499310602113?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/10/adventures-into-web-ui-land.html" title="Adventures into web UI land" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_9mAUrmH9eMo/StiOXaJW7fI/AAAAAAAAC3M/YBNREUOApr0/s72-c/sitexml-original.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CUcBQXYycCp7ImA9WxNWFk4.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-7748999734417383202</id><published>2009-10-15T11:47:00.004-05:00</published><updated>2009-10-15T13:57:30.898-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-15T13:57:30.898-05:00</app:edited><title>JSR 330 (Dependency Injection for Java) passed!</title><content type="html">Two days ago, &lt;a href="http://jcp.org/en/jsr/detail?id=330"&gt;JSR 330&lt;/a&gt; passed its &lt;a href="http://jcp.org/en/jsr/results?id=4992"&gt;final vote&lt;/a&gt;, and we now have a standard way to annotate Java classes for dependency injection. Thanks to the spec lead &lt;a href="http://www.crazybob.org/"&gt;Bob Lee&lt;/a&gt;, the JSR 330 expert group did its work in &lt;a href="http://twitter.com/joshbloch/status/4847948425"&gt;record time&lt;/a&gt;, &lt;a href="http://code.google.com/p/atinject/"&gt;in the open&lt;/a&gt;, and under &lt;a href="http://www.apache.org/licenses/LICENSE-2.0"&gt;one of the most permissive licenses&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Because of the transparency of the expert group work, it is no secret that I am &lt;a href="http://code.google.com/p/atinject/people/list"&gt;representing&lt;/a&gt; IBM in that group. I even implemented the spec in order to understand it better, and &lt;a href="http://groups.google.com/group/atinject-observer/browse_frm/thread/6eb81864296495e3#"&gt;made that implementation available&lt;/a&gt; as open source in the context of the &lt;a href="http://www.eclipse.org/e4/"&gt;e4&lt;/a&gt; project, which is the place where Eclipse Platform folks can experiment with new technologies. (Btw, I intend to put javax.inject &lt;a href="http://www.eclipse.org/orbit/overview.php"&gt;in Orbit&lt;/a&gt; for use by other Eclipse projects.)&lt;br /&gt;&lt;br /&gt;I am happy with the current state of JSR 330 and am looking forward to working with the expert group on a planned maintenance draft that will define a portable configuration API. Because with such an API, it will be possible to reuse application code across different injector implementations.&lt;br /&gt;&lt;br /&gt;Note that postings on this site are my own and don’t necessarily represent IBM’s positions, strategies or opinions. Similarly, IBM's votes on JSRs don't necessarily represent my personal positions, strategies, or opinions. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-7748999734417383202?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/QNlEMEDfQd8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/7748999734417383202/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=7748999734417383202" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/7748999734417383202?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/7748999734417383202?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/10/jsr-330-dependency-injection-for-java.html" title="JSR 330 (Dependency Injection for Java) passed!" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CUMGRnoyeip7ImA9WxNQGUw.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-7358060558593335093</id><published>2009-09-25T14:33:00.000-05:00</published><updated>2009-09-25T16:17:07.492-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T16:17:07.492-05:00</app:edited><title>Embedding web UI components in Eclipse using e4</title><content type="html">The demand for software that can be accessed through a web UI is increasing. We already expect software for occasional use (e.g. online shopping, banking, filling out forms, ...) to be accessible from a browser, without having to install anything locally. Over the last few years, more and more producticity applications (email, documents, spreadsheets, etc.) have become available through browsers as well. It is only a question of time until software development tools (at least for a certain class of uses) will have to have a web UI as well. In fact, a few browser-based IDEs already exist, such as Mozilla's &lt;a href="http://labs.mozilla.com/bespin/"&gt;Bespin project&lt;/a&gt;, and a very recent example: &lt;a href="http://mbed.org/democompiler/"&gt;embed&lt;/a&gt;, a special-purpose IDE for embedded development.&lt;br /&gt;&lt;br /&gt;At the same time, locally installed "rich client" applications, especially software development tools, aren't going to go away soon - there is a huge investment in the tools we have today, and I don't expect that all of this will be reimplemented using other technology just because web UIs are now the cool new thing to do.&lt;br /&gt;&lt;br /&gt;So the obvious question is, how can we, the Eclipse community, prepare ourselves for the trend towards the web, while keeping our desktop users happy?&lt;br /&gt;&lt;br /&gt;One approach is to keep the current programming model and just "make the stuff run in a browser". Fundamentally, this is very hard because the existing code we have today is not written with a client-server separation in mind. To a certain extent, it can be made to work though, and we have two examples of this at Eclipse, in form of the &lt;a href="http://www.eclipse.org/rap/"&gt;RAP project&lt;/a&gt;, and the experimental "&lt;a href="http://download.eclipse.org/e4/downloads/drops/R-0.9-200907291930/e4-news-all.html#swt"&gt;SWT Browser Edition&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;The basic idea behind &lt;a href="http://www.eclipse.org/rap/"&gt;RAP&lt;/a&gt; is to place all application and UI logic on the server, including all widgets and their state, and to render those widgets on the client in a web browser while sending user events back to the server. However, there are a couple of characteristics of RAP that limit its applicability: For example, the "stuff" you run in a browser will be a complete application as opposed to individual UI components, high-latency situations are problematic, and you cannot run application code on the client side. (I hope the RAP team will let me know in the comments if I got any of this wrong.)&lt;br /&gt;&lt;br /&gt;The work on &lt;a href="http://download.eclipse.org/e4/downloads/drops/R-0.9-200907291930/e4-news-all.html#swt"&gt;SWT BE&lt;/a&gt; "browser edition" is another take at the same problem, taking, if you will, the opposite approach: Client code (application and UI logic) makes use of the SWT API and as such can run in a desktop situation just fine. For "making it run in a browser", all the code is cross-compiled - to JavaScript for the Dojo port of SWT, or to ActionScript for the Flex port of SWT. So in a nutshell, instead of placing all application code on the server as with RAP, all application code ends up running on the client, in a browser. The obvious problem with this approach is that you still need code that runs on the server, to at least send data to the client and to receive updated data from the client, and that more often than not, you will end up with too much code on the client for execution. Of course, you could rewrite your existing code and ensure a proper client-server split, but if you are rewriting it anyway, why not go all the way and rewrite it using HTML and JavaScript?&lt;br /&gt;&lt;br /&gt;For the e4 0.9 release, we have done the first step of exactly that - we rewrote or "cloned" an existing component using HTML, CSS, JavaScript, and Dojo on the client side. The idea is to gradually move certain components (not complete applications) over to use web technology, while still having these components appear in the desktop Eclipse client as first-class citizens. As a first example, we chose the PDE site.xml editor, because of its relative simplicity but also because it is a good representative of a whole class of form-based UI components in Eclipse. We wanted the end result to run in a regular browser, as well as an editor inside of Eclipse. Here you can see it running stand alone in a browser:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9mAUrmH9eMo/Srwcwwru95I/AAAAAAAAC1E/J8kZZaEfZ-k/s1600-h/site-editor.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 238px;" src="http://4.bp.blogspot.com/_9mAUrmH9eMo/Srwcwwru95I/AAAAAAAAC1E/J8kZZaEfZ-k/s400/site-editor.png" alt="" id="BLOGGER_PHOTO_ID_5385210878455904146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To make the editor work in a regular browser, it had to have a "real" server-side counterpart. Luckily, Eclipse already ships with an embedded servlet container, Jetty. This means that the web UI editor could talk to a servlet running in the same VM as the embedded browser widget rendering the UI. This is not unheard of at all - the Eclipse help system is taking the exact same approach.&lt;br /&gt;&lt;br /&gt;However, just presenting the unchanged web UI in an embedded SWT browser widget - backed by IE if you run Windows, Firefox on Linux, and Safari on the Mac - is not enough. The editor would only be a first-class citizen in the Eclipse UI if, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you didn't have to authenticate to the web UI every time you open an editor,&lt;/li&gt;&lt;li&gt;the editor signaled unsaved changes through the usual "*" in the editor tab, as opposed to an indicator in the editor itself,&lt;/li&gt;&lt;li&gt;you can trigger saving your changes using the menu (File&gt;Save ),&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;In other words, the editor needs to make use of appropriate Eclipse APIs that connect Eclipse UI components such as views and editors to their context: the Eclipse workbench. One of the goals of e4 has always been to simplify the core APIs, and to make them accessible from other programming languages. So in a sense, we have started to make this real by offering JavaScript APIs that can be called by web UI components: to signal that they have unsaved changes, to provide a callback that will save those changes, etc.&lt;br /&gt;&lt;br /&gt;Give it a try! After &lt;a href="http://download.eclipse.org/e4/downloads/drops/R-0.9-200907291930/index.html"&gt;downloading the e4 0.9 SDK&lt;/a&gt;, start it up with an empty workspace and create an update site project (Ctrl+3, 'nusp'). Add some features and categories to it using the regular PDE site.xml editor, save, and then right-click on the site.xml file and use "Open With" to open it with the web-based editor. It will look like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9mAUrmH9eMo/Sr0xHX1oWsI/AAAAAAAAC1M/i3K2oeqwdCw/s1600-h/e4-site-editor-integrated.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 302px;" src="http://1.bp.blogspot.com/_9mAUrmH9eMo/Sr0xHX1oWsI/AAAAAAAAC1M/i3K2oeqwdCw/s400/e4-site-editor-integrated.png" alt="" id="BLOGGER_PHOTO_ID_5385514732132784834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Please leave comments if you have any questions. I will try to write up more about this in the next couple of days, going into more technical detail.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-7358060558593335093?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/VpQo_Dl2u3U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/7358060558593335093/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=7358060558593335093" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/7358060558593335093?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/7358060558593335093?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/09/embedding-web-ui-components-in-eclipse.html" title="Embedding web UI components in Eclipse using e4" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_9mAUrmH9eMo/Srwcwwru95I/AAAAAAAAC1E/J8kZZaEfZ-k/s72-c/site-editor.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;DUYDRns8fCp7ImA9WxNQGEw.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-4170876607988814068</id><published>2009-09-24T11:35:00.005-05:00</published><updated>2009-09-24T13:32:57.574-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-24T13:32:57.574-05:00</app:edited><title>API compatibility matters</title><content type="html">A few weeks ago, Palm has &lt;a href="http://developer.palm.com/"&gt;released an SDK&lt;/a&gt; called "Mojo" for their &lt;a href="http://developer.palm.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1772"&gt;WebOS&lt;/a&gt;. They also offer Eclipse plug-ins that have been developed for and tested with Eclipse 3.4.2. I just read a &lt;a href="http://www.eweek.com/c/a/Application-Development/REVIEW-Eclipse-Gets-Palm-webOS-Mojo-816169/"&gt;short review&lt;/a&gt; of this Eclipse-based tooling and was happy to see the following:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;The WebOS plug-in is supposed to officially work with Version 3.4.2 of Eclipse (code-named Ganymede). However, I was able to successfully run it on Version 3.5 of Eclipse (code-named Galileo) without any problems.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;It makes me happy to see real-world reports like this. They confirm that you can run plug-ins developed for older versions of Eclipse on more current versions. In the Eclipse community, we almost take this for granted and sometimes tend forget the effort involved in pulling this off. Because when you think about it, compatibility is only achieved when both sides do a good job of enabling compatibility:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On the Eclipse SDK side, we tend to think that we are doing good job of ensuring API compatibility between Eclipse releases, so that you can run older plug-ins on newer versions of Eclipse. Since Eclipse 1.0 (2001), we've had excellent rules in places around API compatibility, and if you want to read more I'd recommend you start at our "&lt;a href="http://wiki.eclipse.org/API_Central"&gt;API Central&lt;/a&gt;" wiki page. More recently, we've automated a lot of the necessary compatibility checking in form of &lt;a href="http://www.eclipse.org/pde/pde-api-tools/"&gt;API tooling&lt;/a&gt; that ships with the Eclipse SDK. I haven't seen anything like it for other languages or environment yet, but would like to hear if similar tooling exists elsewhere. C#? ActionScript? Let me know in the comments!&lt;/li&gt;&lt;li&gt;On the Palm Mojo side, the developers must have done a good job of only using documented APIs, and abiding by the contracts for those APIs. Because if you don't, all bets are off.&lt;/li&gt;&lt;/ul&gt;Here is a quote from the 2001 article "&lt;a href="http://www.eclipse.org/articles/article.php?file=Article-API-Use/index.html"&gt;How to use the Eclipse API&lt;/a&gt;" by Jim des Rivieres, a recommended read for anyone developing Eclipse plug-ins:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;As the Eclipse platform matures and evolves, it will be the API contracts that guide how this evolution happens. Outside of these contracts, everything is unsupported and subject to change, without notice, and at any time [...]. Client code that oversteps the above rules might fail on different versions and patch levels of the platform; or when run on different underlying OSes; or when run with a different mix of co-resident plug-ins; or when run with a different workbench perspective; and so on. [...] To those who choose to ignore the rules, don't say that you weren't warned. And don't expect much more than a sympathetic "Told you so."&lt;/blockquote&gt;Of course, in reality, life is never as easy and black-and-white as software developers would like it to be. Sometimes, the existing API doesn't work for your particular case, or there is no supported API at all. In these cases, however, you need to realize that by calling internals, you are assuming &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debt&lt;/a&gt;. The idea behind this metaphor, created by Ward Cunningham, is that you have taken a shortcut and need to pay up later, either in form of interest payments or paying back the principal. In concrete terms: Whenever a new version of the plug-ins you depend on comes out, you have the cost of testing  that your code still works, and the cost of adapting to any change that may have broken your code. This is a recurring cost, hence the term "interest". If you want your code to run against both older and newer versions of your dependencies, the interest payments are much greater, because the problem is much harder. Often, you will need to use Java reflection to guard your calls to internals. Alternatively, you can pay back the "principal" at a later point in time, when the necessary API has been added, and get rid of your debt. You did file an enhancement request to get that API added, didn't you? Because if you don't, you'll be bound to pay interest forever!&lt;br /&gt;&lt;br /&gt;Every now and then, I encounter people who are hoping to get away without paying either interest or principal. And that's after our collective experience with how &lt;a href="http://en.wikipedia.org/wiki/Collateralized_debt_obligation"&gt;schemes&lt;/a&gt; based on trading debts can take the whole economy down! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-4170876607988814068?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/s3AGLYn2pak" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/4170876607988814068/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=4170876607988814068" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/4170876607988814068?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/4170876607988814068?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/09/api-compatibility-matters.html" title="API compatibility matters" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;DkQCRnc8cCp7ImA9WxVUFUU.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-2318713048407644208</id><published>2009-03-20T16:11:00.005-05:00</published><updated>2009-03-20T16:26:07.978-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-20T16:26:07.978-05:00</app:edited><title>Thank you!</title><content type="html">I am looking forward to attending my first &lt;a href="http://www.eclipse.org/org/press-release/20090320_EclipseBoard.php"&gt;Eclipse Board&lt;/a&gt; meeting on Monday. This first time, I will be a guest since my term of office starts in April. Unfortunately, I can only attend the second half because I am co-presenting a tutorial in the morning. Sorry about that, it won't happen again. ;-)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks to all who voted!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-2318713048407644208?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/0MD2oKNn2eY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/2318713048407644208/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=2318713048407644208" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/2318713048407644208?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/2318713048407644208?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/03/thank-you.html" title="Thank you!" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;C0MEQnw8eSp7ImA9WxVUFUw.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-1814324866302361553</id><published>2009-03-19T19:59:00.003-05:00</published><updated>2009-03-19T20:10:03.271-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-19T20:10:03.271-05:00</app:edited><title>RCP Mail 2.0</title><content type="html">&lt;div&gt;Come to &lt;a href="http://www.eclipsecon.org/2009/sessions?id=641"&gt;our EclipseCon 2009 tutorial&lt;/a&gt; (Monday March 23, 8:00 - 12:00) if you would like to learn about best practices for data binding, commands/handlers/contributions, and the common navigator. Bring your laptop with a copy of &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.5M6-200903130100/index.php"&gt;Eclipse SDK 3.5 M6&lt;/a&gt; for the hands-on excercises!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Three RCP practitioners, and three Platform UI committers for a total of six people will help you understand and build RCP Mail 2.0. Should be fun!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9mAUrmH9eMo/ScLqk8cN2sI/AAAAAAAABic/RNS1CbA7EA8/s1600-h/rcpmail2-splash.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 242px;" src="http://1.bp.blogspot.com/_9mAUrmH9eMo/ScLqk8cN2sI/AAAAAAAABic/RNS1CbA7EA8/s400/rcpmail2-splash.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5315068430671272642" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-1814324866302361553?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/xf5OAfUaaJ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/1814324866302361553/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=1814324866302361553" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1814324866302361553?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1814324866302361553?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/03/rcp-mail-20.html" title="RCP Mail 2.0" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_9mAUrmH9eMo/ScLqk8cN2sI/AAAAAAAABic/RNS1CbA7EA8/s72-c/rcpmail2-splash.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CUMNR388eCp7ImA9WxVWFE8.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-1348243402368185833</id><published>2009-02-23T16:10:00.001-05:00</published><updated>2009-02-23T16:11:36.170-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-23T16:11:36.170-05:00</app:edited><title>2009 Eclipse Board of Directors</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;a href="https://foundation.eclipse.org/vote2009"&gt;&lt;img src="http://www.eclipse.org/membership/vote2008/vote.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;You have probably seen &lt;a href="http://dev.eclipse.org/mhonarc/lists/eclipse.org-members-committers/msg00005.html"&gt;Mike's email&lt;/a&gt; - the elections for &lt;a href="http://www.eclipse.org/org/elections/nominees.php"&gt;committer representatives&lt;/a&gt; for the Eclipse Board of Directors is now open.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Rather than explaining why you should vote for me :-), I thought it would be useful to summarize the key election facts:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You are voting for a one-year term starting April 2009. Voting is open as of today, for three weeks until March 13, 3 pm Eastern time. Check out the &lt;a href="http://www.eclipse.org/org/elections/nominees.php"&gt;committer candidates&lt;/a&gt; and their vision statements.&lt;/li&gt;&lt;li&gt;To vote, check the email you received from emo@eclipse.org on Feb 20, 2009. It contains the &lt;a href="https://foundation.eclipse.org/vote2009/"&gt;URL&lt;/a&gt; for voting, as well as the required voting password.&lt;/li&gt;&lt;li&gt;The Board will have 24 directors, as follows:&lt;ul&gt;&lt;li&gt;Sixteen directors for the &lt;a href="http://www.eclipse.org/membership/showMembersWithTag.php?TagID=strategic"&gt;strategic members&lt;/a&gt;, one seat per member.&lt;/li&gt;&lt;li&gt;Four directors from "&lt;a href="http://www.eclipse.org/membership/vote2008/"&gt;sustaining members&lt;/a&gt;". There are nine candidates, and sustaining members (companies) get to vote. This is the old "add-in providers" category but generalized to include "enterprise members" in the future.&lt;/li&gt;&lt;li&gt;Four directors representing the committers. There are six &lt;a href="http://www.eclipse.org/org/elections/nominees.php"&gt;committer candidates&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Each committer has one vote. Here are some important details:&lt;ul&gt;&lt;li&gt;Committers who are employed by a member company can go ahead and vote. Note though that all votes from one company will be &lt;a href="http://ed-merks.blogspot.com/2008/02/one-committer-one-vote.html"&gt;collapsed into a single vote&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style=""&gt;Individual committers, if they have not done so yet, must sign a membership agreement in order to be able to vote&lt;/span&gt;. To understand why this is required, read &lt;a href="http://www.eclipse.org/membership/become_a_member/committer.php"&gt;this page&lt;/a&gt;, then read &lt;a href="http://www.eclipse.org/membership/become_a_member/membershipProcess.php"&gt;this page&lt;/a&gt; to make sure you fill out &lt;a href="http://www.eclipse.org/org/documents/Eclipse%20MEMBERSHIP%20AGMT%202008_04_16%20Final.pdf"&gt;the form&lt;/a&gt; correctly. No voting privileges without signing the form!&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;In previous years, &lt;a href="http://milinkovich.blogspot.com/2008/03/election-results.html"&gt;turnout was pretty low&lt;/a&gt; - for example in 2008, only 148 of about 1,000 committers cast their vote. More votes will add weight to the positions of the committer representatives, so please vote now!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is more than one &lt;a href="http://www.eclipsesoccerclub.com/board.shtml"&gt;Eclipse Board of Directors&lt;/a&gt;, so be careful not to confuse the different &lt;a href="http://www.firstcolonysoccer.com/club_pages/documents/Board_Volunteer_Document_08.pdf"&gt;board elections&lt;/a&gt;. ;-)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-1348243402368185833?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/j9E_FvtyV3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/1348243402368185833/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=1348243402368185833" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1348243402368185833?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1348243402368185833?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/02/2009-eclipse-board-of-directors.html" title="2009 Eclipse Board of Directors" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;CEQBQXc_fSp7ImA9WxVXGUw.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-919910618557836363</id><published>2009-02-17T18:07:00.000-05:00</published><updated>2009-02-17T18:12:30.945-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-17T18:12:30.945-05:00</app:edited><title>Eclipse in the Cloud</title><content type="html">&lt;div&gt;&lt;div&gt;About a year ago, at EclipseCon, we showed a demo of how the Eclipse IDE could look like if it was browser-based, talking to an Eclipse server "in the cloud". The reactions were lukewarm: "Looks cool, but &lt;a href="http://www.infoq.com/news/2008/05/e4-summit#view_23644"&gt;why&lt;/a&gt; would I want to run an IDE in a browser?" "I have &lt;a href="http://www.lemmster.de/blog/index.php/2008/03/20/173/#comment-23615"&gt;yet to see&lt;/a&gt; web enabled IDEs as an industry trend".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This industry trend is now starting to happen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;On Thursday, Mozilla and their new &lt;a href="http://labs.mozilla.com/2008/10/developer-tools-and-the-open-web/"&gt;developer tools lab&lt;/a&gt; launched Bespin, an "&lt;a href="http://labs.mozilla.com/projects/bespin/"&gt;experiment proposing an open, extensible web-based framework for code editing&lt;/a&gt;". Within a few days, 30,000 people logged into their public server, 400 people joined their discussion group, about 50 bugs were filed, several of them with patches, and many articles, blogs and even a Wikipedia entry were written. Congratulations, &lt;a href="http://galbraiths.org/blog/"&gt;Ben&lt;/a&gt; and &lt;a href="http://almaer.com/blog/"&gt;Dion&lt;/a&gt; of Mozilla (and Ajaxian fame), on the successful launch!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We looked at Bespin and asked, wouldn't it be great if Eclipse could play in this space too? Wouldn't it be cool if we could implement a Bespin server using Eclipse plug-ins that already exist?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well... that Eclipse-based Bespin server is available now, after two days of development!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dev.eclipse.org/mhonarc/lists/e4-dev/msg00398.html"&gt;Simon Kaegi&lt;/a&gt; and I locked ourselves into a room and just implemented it. Today, we are declaring success, and are sharing the code as part of the e4 project with anyone interested. If you would like to give it a spin, check out &lt;a href="http://wiki.eclipse.org/E4/Bespin"&gt;this wiki page&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Eclipse IDE, as you know it, is an OSGi-based application, and is built entirely out of components (called plug-ins or bundles). Many of these components can run headless, on a server, such as the underlying resource model, the incremental Java compiler, etc. Using the headless components, it was very easy to implement the Bespin client-server API. Like Mozilla's Bespin server, our server supports browsing files and folders, and editing files. In addition to that, we implemented extra features such as showing compile errors and warnings, and checking out projects from CVS servers using anonymous CVS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bespin already shows a lot of promise at this early stage. It consists of a surprisingly fast code editor written in JavaScript using Canvas, a file browser, and an emacs-like command line interface for issuing commands. There are two backend implementations provided by Mozilla, one in Python, and one in Java, and the browser-based client talks to the server using a RESTy API. Here is how it looks like:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9mAUrmH9eMo/SZsk5j0a2hI/AAAAAAAABcw/uPXbXP5rftk/s1600-h/bespin-eclipse.png"&gt;&lt;img src="http://2.bp.blogspot.com/_9mAUrmH9eMo/SZsk5j0a2hI/AAAAAAAABcw/uPXbXP5rftk/s400/bespin-eclipse.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5303873557445138962" style="cursor: pointer; width: 400px; height: 346px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you would like to play with the Eclipse Bespin server, or work with us on it, check our &lt;a href="http://wiki.eclipse.org/E4/Bespin"&gt;wiki page&lt;/a&gt;. If there are any questions, hop on &lt;a href="http://wiki.eclipse.org/IRC"&gt;IRC&lt;/a&gt;, where we can be found on &lt;a href="irc://irc.freenode.net/#eclipse-e4"&gt;#eclipse-e4/irc.freenode.net&lt;/a&gt; or &lt;a href="irc://irc.mozilla.org/#bespin"&gt;#bespin/irc.mozilla.org&lt;/a&gt; as borisb6i and skaegi.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;P.S. Mozilla has a cool-looking and fast client, and Eclipse has a lot of experience with IDE features, and good amounts of code that can run headless. Sounds like a great opportunity for collaboration, doesn't it? Well, thanks to &lt;a href="http://dev.eclipse.org/blogs/mike/"&gt;Mike&lt;/a&gt; and the Eclipse Foundation who organized it, and Dion and Ben who are investing their time and some of Mozilla's travel money, we will have an in-person meeting on Thursday, in Ottawa, to talk about this. These guys are moving fast!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-919910618557836363?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/VtubKdmKbZA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/919910618557836363/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=919910618557836363" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/919910618557836363?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/919910618557836363?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/02/eclipse-in-cloud.html" title="Eclipse in the Cloud" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_9mAUrmH9eMo/SZsk5j0a2hI/AAAAAAAABcw/uPXbXP5rftk/s72-c/bespin-eclipse.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">16</thr:total></entry><entry gd:etag="W/&quot;C0IGQno8fCp7ImA9WxVQGEo.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-1962745938845780249</id><published>2009-02-05T16:51:00.002-05:00</published><updated>2009-02-05T17:05:23.474-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-05T17:05:23.474-05:00</app:edited><title>Bundle Marketplace: +1</title><content type="html">I fully agree with Gorkem Erkan that the Eclipse community should seriously consider building a &lt;a href="http://www.gorkem-ercan.com/2009/02/bundle-marketplace.html"&gt;bundle marketplace&lt;/a&gt;. In fact, I recently had the same idea (independently) as you can see &lt;a href="http://twitter.com/bokowski/status/1032571945"&gt;here&lt;/a&gt; on Twitter.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the Eclipse context, that bundle marketplace would probably consist of multiple overlapping sub-markets... with every Eclipse-based application defining a sub-market. For example, bundles that work with the Eclipse IDE, bundles that work with the Flex IDE, or the SAP IDE, or with IBM's Rational tools such as Team Concert. Also, at the RCP level, vendors could offer a basic application for free and offer upgrades as additional for-pay bundles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think this an exciting idea. What do we need to do to make it happen? Would the &lt;a href="http://www.eclipse.org/org/elections/"&gt;Eclipse Board of Directors&lt;/a&gt; support this? Which members of the Eclipse community (other than &lt;a href="http://www.threeriversinstitute.org/junitmax/subscribe.html"&gt;Kent Beck&lt;/a&gt; ;-) ) would benefit the most, short-term?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Looking forward to your comments.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-1962745938845780249?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/4xKZhBAGeP4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/1962745938845780249/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=1962745938845780249" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1962745938845780249?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1962745938845780249?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2009/02/bundle-marketplace-1.html" title="Bundle Marketplace: +1" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUcFQnkzfSp7ImA9WxRXEUU.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-3155902610913461403</id><published>2008-10-16T11:48:00.000-05:00</published><updated>2008-10-16T13:50:13.785-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-16T13:50:13.785-05:00</app:edited><title>Are you listening?</title><content type="html">&lt;span class="Apple-style-span"  style=" ;font-family:'Times New Roman';"&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;&lt;div&gt;Did you know that the Eclipse SDK alone has over 250 different listener interfaces? In the following screenshot, look at the size of the scrollbar slider!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9mAUrmH9eMo/SNr8wzRrgvI/AAAAAAAAAq0/qIavMv8wIOk/s1600-h/listeners.PNG"&gt;&lt;img src="http://3.bp.blogspot.com/_9mAUrmH9eMo/SNr8wzRrgvI/AAAAAAAAAq0/qIavMv8wIOk/s400/listeners.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5249786230982017778" style="cursor: pointer; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is only the tip of the iceberg - corresponding to all these listener interfaces, there are about 250 different Event classes. This is so that later on, additional event data can be added without breaking binary API compatibility by passing a dedicated event object to the listener. (&lt;a href="http://borisoneclipse.blogspot.com/2008/09/accidental-complexity.html"&gt;Remember&lt;/a&gt; that where we forgot to use event objects, we ended up with warts like IPerspectiveListener4.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To top it off, there are probably about 500 methods for adding and removing all these kinds of listeners. addLaunchLabelChangedListener/removeLaunchLabelChangedListener, addLocalSiteChangedListener/removeLocalSiteChangedListener, addLogEntryListener/removeLogEntryListener and so on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the end, when you think about it at a more abstract level, there are only a couple of possible changes that can happen in a program. A value can change, from an old value to a new value. A set can change, by adding or removing elements. A list can change, by adding elements at a certain index, removing elements at an index, or moving or replacing elements.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How about we use only three listener interfaces, IValueChangeListener, ISetChangeListener, and IListChangeListener? Or we settle on something that looks like &lt;a href="http://www.eclipse.org/emf"&gt;EMF&lt;/a&gt;'s &lt;a href="http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.emf.doc/references/javadoc/org/eclipse/emf/common/notify/Notification.html"&gt;notification API&lt;/a&gt;. We might need pre- and post-notifications, and maybe also changes to maps, so the resulting number of listener interfaces might be closer to ten. Definitely not 500 - and I only looked at the base Eclipse SDK...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What do you think? Can we make the Eclipse API more consistent and uniform in this way? Do you agree that all these domain-specific listener interfaces, each with a corresponding event class, and add/remove methods, are a source of &lt;a href="http://borisoneclipse.blogspot.com/2008/09/accidental-complexity.html"&gt;accidental complexity&lt;/a&gt;, and settling on a small number of generic listener APIs can reduce &lt;a href="http://dev.eclipse.org/mhonarc/lists/eclipse-incubator-e4-dev/msg00838.html"&gt;code bloat&lt;/a&gt;?&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-3155902610913461403?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/bw1tffVe6ak" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/3155902610913461403/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=3155902610913461403" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3155902610913461403?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3155902610913461403?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/10/are-you-listening.html" title="Are you listening?" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_9mAUrmH9eMo/SNr8wzRrgvI/AAAAAAAAAq0/qIavMv8wIOk/s72-c/listeners.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry gd:etag="W/&quot;DUYFSX05eyp7ImA9WxRQFE4.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-3571233524785867569</id><published>2008-10-07T15:30:00.000-05:00</published><updated>2008-10-07T22:38:38.323-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-07T22:38:38.323-05:00</app:edited><title>Avoiding Bloat</title><content type="html">Martin Oberhuber asked on the e4 mailing list what had happened to the pervasive architectural themes that were identified at the summit, such as reducing bloat, too many listeners, and becoming more asynchronous. I started writing a response, focusing on one of the topics, bloat, and it quickly became more than just an email response so I am posting it here.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Before we go into the details, let me state the obvious: It is pretty much guaranteed that we will cause more bloat, overall, for the case of the Eclipse SDK based on the new e4 platform, as long as that SDK still contains 3.x plug-ins that require compatibility layers. This is because all the old (bloated?) functionality and the new (lean?) functionality will be there at the same time.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9mAUrmH9eMo/SOwm94IIBiI/AAAAAAAAAr8/wQ-QUokQeyQ/s1600-h/Copy+of+DSC00685.JPG"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_9mAUrmH9eMo/SOwm94IIBiI/AAAAAAAAAr8/wQ-QUokQeyQ/s400/Copy+of+DSC00685.JPG" alt="" id="BLOGGER_PHOTO_ID_5254617709714867746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;It seems the best we can do is to avoid bloating the new platform itself, when it is used without any compatibility layers. Unfortunately, we have all these cool new technologies that we would like to use - EMF, CSS, declarative UIs, data binding, cross-compiling of Java to ActionScipt, being able to use multiple languages, client-server split, etc. Put them together and the likely result is bloat. Or is there a way to avoid bloat and use cool new technology at the same time?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;So what is bloat? Let's look at &lt;a href="http://en.wikipedia.org/wiki/Software_bloat"&gt;Wikipedia's definition of software bloat&lt;/a&gt; (thanks John Arthorne for pointing me to it):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Software bloat&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;, also known as &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;bloatware&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt; or &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;elephantware&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;, is a term used in both a neutral and disparaging sense, to describe the tendency of newer computer programs to be larger, or to use larger amounts of system resources (mass storage space, processing power or memory) than necessary for the same or similar benefits from older versions to its users.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Let me dive into one concrete example, to show why this is a hard problem:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Code bloat through redundancy, caused by low-level API&lt;/span&gt; occurs when clients of a low-level API have to write the same boilerplate code over and over again. Think of all the code we have to write for SWT layouts, for example:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Composite contents = new Composite(parentComposite, SWT.NONE);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;contents.setLayoutData(new GridData(GridData.FILL_BOTH));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;GridLayout layout = new GridLayout();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;layout.numColumns = 2;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;contents.setLayout(layout);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Label label = new Label(contents, SWT.LEFT);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;label.setText(WorkbenchMessages.FileExtension_fileTypeLabel);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;GridData data = new GridData();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;data.horizontalAlignment = GridData.FILL;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;label.setLayoutData(data);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;filenameField = new Text(contents, SWT.SINGLE | SWT.BORDER);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;data = new GridData();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;data.horizontalAlignment = GridData.FILL;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;data.grabExcessHorizontalSpace = true;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;filenameField.setLayoutData(data);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Whenever there is a low-level way of doing things, you can come up with a higher-level way and reduce the code size. Of course, you are only reducing the overall code size when the higher-level abstraction is used widely enough to amortize the cost of its implementation. In our SWT layout example, you could write instead:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;Composite contents = new Composite(parentComposite, SWT.NONE);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;contents.setLayoutData(new GridData(GridData.FILL_BOTH));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;new Label(contents, SWT.LEFT).setText(label);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;filenameField = new Text(contents, SWT.SINGLE | SWT.BORDER);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;Point defaultMargins = LayoutConstants.getMargins();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;GridLayoutFactory.fillDefaults().numColumns(2).margins(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;font-size:85%;" &gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=";font-family:'courier new';font-size:85%;"  &gt;&lt;span class="Apple-style-span"&gt;defaultMargins.x, defaultMargins.y).generateLayout(contents);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Now this is looking a lot shorter, and maybe even more elegant. However, even if &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;GridLayoutFactory&lt;/span&gt; is used widely enough to amortize the additional footprint caused by its implementation, there are still two problems: first, the original code ran faster, and second, you now have to learn two APIs - the higher-level one, and the lower-level one when the abstraction gets in your way.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can see where I am going - there is no clear cut solution to this. It is really a hard problem, and in many cases, we will have to trade off one of the factors disk size, memory size, CPU consumption against the others.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9mAUrmH9eMo/SOwlmAgS--I/AAAAAAAAAr0/ggOfER24a34/s1600-h/Copy+of+DSC00889.JPG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_9mAUrmH9eMo/SOwlmAgS--I/AAAAAAAAAr0/ggOfER24a34/s400/Copy+of+DSC00889.JPG" alt="" id="BLOGGER_PHOTO_ID_5254616200135244770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Taking it just a little further, here is another idea, taken from the &lt;a href="http://en.wikipedia.org/wiki/Code_bloat"&gt;wikipedia article on code bloat&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;The difference in code density between various languages is so great that often less memory is needed to hold both a program written in a "compact" language (such as a domain-specific programming language, Microsoft P-Code, or threaded code), plus an interpreter for that compact language (written in native code), than to hold that program written directly in native code.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if we had a domain-specific language for creating SWT widgets and specifying their layout, we could get away with no Java code at all! I don't know if the .class file is a space efficient encoding for SWT widget hierarchies and layouts, but even if it is, consider this: The byte code for creating the widgets will stay in memory for as long as its class is referenced. Chances are that this will be a very long time; at least for the time that particular part of the UI is materialized somewhere. By comparison, if we had a domain-specific language, it would have to be read once to create the widgets and layout, after which the memory could be freed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So maybe we can have our cake and eat it too!  After thinking about this a bit, I am all excited about using cool new technologies, as long as they don't cause bloat.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9mAUrmH9eMo/SOwiVEMiPYI/AAAAAAAAArs/GKb6L4Q0xVI/s1600-h/Copy+of+DSC06054.JPG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_9mAUrmH9eMo/SOwiVEMiPYI/AAAAAAAAArs/GKb6L4Q0xVI/s400/Copy+of+DSC06054.JPG" alt="" id="BLOGGER_PHOTO_ID_5254612610533440898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We also have to be very carfeful not to use multiple redundant technologies to achieve the same thing, because that is another source of bloat. As in, for example, letting everyone plug in their favourite domain specific language for creating SWT widgets and layouts. This kind of redundancy would be just as bad as redundancy through repetitive boilerplate code, so let's pick one way of doing declarative UIs!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that there are lots of other sources of bloat, for example, unneeded functionality, too many layers of abstraction, or unnecessary flexibility. I am running out of time but it is probably interesting to think about these as well. I'd like to know if you have any pointers for me in the comments!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If avoiding bloat is one of the goals of e4, we need to keep this goal in mind all the time. Every bit of functionality should be pulling its own weight. For example, do not add convenience API unless its additional weight can be justified by reduced weight somewhere else.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe we should start watching our weight from the very beginning, and from time to time, it is probably healthy to discuss the weight of the various pieces. I can't wait until we have some kind of continuous build in place, so that we can make it visible for everyone how big (or small!) the components are, and how they are growing (or shrinking!) over time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We could also borrow some ideas from the business world and introduce budgets. You want to provide a component for declarative UI? How about you get an allowance of 300 K? Would that be enough?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What do you think?&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-3571233524785867569?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/owLc6blwKTo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/3571233524785867569/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=3571233524785867569" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3571233524785867569?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3571233524785867569?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/10/avoiding-bloat.html" title="Avoiding Bloat" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_9mAUrmH9eMo/SOwm94IIBiI/AAAAAAAAAr8/wQ-QUokQeyQ/s72-c/Copy+of+DSC00685.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total></entry><entry gd:etag="W/&quot;AkUBRH86eSp7ImA9WxRRE0s.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-6323554618318168270</id><published>2008-09-25T13:38:00.000-05:00</published><updated>2008-09-25T13:44:15.111-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-25T13:44:15.111-05:00</app:edited><title>Accidental Complexity</title><content type="html">&lt;div&gt;&lt;div&gt;You can blame bit rot, API backwards compatibility, plain stupidity, or that we just didn't know any better at the time. Whatever the cause, we have introduced a good deal of accidental complexity over the last eight years or so, and with e4, we have a chance to reduce this or get rid of the "accidental" part altogether.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are some examples. If you know of other examples, please let me know!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First example: We have lots of early attempts to define &lt;a href="http://wiki.eclipse.org/API_Central"&gt;API&lt;/a&gt; that had to be tweaked later; to see what I mean, press Ctrl+T for the Open Type dialog and enter 'I*2&lt;' to see all the interfaces where we had to introduce a second and hopefully better version. Like IPerspectiveListener2, which was introduced in 3.0. This example is particularly embarassing, because we introduced IPerspectiveListener3 in 3.1. And, believe it or not, IPerspectiveListener4 in 3.2. Boy, am I glad that this has finally converged, or we would be looking at IPerspectiveListener7 in Eclipse 3.5. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9mAUrmH9eMo/SNrvDKC6zZI/AAAAAAAAAqk/E-EClRbOJEk/s1600-h/Istar2lt.PNG"&gt;&lt;img src="http://3.bp.blogspot.com/_9mAUrmH9eMo/SNrvDKC6zZI/AAAAAAAAAqk/E-EClRbOJEk/s400/Istar2lt.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5249771153168977298" style="cursor: pointer; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second example: The confusing (and &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143727"&gt;untold&lt;/a&gt;) preferences story comes to mind, as a representative of a whole class of problems. Basically, whenever we ended up with many different ways to do the same thing, we were not able to remove old code because clients still depended on it. I am optimistic that the capabilities offered by the platform can be pared down to a manageable list. Ideally, down to something like twenty services, sometimes called "the twenty things" or the "Eclipse Application Model" in the context of e4. Like being able to persist data. Receive input. Produce selections. Schedule background work. Report progress. Provide pointers into the help system. Contribute to the menus and toolbars. And so on, but I don't have a full list at this point so I should write about it when I know more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Third example: Like many other Java APIs, we live in a &lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;kingdom of nouns&lt;/a&gt;. We are sometimes joking how Eclipse, for every concept, has an adapter, a factory, and a manager. And an adapter factory, and a factory manager. Sadly, this is not a joke at all. C&lt;span class="Apple-style-span" style="font-style: italic;"&gt;ontextManagerFactory&lt;/span&gt;. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;ModifierHelperFactory&lt;/span&gt;. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;AbstractRefactoringDescriptorResourceMapping&lt;/span&gt;. I wish I could make concrete suggestions for how we can improve on this, but I am afraid we need to look at these APIs in detail. It's just a gut feeling that names with three or more three nondescript nouns are making things more complicated than necessary. By the way, my mother tongue is German, so I should be used to putting many nouns together, but I still find something like &lt;span class="Apple-style-span" style="font-style: italic;"&gt;INodeAdapterFactoryManager&lt;/span&gt; is way over the top.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fourth example: a good deal of complexity and bloat is caused by the proliferation of preference pages, leading to a countless number of lines of code that supports all the different combinations of all the supported preferences. Are we really helping our users by exposing and maintaining all these options?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9mAUrmH9eMo/SNrywns_04I/AAAAAAAAAqs/mioAwBfgdQ4/s1600-h/preferences.PNG"&gt;&lt;img src="http://2.bp.blogspot.com/_9mAUrmH9eMo/SNrywns_04I/AAAAAAAAAqs/mioAwBfgdQ4/s400/preferences.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5249775232759092098" style="cursor: pointer; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it for today. I'd love to hear what you think about this, or if you have more examples of accidental complexity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Disclaimer: I am well aware that e4 will need to be backwards-compatible, so that 3.x plugins continue to run. When I wrote "get rid of" I meant something a little more subtle, as in "move it to compatibility plug-ins so that adopters of e4 don't have to worry about it when they develop new functionality.")&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-6323554618318168270?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/yWbOpniVCTM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/6323554618318168270/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=6323554618318168270" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6323554618318168270?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6323554618318168270?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/09/accidental-complexity.html" title="Accidental Complexity" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_9mAUrmH9eMo/SNrvDKC6zZI/AAAAAAAAAqk/E-EClRbOJEk/s72-c/Istar2lt.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;DU4ESXg9cCp7ImA9WxRSFUw.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-8041841902303696654</id><published>2008-09-15T16:27:00.004-05:00</published><updated>2008-09-15T17:31:48.668-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T17:31:48.668-05:00</app:edited><title>Better Than Newsgroups?</title><content type="html">For programming-related questions and answers, check out &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt;, which launched today with a public beta.  It looks very interesting - a forum, crossed with digg (user-rated), wiki capabilities (user-edited), and delicious (tags).  The hope is that these three mechanisms will make the site more valuable over time, as questions are answered, rated, tagged, and edited for clarity.&lt;br /&gt;&lt;br /&gt;Currently, the site is a bit Microsoft-heavy. For example, C# has twice as many questions as Java, and EMF refers to the vector graphics "Enhanced Metafile Format".  Still, Eclipse is well represented with 58 questions compared to Netbeans with 5.&lt;br /&gt;&lt;br /&gt;I find it amazing to watch how questions come in at a rate of roughly one per minute, and how they get answered at a similar rate. It's just like on the EMF newsgroup, but so much more Web 2.0!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-8041841902303696654?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/iJHfPpDG8J4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/8041841902303696654/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=8041841902303696654" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/8041841902303696654?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/8041841902303696654?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/09/better-than-newsgroups.html" title="Better Than Newsgroups?" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkYCSH07cCp7ImA9WxRTFkg.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-6894436320608485308</id><published>2008-09-05T12:37:00.010-05:00</published><updated>2008-09-05T16:29:29.308-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-05T16:29:29.308-05:00</app:edited><title>Simply models</title><content type="html">I have been working on a small demo application that (when finished) is meant to be an exemplary RCP-style desktop application based on &lt;a href="http://wiki.eclipse.org/E4"&gt;e4&lt;/a&gt;. This is how it looks so far:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9mAUrmH9eMo/SMGc4rWwc7I/AAAAAAAAAp8/UqbFiwhqylU/s1600-h/e4photo-flower.PNG"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_9mAUrmH9eMo/SMGc4rWwc7I/AAAAAAAAAp8/UqbFiwhqylU/s400/e4photo-flower.PNG" alt="" id="BLOGGER_PHOTO_ID_5242643938760750002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;There is a very simple navigator on the left, a thumbnails view, and a preview area.&lt;br /&gt;&lt;br /&gt;As I wrote the application based on Eric's and Tom's work, I started by implementing a couple of views that I contributed to the new e4 Workbench through an extension point.&lt;br /&gt;&lt;br /&gt;Then I realized that all I need is an EMF model representing the parts that make up the UI: the views, the menu, and the toolbar.  I don't actually need any extension points, because my application is not an extensible IDE - it is a rich client application for which I know how the UI should be structured.  I am pretty happy about the end result - my application is fully described by one XMI file that I can edit using an editor for EMF models, and I can just go and modify that file if I want to rearrange views, add new ones, delete unnecessary ones, build my menu structure and so on.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9mAUrmH9eMo/SMGfElsQmiI/AAAAAAAAAqE/Il2kZkJjjt4/s1600-h/e4photo-xmi.PNG"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_9mAUrmH9eMo/SMGfElsQmiI/AAAAAAAAAqE/Il2kZkJjjt4/s400/e4photo-xmi.PNG" alt="" id="BLOGGER_PHOTO_ID_5242646342422010402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Compare this to how it works with the current 3.x Workbench: I would have to write a perspective extension, a couple of views extensions, a command extension, a menu and a toolbar extension. Then I would have to assign unique IDs to all these pieces, and to ensure that IDs match up properly. How many hours we've wasted in the past when IDs did not match up!&lt;br /&gt;&lt;br /&gt;Of course, this only works for closed applications, not for open and extensible ones like e.g. the Eclipse IDE.  However, it is still pretty useful to be able to reason about a concrete EMF model representing the UI application structure. For example, when you have lots of little pieces contributed by many plug-ins, we can now talk about what it means to produce that concrete model from the many little pieces.  One interesting question based on this is: Can we maybe generalize the many ad-hoc mechanisms we have grown over the last years (most of which involve matching up IDs) to something that is less ad-hoc and more general?&lt;br /&gt;&lt;br /&gt;It's been fun to work on this little application so far.  If you would like to participate, let us know on the &lt;a href="http://dev.eclipse.org/mhonarc/lists/eclipse-incubator-e4-dev/maillist.html"&gt;e4 mailing list&lt;/a&gt;, and/or attend the &lt;a href="http://www.google.com/calendar/embed?src=ctri5teoag0n87t2qu9bla8u3g%40group.calendar.google.com&amp;amp;ctz=Canada/Toronto"&gt;bi-weekly e4 conference calls.&lt;/a&gt;  You can always email me directly, of course.&lt;br /&gt;&lt;br /&gt;P.S. The code is available in CVS - check out the ui/demos project under /cvsroot/eclipse/e4-incubator to get the launch configuration and project set file (emf-workbench.psf).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-6894436320608485308?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/CeDkRxV5T-E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/6894436320608485308/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=6894436320608485308" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6894436320608485308?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6894436320608485308?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/09/simply-models.html" title="Simply models" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_9mAUrmH9eMo/SMGc4rWwc7I/AAAAAAAAAp8/UqbFiwhqylU/s72-c/e4photo-flower.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;DU8BRXw4fyp7ImA9WxdRFkU.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-3957967939230956155</id><published>2008-06-05T10:25:00.005-05:00</published><updated>2008-06-05T12:44:14.237-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-05T12:44:14.237-05:00</app:edited><title>Unpaid Volunteers Do Exist</title><content type="html">&lt;a href="http://eclipse-projects.blogspot.com/"&gt;Bjorn&lt;/a&gt; blogged about a recent discussion on the &lt;a href="http://www.eclipse.org/newsportal/article.php?id=41313&amp;amp;group=eclipse.platform.swt#41313"&gt;SWT&lt;/a&gt; and &lt;a href="http://www.eclipse.org/newsportal/article.php?id=1757&amp;amp;group=eclipse.foundation#1757"&gt;Foundation&lt;/a&gt; newsgroups, and claims that Eclipse does not do enough to attract unpaid volunteers.&lt;br /&gt;&lt;br /&gt;From my little corner of the ecosystem, I can offer a counterexample.  As of today, three of the nine active committers on the Eclipse Platform project's UI component (JFace, Workbench, IDE) are unpaid, part-time volunteers. It seems to be attractive enough to be a Platform committer, at least to some, resulting in 33% active Platform UI committers who are not employees of IBM.&lt;br /&gt;&lt;br /&gt;Interestingly, they are all 'unpaid volunteers' (this applies to two more who are not listed as active committers now but were active in the past).  They are independent consultants, employed software developers investing some of their spare time, or come from small companies that use Eclipse technology.  To me, this contradicts Bjorn's assumption that Eclipse is only 'paid volunteers'. In fact, I would like to understand why in the past, we haven't seen 'paid volunteer' people approach us because they want to contribute to the Platform.  (It looks like the e4 effort may change this.)&lt;br /&gt;&lt;br /&gt;I admit that we could be more open and transparent over just &lt;a href="http://wiki.eclipse.org/Platform_UI/How_to_Contribute"&gt;explaining how to contribute&lt;/a&gt;, and hanging out on &lt;a href="http://wiki.eclipse.org/IRC"&gt;IRC&lt;/a&gt; and the &lt;a href="http://www.eclipse.org/newsgroups/"&gt;newsgroups&lt;/a&gt;.  However, what we cannot do is invest a lot of time into contributors who only contribute once (as opposed to ongoing, even if it is part-time). Working with the community on their contributions takes a lot of time. This is why we invest more time on those who may turn into committers at some point: if/when they become committers, we can hope for a return on our time investment.&lt;br /&gt;&lt;br /&gt;By the way Bjorn, by disagreeing with one of the replies saying: "this is entirely a volunteer effort", you disagreed with an actual unpaid volunteer, one of the part-time non-IBM committers on the Platform UI component. Francis managed to break through the "glass wall", and the Rizzo Ceiling! I would recommed that you read &lt;a href="http://dev.eclipse.org/newslists/news.eclipse.foundation/msg01751.html"&gt;Francis' post&lt;/a&gt; again in this light. ;-P&lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;A large part of the high barrier of entry and learning curve is inherent in what we do, and results from all the IP rules, process rules, API compatibility rules, accessibility rules, internationalization rules, performance considerations, architectural integrity considerations, and some more that I probably forgot. I don't think we can do much about this, but I agree with Francis that we need to get a lot better at encouraging contributions and contributors&lt;tt&gt;&lt;/tt&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-3957967939230956155?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/u81QD_OVYk4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/3957967939230956155/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=3957967939230956155" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3957967939230956155?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3957967939230956155?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/06/unpaid-volunteers-do-exist.html" title="Unpaid Volunteers Do Exist" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;A0YFRHs_eip7ImA9WxZUGEU.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-534006955983537761</id><published>2008-04-10T23:30:00.002-05:00</published><updated>2008-04-10T23:45:15.542-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-10T23:45:15.542-05:00</app:edited><title>e4 summit: May 22nd/23rd</title><content type="html">I hope that all interested parties are already subscribed to the &lt;a href="https://dev.eclipse.org/mailman/listinfo/eclipse-incubator-e4-dev"&gt;e4 mailing list&lt;/a&gt;. For those who are not, just an update that we now have a date (May 22nd/23rd, 2008) and a location (Ottawa) for the e4 summit, and that work on the agenda has started. If you are interested in working on the new Platform, please consider attending the summit and add yourself to &lt;a href="http://wiki.eclipse.org/E4/Summit"&gt;its wiki page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-534006955983537761?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/FcPIPICRKCI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/534006955983537761/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=534006955983537761" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/534006955983537761?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/534006955983537761?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/04/e4-summit-may-22nd23rd.html" title="e4 summit: May 22nd/23rd" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE8NQnkzcSp7ImA9WxZWGUs.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-3759003221459224791</id><published>2008-03-19T12:57:00.006-05:00</published><updated>2008-03-19T16:41:33.789-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-19T16:41:33.789-05:00</app:edited><title>e4 pointers, and a teaser</title><content type="html">This is just a quick update for those who would like to contribute to e4, and those who would like to get our demo code to compile and run. I just updated the e4 wiki page (&lt;a href="http://wiki.eclipse.org/E4"&gt;wiki.eclipse.org/E4&lt;/a&gt;) with a link to the mailing list, and instructions on how you can run the demos.&lt;br /&gt;&lt;br /&gt;Oh, and here is a screenshot of the demo that was not shown in the Eclipse 4.0 talk. Come to the &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=620"&gt;Eclipse 4.0 (e4) Kick Off BoF tonight&lt;/a&gt; to see it live:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_9mAUrmH9eMo/R-GIRhqP7bI/AAAAAAAAAdo/3DLpy5ovN7o/s1600-h/e4-web.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_9mAUrmH9eMo/R-GIRhqP7bI/AAAAAAAAAdo/3DLpy5ovN7o/s400/e4-web.png" alt="" id="BLOGGER_PHOTO_ID_5179570881127509426" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-3759003221459224791?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/arSGavXtcIE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/3759003221459224791/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=3759003221459224791" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3759003221459224791?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3759003221459224791?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/03/e4-pointers-and-teaser.html" title="e4 pointers, and a teaser" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_9mAUrmH9eMo/R-GIRhqP7bI/AAAAAAAAAdo/3DLpy5ovN7o/s72-c/e4-web.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;Ak8HQng7fSp7ImA9WxZXF0o.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-8683454935532075448</id><published>2008-03-05T22:42:00.004-05:00</published><updated>2008-03-05T23:47:13.605-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-05T23:47:13.605-05:00</app:edited><title>Pre-emptive snarky comment</title><content type="html">It appears I am &lt;a href="http://eclipse-projects.blogspot.com/2008/02/agreeing-with-microsoft.html"&gt;not the only one&lt;/a&gt; reading the "Old New Thing" blog from a Microsoft employee who sometimes ends his posts with pre-emptive snarky comments, like for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/03/04/8014284.aspx"&gt;"That's about all Microsoft is good for: making a song out of their critical stop and error tones."&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/02/26/7897723.aspx"&gt;"This is why Microsoft products suck."&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/02/01/7362840.aspx"&gt;"Oh, right, just like the advertisements for Windows Vista, which said that The Wow Starts Now. I didn't feel any Wow."&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I enjoy reading that blog, and not for the snarky comments. I find it interesting to read from someone who is working in a similar position but different context: there seem to be &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/03/04/8014283.aspx"&gt;striking&lt;/a&gt; &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/02/19/7784127.aspx"&gt;parallels&lt;/a&gt; with similar experiences we have made on the Eclipse Platform team.&lt;br /&gt;&lt;br /&gt;Anyway, it is time to make a pre-emptive snarky comment myself. It is not actually related to this blog entry. It is related to &lt;a href="http://dev.eclipse.org/mhonarc/lists/eclipse.org-committers/msg00504.html"&gt;an e-mail&lt;/a&gt; announcing the creation of a new component &lt;span style="font-weight: bold;"&gt;e4&lt;/span&gt; in the Eclipse Incubator project:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Just as I expected from those guys at IBM. We'll never see diversity in the Platform."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that this is out of the way, here is the scoop: We want to make the code for our EclipseCon demos available in the open. We realized (admittedly, very late) that nobody from the SWT team had commit rights in the existing Eclipse Incubator project. Creating a new component in the Eclipse Incubator project was the fastest way to create a home for the experimental code that we will be demoing, with write access to everybody who has been involved so far.&lt;br /&gt;&lt;br /&gt;The key words are "so far" - our hope is to find more people and companies who would like to work with us on &lt;span style="font-weight: bold;"&gt;e4&lt;/span&gt; - our current name for the next-generation platform on which an Eclipse 4.0 can be built. To find out more about this, and to see the demos, come to these two talks at EclipseCon: &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=223"&gt;Eclipse 4.0&lt;/a&gt;, and &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=9"&gt;The Future of SWT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By the way, when I wrote "we", I was referring to people at IBM, Innoopract, and Code 9. So far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-8683454935532075448?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/g3eZT9J_89Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/8683454935532075448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=8683454935532075448" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/8683454935532075448?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/8683454935532075448?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2008/03/pre-emptive-snarky-comment.html" title="Pre-emptive snarky comment" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D0YBSX46eip7ImA9WB9XGEQ.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-3647967874508772785</id><published>2007-11-12T12:58:00.000-05:00</published><updated>2007-11-12T14:19:18.012-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-12T14:19:18.012-05:00</app:edited><title>Hello Android (updated - now with link)</title><content type="html">Good to see Eclipse &lt;a href="http://code.google.com/android/intro/hello-android.html"&gt;being part&lt;/a&gt; of Google's Android story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-3647967874508772785?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/8K7rSHvgw0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/3647967874508772785/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=3647967874508772785" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3647967874508772785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/3647967874508772785?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/11/hello-android.html" title="Hello Android (updated - now with link)" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0YGSH49eyp7ImA9WB9XFUg.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-6127136792703305976</id><published>2007-11-08T16:46:00.000-05:00</published><updated>2007-11-08T16:58:49.063-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-08T16:58:49.063-05:00</app:edited><title>Looking for RCP experience reports</title><content type="html">As the RCP guy on the &lt;a href="http://www.eclipsecon.org/2008/"&gt;EclipseCon 2008&lt;/a&gt; &lt;a href="http://www.eclipsecon.org/2008/index.php?page=programcommittee/"&gt;program committee&lt;/a&gt;, I am trying to organize a "show and tell" session of interesting RCP applications, using several back-to-back short talks. If you want to tell us about your experiences with RCP, please &lt;a href="http://www.eclipsecon.org/2008/index.php?page=submissions/"&gt;make a short talk submission&lt;/a&gt; soon, the deadline is approaching fast! More details about what I am looking for can be found &lt;a href="http://dev.eclipse.org/newslists/news.eclipse.platform/msg69980.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-6127136792703305976?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/vE5cDbBMUNo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/6127136792703305976/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=6127136792703305976" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6127136792703305976?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6127136792703305976?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/11/looking-for-rcp-experience-reports.html" title="Looking for RCP experience reports" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D08ESHkzeCp7ImA9WB9TGU0.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-4352422631401662364</id><published>2007-09-27T09:43:00.000-05:00</published><updated>2007-09-27T10:10:09.780-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-09-27T10:10:09.780-05:00</app:edited><title>BugDay tomorrow, Sep 28</title><content type="html">The Platform UI team is participating in tomorrow's &lt;a href="http://wiki.eclipse.org/Bug_Day"&gt;bug day&lt;/a&gt;. We have marked &lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_file_loc=&amp;amp;bug_file_loc_type=allwordssubstr&amp;amp;bug_id=&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bugidtype=include&amp;amp;chfieldfrom=&amp;amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;amp;classification=Eclipse&amp;amp;component=IDE&amp;amp;component=UI&amp;amp;email1=&amp;amp;email2=&amp;amp;emailtype1=substring&amp;amp;emailtype2=substring&amp;amp;field-1-0-0=classification&amp;amp;field-1-1-0=product&amp;amp;field-1-2-0=component&amp;amp;field-1-3-0=bug_status&amp;amp;field-1-4-0=keywords&amp;amp;field0-0-0=noop&amp;amp;keywords=bugday&amp;amp;keywords_type=allwords&amp;amp;long_desc=&amp;amp;long_desc_type=allwordssubstr&amp;amp;product=Platform&amp;amp;query_format=advanced&amp;amp;remaction=&amp;amp;short_desc=&amp;amp;short_desc_type=allwordssubstr&amp;amp;status_whiteboard=&amp;amp;status_whiteboard_type=allwordssubstr&amp;amp;type-1-0-0=anyexact&amp;amp;type-1-1-0=anyexact&amp;amp;type-1-2-0=anyexact&amp;amp;type-1-3-0=anyexact&amp;amp;type-1-4-0=allwords&amp;amp;type0-0-0=noop&amp;amp;value-1-0-0=Eclipse&amp;amp;value-1-1-0=Platform&amp;amp;value-1-2-0=IDE%2CUI&amp;amp;value-1-3-0=NEW%2CASSIGNED%2CREOPENED&amp;amp;value-1-4-0=bugday&amp;amp;value0-0-0=&amp;amp;votes=&amp;amp;order=bugs.bug_id&amp;amp;query_based_on="&gt;a couple of bugs&lt;/a&gt; with the "bugday" keyword, added contact information to the &lt;a href="http://wiki.eclipse.org/Bug_Day_September_2007"&gt;September 28 BugDay wiki page&lt;/a&gt;, linked to the "&lt;a href="http://wiki.eclipse.org/Platform_UI/How_to_Contribute"&gt;How to Contribute to Platform UI&lt;/a&gt;" page, and made available &lt;a href="http://www.eclipse.org/eclipse/platform-ui/psf/"&gt;project set files for all of Platform UI and IDE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy bug fixing everyone!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-4352422631401662364?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/WvKWajJrc0k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/4352422631401662364/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=4352422631401662364" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/4352422631401662364?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/4352422631401662364?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/09/bugday-tomorrow-sep-28.html" title="BugDay tomorrow, Sep 28" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUEHQHk9eSp7ImA9WB5aF0w.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-4352788944108079246</id><published>2007-09-13T13:53:00.000-05:00</published><updated>2007-09-13T15:00:31.761-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-09-13T15:00:31.761-05:00</app:edited><title>I'm busy building a new Platform</title><content type="html">With all the recent talk about &lt;a href="http://ed-merks.blogspot.com/2007/09/diversity-is-more-than-just-symbol.html"&gt;diversity&lt;/a&gt; and the &lt;a href="http://recoskie.blogspot.com/2007/09/blog-to-blog-diversity.html"&gt;Platform&lt;/a&gt;, I felt compelled to post some pictures of my backyard as well.  I took a few photos today, well past the crack of dawn, at a time that I would have liked to wake up (unfortunately, my kids have to be at school at 8).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_9mAUrmH9eMo/RumJZtK-OHI/AAAAAAAAAS8/aKThscxigZA/s1600-h/DSC05995.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_9mAUrmH9eMo/RumJZtK-OHI/AAAAAAAAAS8/aKThscxigZA/s400/DSC05995.JPG" alt="" id="BLOGGER_PHOTO_ID_5109766326943889522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So what occurred to me is that the most important quality of a platform is that it earns the trust of its users and adopters.  For example, trust that the platform will last for a long time, and that it is stable enough to support whatever you want to build on the platform.   It may help when the platform is built by a diverse group of people, but diversity is not an end in and of itself.  I for my part decided to not rush it, and to pay special attention to stability, which I hope you can see in the pictures.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_9mAUrmH9eMo/RumK4dK-OII/AAAAAAAAATE/fU-mzm858FQ/s1600-h/DSC05993.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_9mAUrmH9eMo/RumK4dK-OII/AAAAAAAAATE/fU-mzm858FQ/s400/DSC05993.JPG" alt="" id="BLOGGER_PHOTO_ID_5109767954736494722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Those bolts are half an inch thick, and four inches long.  Overengineered, you might say, but down at the platform, it is important to set a high bar for anything that goes into the platform.  Because we know the platform must not crush under whatever is built on top of it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_9mAUrmH9eMo/RumLi9K-OJI/AAAAAAAAATM/IeUWjIi_HKw/s1600-h/DSC05990.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_9mAUrmH9eMo/RumLi9K-OJI/AAAAAAAAATM/IeUWjIi_HKw/s400/DSC05990.JPG" alt="" id="BLOGGER_PHOTO_ID_5109768684880935058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So I decided to build all of this myself without any outside contributions.  However, I haven't figured out how best to build the roof yet.  If you have roofing experience, I would like to know how you did it, and I might accept contributions such as shingles if you have some leftovers.&lt;br /&gt;&lt;br /&gt;I almost forgot to talk about the &lt;a href="http://www.eclipse.org/platform/"&gt;other Platform&lt;/a&gt; I am working on.  The Platform UI team is always open for contributions, and we are proud to have attracted several non-IBM committers.  When I asked why they like being a Platform UI committer, one of the main reasons was that they learn a lot from us, and from just taking part in building a great platform.&lt;br /&gt;&lt;br /&gt;If you would like to become a Platform UI committer too, my advice would be to pick one specific area you are interested in rather than scattering your efforts across all of Eclipse.  This ensures that you will deal with one or two committers all the time, which helps building trust.  (Remember, for platforms, it is all about trust).  For example, pick RCP related issues, or editor management, or wizards, etc. Start by watching bugs in Bugzilla, and answering questions on the newsgroups, focused on that one area.  This will get the corresponding committer's attention.  Write an email to our mailing list with your intent to contribute, or if you are shy, send an email just to me.  If we know about you and what you would like to do, we can start sheperding you towards becoming a committer.&lt;br /&gt;&lt;br /&gt;I put some time into our wiki pages to lower the barrier.  You might want to check out the new &lt;a href="http://wiki.eclipse.org/Platform_UI/How_to_Contribute"&gt;how to contribute page&lt;/a&gt; which is based on a similar page Brad Reynolds, one of our non-IBM committers, wrote for the data binding framework.  To make it easier to find similar pages for other Eclipse projects or project components, I added a how to contribute &lt;a href="http://wiki.eclipse.org/Category:How_to_Contribute"&gt;category&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;All of the above mainly applies to individuals who would like to contribute.  If you are reading this from a corporate perspective, and you as a company would like to invest in or contribute to the Platform, you are welcome too! Write me an email and my manager will get back to you. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-4352788944108079246?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/JoMvngtBUZQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/4352788944108079246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=4352788944108079246" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/4352788944108079246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/4352788944108079246?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/09/im-busy-building-new-platform.html" title="I'm busy building a new Platform" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp3.blogger.com/_9mAUrmH9eMo/RumJZtK-OHI/AAAAAAAAAS8/aKThscxigZA/s72-c/DSC05995.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;CkQEQ3w6eSp7ImA9WB5WFEs.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-6805462444332241458</id><published>2007-07-26T05:39:00.000-05:00</published><updated>2007-07-26T09:31:42.211-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-26T09:31:42.211-05:00</app:edited><title>Improving editor tabs is hard</title><content type="html">I just ran across &lt;a href="http://en.wikipedia.org/wiki/Aza_Raskin"&gt;Aza Raskin&lt;/a&gt;'s interesting &lt;a href="http://www.humanized.com/weblog/2007/06/19/humanized_puzzler_2_firefox_tabs/"&gt;usability puzzler&lt;/a&gt; about how tabs in Firefox should work. It is a very interesting read, especially some of the comments, and is directly related to the problem of how to improve editor tab management in Eclipse.&lt;br /&gt;&lt;br /&gt;Firefox 1.5 had a single row of tabs that were visible all the time. Each tab shrunk equally as you opened more tabs than could be shown with complete titles. This works well for a small number of tabs, and degrades gracefully as you open more tabs. However, it does not scale to a large number of tabs - after opening twenty or so tabs, the space for each tab is just too small and users won't be able to tell which tab contains which web page.&lt;br /&gt;&lt;br /&gt;Firefox 2.0 tried to solve this problem by only showing a limited number of tabs. Essentially, what you see is a scrolling window into the complete list of tabs. There are buttons for scrolling left or right, and a drop-down menu at the far right allows you to see the full list of open tabs as well as jumping to a particular tab.&lt;br /&gt;&lt;br /&gt;Aza criticizes that the new tab behaviour is concealing information, and that it makes it harder to navigate between tabs because of the added UI complexity - i.e. the scroll buttons, the drop-down list. My mother tongue German has a useful composite word for what happened: "Verschlimmbesserung" - making something worse in an attempt to improve it.&lt;br /&gt;&lt;br /&gt;Of course, his criticism applies to Eclipse as well. The drop-down menu in Firefox is comparable to the one in Eclipse which opens when you click the chevron, or press Ctrl-E. The scroll buttons do not appear in Eclipse - instead, it uses a logic which will show only the most-recently used editors. This appears to work for some users, but it also &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=68684"&gt;drives other users nuts&lt;/a&gt; (including myself) because it is practically impossible to predict what will happen to your tabs as you switch between editors. All in all, I'd say that Eclipse has at least as much added UI complexity as Firefox 2.0 over Firefox 1.5.&lt;br /&gt;&lt;br /&gt;The Mozilla/Firefox developers are watching the conversation, and I would encourage interested others in the Eclipse community to do so too. I enjoyed reading the discussion in the comments, the proposed solutions, and even some cool mockups. Hopefully, I'll have some more time next week to write about the more interesting proposals for Firefox and what I think we can learn for Eclipse.&lt;br /&gt;&lt;br /&gt;Until then, I will be using &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1343"&gt;Vertigo&lt;/a&gt;, an extension for Firefox that shows tab titles in a vertical sidebar, to see how well it works for web browsing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-6805462444332241458?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/_fSPAgBi_iY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/6805462444332241458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=6805462444332241458" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6805462444332241458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6805462444332241458?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/07/why-improving-editor-tabs-is-hard.html" title="Improving editor tabs is hard" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkMFQXsyfCp7ImA9WB5RFkk.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-1563368508427831479</id><published>2007-06-23T14:11:00.000-05:00</published><updated>2007-06-23T19:20:10.594-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-23T19:20:10.594-05:00</app:edited><title>Innovation and Push vs. Pull</title><content type="html">Some of you may wonder what those &lt;a href="http://www.eclipse.org/platform/incubator/ui/tweaklets/index.php"&gt;tweaklets&lt;/a&gt; are that &lt;a href="http://divby0.blogspot.com/2007/06/and-now-for-something-completely.html"&gt;have been mentioned&lt;/a&gt; and &lt;a href="http://divby0.blogspot.com/2007/06/and-now-for-something-completely.html"&gt;even hyped&lt;/a&gt; in recent blog postings.&lt;br /&gt;&lt;br /&gt;We are actually trying out a different avenue for innovation in the Eclipse UI.  So far, we got feedback for new or changed features by putting them in an early milestone and waiting for the &lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;amp;short_desc=bring+back&amp;classification=Eclipse&amp;amp;product=Platform&amp;component=UI&amp;amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;amp;keywords_type=allwords&amp;keywords=&amp;amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;amp;bug_status=RESOLVED&amp;bug_status=VERIFIED&amp;amp;bug_status=CLOSED&amp;emailtype1=substring&amp;amp;email1=&amp;emailtype2=substring&amp;amp;email2=&amp;bugidtype=include&amp;amp;bug_id=&amp;votes=&amp;amp;chfieldfrom=&amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;cmdtype=doit&amp;amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;amp;type0-0-0=noop&amp;value0-0-0="&gt;inevitable&lt;/a&gt; &lt;a href="http://dev.eclipse.org/newslists/news.eclipse.technology/msg00807.html"&gt;pushback&lt;/a&gt;. With tweaklets, our hope was that ideally, we could generate &lt;span style="font-style: italic;"&gt;pull&lt;/span&gt; from those in the community who want to see this in the main codebase. Seems to work beautifully! :-)&lt;br /&gt;&lt;br /&gt;So, &lt;a href="http://divby0.blogspot.com/"&gt;Nick&lt;/a&gt;, thanks for making the Autopin tweaklet #1 on your &lt;a href="http://divby0.blogspot.com/2007/06/and-now-for-something-completely.html"&gt;list&lt;/a&gt;!  By the way, it &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168379"&gt;works&lt;/a&gt; best if you disable editor reuse on the Search, Debug, and Team preference pages, and it does not work well in conjunction with the Don't-Steal-My-Focus tweaklet which is also available from the &lt;a href="http://www.eclipse.org/eclipse/platform-ui/updates/site.xml"&gt;update site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-1563368508427831479?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/m6AFiBKjEdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/1563368508427831479/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=1563368508427831479" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1563368508427831479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/1563368508427831479?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/06/innovation-and-push-vs-pull.html" title="Innovation and Push vs. Pull" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DUAMR3k6cCp7ImA9WBFVEkw.&quot;"><id>tag:blogger.com,1999:blog-17547394.post-6228987722216595984</id><published>2007-03-24T09:33:00.000-05:00</published><updated>2007-04-10T10:09:46.718-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-04-10T10:09:46.718-05:00</app:edited><title>Who is to blame?</title><content type="html">Ever wondered why Eclipse takes so long to start?  Now you can find out, with a small plug-in that makes use of the &lt;a href="http://eclipse.pookzilla.net/2007/01/i-want-to-tell-you-story-i.php"&gt;new pluggable splash API&lt;/a&gt;.  Just drop the &lt;a href="http://www.eclipse.org/eclipse/platform-ui/plugins/downloads/org.eclipse.ui.examples.splash.blame_1.0.0.jar"&gt;"blame splash" plug-in&lt;/a&gt; into your plugins directory of a recent Eclipse build, restart Eclipse (use the -clean command line option once so that the new plug-in is recognized), and watch which plug-ins are loaded and why:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_9mAUrmH9eMo/RgU6RarWDjI/AAAAAAAAAJ0/QKJI56dgWkM/s1600-h/blame-splash.PNG"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_9mAUrmH9eMo/RgU6RarWDjI/AAAAAAAAAJ0/QKJI56dgWkM/s400/blame-splash.PNG" alt="" id="BLOGGER_PHOTO_ID_5045503028431818290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After Eclipse has started, the functionality is moved into its own proper window until you close it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_9mAUrmH9eMo/RgU7OqrWDkI/AAAAAAAAAJ8/vaJZH0sivRg/s1600-h/blame-splash-2.PNG"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_9mAUrmH9eMo/RgU7OqrWDkI/AAAAAAAAAJ8/vaJZH0sivRg/s400/blame-splash-2.PNG" alt="" id="BLOGGER_PHOTO_ID_5045504080698805826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I tested this on Windows XP but it should work on other platforms too.  You will need a 1.5 level Java VM to run this.&lt;br /&gt;&lt;br /&gt;(Update, April 10, 2007: Essentially the same functionality, plus lots more, is offered by the &lt;a href="http://www.eclipse.org/eclipse/platform-core/downloads.php"&gt;core tools&lt;/a&gt;.  The information just doesn't appear in the splash screen :) )&lt;br /&gt;&lt;br /&gt;Please file specific bugs if you think that too many plug-ins are activated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17547394-6228987722216595984?l=borisoneclipse.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BorisBokowski/~4/DyRy7h37rwU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://borisoneclipse.blogspot.com/feeds/6228987722216595984/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=17547394&amp;postID=6228987722216595984" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6228987722216595984?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17547394/posts/default/6228987722216595984?v=2" /><link rel="alternate" type="text/html" href="http://borisoneclipse.blogspot.com/2007/03/who-is-to-blame.html" title="Who is to blame?" /><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00452369616224285518" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_9mAUrmH9eMo/RgU6RarWDjI/AAAAAAAAAJ0/QKJI56dgWkM/s72-c/blame-splash.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry></feed>
