<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34385728</id><updated>2011-09-10T04:01:22.095-07:00</updated><category term='p2'/><category term='rcp'/><category term='php 5.3'/><category term='continuous integration'/><category term='eclipsecon'/><category term='build'/><category term='pdt'/><category term='php'/><category term='tips'/><category term='joking'/><category term='magic'/><category term='thoughts'/><category term='gef'/><category term='eclipse'/><category term='hudson'/><category term='swt'/><title type='text'>Michael Spector's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34385728.post-6942035574506110678</id><published>2010-12-09T01:27:00.000-08:00</published><updated>2010-12-09T03:15:02.087-08:00</updated><title type='text'>Having fun with NodeJS</title><content type='html'>This is rather a memo for myself than tutorial of building a simple Web site using &lt;a href="http://nodejs.org/"&gt;server-side JavaScript&lt;/a&gt; (read &lt;a href="http://nodejs.org/#about"&gt;why&lt;/a&gt; you may need this).&lt;br /&gt;&lt;br /&gt;I have registered a domain name, and purchased a 'Level 1' VPS hosting from HostGator (with pre-installed CentOS 5.5), but you can try this on a virtual machine running on your desktop as well.&lt;br /&gt;&lt;br /&gt;1. Let's start from installing node.js:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# Download the source package:&lt;br /&gt;wget http://nodejs.org/dist/node-v0.2.5.tar.gz&lt;br /&gt;&lt;br /&gt;# Build &amp; Install:&lt;br /&gt;tar -zxf node-v0.2.5.tar.gz&lt;br /&gt;cd node-v0.2.5&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Now, we need to install a &lt;a href="https://github.com/isaacs/npm"&gt;package manager&lt;/a&gt; for node.js:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# It's recommended to run npm from a regular user, so we just make the /usr/local/ directory writable by the group 'wheel', and add the relevant user to this group:&lt;br /&gt;&lt;br /&gt;sudo chgrp -R wheel /usr/local/{share/man,bin,lib/node}&lt;br /&gt;sudo usermod -g -G wheel $USER&lt;br /&gt;&lt;br /&gt;# Install npm:&lt;br /&gt;curl http://npmjs.org/install.sh | sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. As developer of node.js himself &lt;a href="http://www.yuiblog.com/blog/2010/05/20/video-dahl/"&gt;states&lt;/a&gt;, node.js isn't production ready yet. What he suggests is running node.js behind a reverse proxy, served by &lt;a href="http://nginx.org/"&gt;nginx&lt;/a&gt;, for example.&lt;br /&gt;&lt;br /&gt;a) Installing nginx is very easy on CentOS:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# Add EPEL repository:&lt;br /&gt;rpm -i http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm&lt;br /&gt;&lt;br /&gt;# Install 'nginx':&lt;br /&gt;yum install nginx&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;b) Let's configure nginx proxy:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# First, comment out the server {...} section in /etc/nginx/nginx.conf:&lt;br /&gt;&lt;br /&gt;vim /etc/nginx/nginx.conf&lt;br /&gt;&lt;br /&gt;# Second, add the proxy configuration to /etc/nginx/conf.d/virtual.conf (we suppose that your node.js application will be running on port 8000):&lt;br /&gt;&lt;br /&gt;cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /etc/nginx/conf.d/virtual.conf&lt;br /&gt;upstream app_cluster_1 {&lt;br /&gt;        server 127.0.0.1:8000;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;server {&lt;br /&gt;        listen 0.0.0.0:80;&lt;br /&gt;        server_name node.local node;&lt;br /&gt;        access_log /var/log/nginx/node.log;&lt;br /&gt;&lt;br /&gt;        location / {&lt;br /&gt;          proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;          proxy_set_header Host $http_host;&lt;br /&gt;          proxy_set_header X-NginX-Proxy true;&lt;br /&gt;&lt;br /&gt;          proxy_pass http://app_cluster_1/;&lt;br /&gt;          proxy_redirect off;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. Create your simple Web application:&lt;br /&gt;&lt;br /&gt;a) We will use &lt;a href="http://expressjs.com/"&gt;ExpressJS&lt;/a&gt; as a Web framework, so we need to install it first:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;npm install express&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;b) Let's install templates engine as well. I've tried to use &lt;a href="http://haml-lang.com/"&gt;Haml&lt;/a&gt; template engine, but I couldn't make it render pages properly, so I was forced to move to using &lt;a href="http://embeddedjs.com/"&gt;ejs&lt;/a&gt; (and I don't regret that):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;npm install ejs&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;c) Create the application folders:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;mkdir /var/www/apps/your_app&lt;br /&gt;&lt;br /&gt;# Static content will be placed here:&lt;br /&gt;mkdir /var/www/apps/your_app/static&lt;br /&gt;&lt;br /&gt;# Views (templates) folder:&lt;br /&gt;mkdir /var/www/apps/your_app/views&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here are files that we are going to create under these folders:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;/var/www/apps/your_app/app.js&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;var sys = require('sys');&lt;br /&gt;var express = require('express');&lt;br /&gt;var app = express.createServer();&lt;br /&gt;&lt;br /&gt;app.configure(function(){&lt;br /&gt;        app.use(express.methodOverride());&lt;br /&gt;        app.use(express.bodyDecoder());&lt;br /&gt;        app.use(app.router);&lt;br /&gt;        app.use(express.staticProvider(__dirname + '/static'));&lt;br /&gt;        app.set('views', __dirname + '/views');&lt;br /&gt;        //app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;var site_locals = {&lt;br /&gt;        copyright: 'Copyright @ Michael Spector 2010',&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;app.get('/', function(req, res){&lt;br /&gt;        res.render('hello.ejs', {&lt;br /&gt;                locals: { site: site_locals },&lt;br /&gt;        });&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;app.listen(8000);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;/var/www/apps/your_app/views/layout.ejs&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;        &amp;lt;head&amp;gt;&lt;br /&gt;                &amp;lt;title&amp;gt;My App&amp;lt;/title&amp;gt;&lt;br /&gt;                &amp;lt;link rel="stylesheet" href="/style.css" /&amp;gt;&lt;br /&gt;        &amp;lt;/head&amp;gt;&lt;br /&gt;        &amp;lt;body&amp;gt;&lt;br /&gt;              &amp;lt;!-- Pay an attention to this special construct that will be replaced with the actual view contents (hello.ejs in our case): --&amp;gt;&lt;br /&gt;              &amp;lt;%- body %&amp;gt;&lt;br /&gt;              &amp;lt;hr/&amp;gt;&lt;br /&gt;              &amp;lt;%= site.copyright %&amp;gt;&lt;br /&gt;        &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;/var/www/apps/your_app/views/hello.ejs&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;h1&amp;gt;Hello, World!&amp;lt;h1/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;/var/www/apps/your_app/static/style.css&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:css"&gt;body {&lt;br /&gt;   text-align: center;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5. The last this is making sure that if node.js unexpectedly dies, it will be started again automatically. For this purpose we will install &lt;a href="http://mmonit.com/monit/"&gt;monit&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# Install monit:&lt;br /&gt;yum install monit&lt;br /&gt;&lt;br /&gt;# Uncomment "set httpd" entires in the main configuration file:&lt;br /&gt;vim /etc/monit.conf&lt;br /&gt;&lt;br /&gt;# Create the configuration file for your application (note that we define NODE_ENV=production variable prior running node.js, which should enable all production features, like caching, etc...):&lt;br /&gt;&lt;br /&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/monit.d/your_app&lt;br /&gt;check host objdump with address 127.0.0.1&lt;br /&gt;    start program = "/bin/sh -c 'NODE_ENV=production /usr/local/bin/node /var/www/apps/your_app/app.js'"&lt;br /&gt;        as uid nobody and gid nobody&lt;br /&gt;    stop program  = "/usr/bin/pkill -f 'node /var/www/apps/your_app/app.js'"&lt;br /&gt;    if failed port 8000 protocol HTTP&lt;br /&gt;        request /&lt;br /&gt;        with timeout 10 seconds&lt;br /&gt;        then restart&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;6. Finally, configure all services to start automatically when system boots, and start them:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;sudo chkconfig nginx on&lt;br /&gt;sudo chkconfig monit on&lt;br /&gt;&lt;br /&gt;/etc/init.d/nginx restart&lt;br /&gt;/etc/init.d/monit restart&lt;br /&gt;&lt;br /&gt;monit stop your_app&lt;br /&gt;monit start your_app&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you need to restart your application upon re-deployment, run:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;monit restart your_app&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Go to &lt;a href="http://&amp;lt;your-ip&amp;gt;/"&gt;http://&amp;lt;your-ip&amp;gt;/&lt;/a&gt;, and have fun!&lt;br /&gt;&lt;br /&gt;Hope this tutorial helps you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-6942035574506110678?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/6942035574506110678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=6942035574506110678' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/6942035574506110678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/6942035574506110678'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/12/having-fun-with-nodejs.html' title='Having fun with NodeJS'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-1407793339601325429</id><published>2010-11-25T03:21:00.000-08:00</published><updated>2010-11-25T03:21:57.533-08:00</updated><title type='text'>Run FindBugs from your Eclipse RCP headless build</title><content type='html'>Running FindBugs from Eclipse RCP headless build is pretty much simple:&lt;br /&gt;&lt;br /&gt;1. Add the following target to your customTargets.xml (replace "com.yourcompany" with your package/plug-in prefix):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;!-- Perform FindBugs analysis on the source code: --&gt;&lt;br /&gt;&lt;target name="findbugs"&gt;&lt;br /&gt;  &lt;mkdir dir="${buildDirectory}/findbugs" /&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;!-- Unzip plug-ins to check (from p2 repository): --&gt;&lt;br /&gt;  &lt;unzip dest="${buildDirectory}/findbugs/classes"&gt;&lt;br /&gt;    &lt;fileset dir="${p2.artifact.repo}/plugins"&gt;&lt;br /&gt;      &lt;include name="com.yourcompany.*.jar" /&gt;&lt;br /&gt;    &lt;/fileset&gt;&lt;br /&gt;  &lt;/unzip&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;!-- Unzip 3rd party classes (from p2 repository): --&gt;&lt;br /&gt;  &lt;unzip dest="${buildDirectory}/findbugs/aux"&gt;&lt;br /&gt;    &lt;fileset dir="${p2.artifact.repo}/plugins"&gt;&lt;br /&gt;      &lt;include name="*.jar" /&gt;&lt;br /&gt;      &lt;exclude name="com.yourcompany.*.jar" /&gt;&lt;br /&gt;    &lt;/fileset&gt;&lt;br /&gt;  &lt;/unzip&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Unzip nested .jars (if any): --&gt;&lt;br /&gt;  &lt;unzip dest="${buildDirectory}/findbugs/aux"&gt;&lt;br /&gt;    &lt;fileset dir="${buildDirectory}/findbugs/aux"&gt;&lt;br /&gt;      &lt;include name="*.jar" /&gt;&lt;br /&gt;    &lt;/fileset&gt;&lt;br /&gt;  &lt;/unzip&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Copy source code: --&gt;&lt;br /&gt;  &lt;copy todir="${buildDirectory}/findbugs/sources"&gt;&lt;br /&gt;    &lt;fileset dir="${sourcesDir}"&gt;&lt;br /&gt;      &lt;include name="com.yourcompany.*/src/**"/&gt;&lt;br /&gt;    &lt;/fileset&gt;&lt;br /&gt;    &lt;mapper type="regexp" from="^.*?/src/(.*)" to="\1" /&gt;&lt;br /&gt;  &lt;/copy&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Define FindBugs task: --&gt;&lt;br /&gt;  &lt;taskdef name="findbugs"&lt;br /&gt;    classname="edu.umd.cs.findbugs.anttask.FindBugsTask"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;classpath&gt;&lt;br /&gt;      &lt;path&gt;&lt;br /&gt;        &lt;fileset dir="${env.FINDBUGS_HOME}/lib" includes="*.jar" /&gt;&lt;br /&gt;      &lt;/path&gt;&lt;br /&gt;    &lt;/classpath&gt;&lt;br /&gt;  &lt;/taskdef&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Run FindBugs: --&gt;&lt;br /&gt;  &lt;findbugs&lt;br /&gt;    home="${env.FINDBUGS_HOME}/lib"&lt;br /&gt;    output="xml"&lt;br /&gt;    failOnError="true" &lt;br /&gt;    jvmargs="-server -Xss1m -Xms512m -Xmx1024m" &lt;br /&gt;    includeFilter="${basedir}/findbugs-filter.xml" &lt;br /&gt;    outputFile="${buildDirectory}/findbugs.xml"&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;auxClasspath path="${buildDirectory}/findbugs/aux" /&gt;&lt;br /&gt;    &lt;class location="${buildDirectory}/findbugs/classes" /&gt;&lt;br /&gt;    &lt;sourcePath path="${buildDirectory}/findbugs/sources" /&gt;&lt;br /&gt;  &lt;/findbugs&gt;&lt;br /&gt;&lt;/target&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Create &lt;a href="http://findbugs.sourceforge.net/manual/filter.html"&gt;input filter&lt;/a&gt; file (findbugs-filter.xml):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;FindBugsFilter&gt;&lt;br /&gt;  &lt;Match&gt;&lt;br /&gt;    &lt;Package name="~com\.yourcompany\..*" /&gt;&lt;br /&gt;  &lt;/Match&gt;&lt;br /&gt;&lt;/FindBugsFilter&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Invoke "findbugs" target from the "prePackage" target:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;target name="prePackage"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Run Unit tests: --&gt;&lt;br /&gt;  &lt;antcall target="test" /&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;!-- Run static code analysis (FindBugs): --&gt;&lt;br /&gt;  &lt;antcall target="findbugs"&gt;&lt;br /&gt;    &lt;!-- This is where your plug-ins are checked-out: --&gt;&lt;br /&gt;    &lt;param name="sourcesDir" value="${buildDirectory}/../" /&gt;  &lt;/antcall&gt;&lt;br /&gt;&lt;/target&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. Make sure environment variable FINDBUGS_HOME points to the installation of FindBugs.&lt;br /&gt;&lt;br /&gt;5. (For Hudson users) Install, and configure &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/FindBugs+Plugin"&gt;FindBugs plug-in&lt;/a&gt; to get the fancy "bugs" trend graph :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-1407793339601325429?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/1407793339601325429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=1407793339601325429' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1407793339601325429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1407793339601325429'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/11/run-findbugs-from-your-eclipse-rcp.html' title='Run FindBugs from your Eclipse RCP headless build'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-8928270649643167224</id><published>2010-10-09T12:39:00.000-07:00</published><updated>2010-10-09T12:39:36.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='p2'/><category scheme='http://www.blogger.com/atom/ns#' term='rcp'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Headless testing of RCP application</title><content type='html'>A week ago or so I needed to add a Unit Test invocation as part of my Eclipse RCP application headless build. My original PDE build configuration consisted of a single target for .product with "runPackager=true". I was too lazy to create an additional one for the test feature that contains Unit Tests plug-ins (which would cost me in a longer build time, BTW).&lt;br /&gt;&lt;br /&gt;So, I decided to include the test feature in a .product, and remove dependency on it after all tests were executed. This simple piece of Ant code does whole the magic:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;replaceregexp&lt;br /&gt;    file="${reposDir}/content.xml"&lt;br /&gt;    match="&amp;lt;required.*name='com\.my\.product\.test_feature\.feature\.group'.*&amp;gt;"&lt;br /&gt;    replace=""&lt;br /&gt;    byline="true" /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It needs to be executed twice: once in a prePackage target, and another time in a postBuild target in order to fix the resulted p2 repository as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-8928270649643167224?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/8928270649643167224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=8928270649643167224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/8928270649643167224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/8928270649643167224'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/10/headless-testing-of-rcp-application.html' title='Headless testing of RCP application'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-3218202345553248794</id><published>2010-09-22T13:00:00.000-07:00</published><updated>2010-09-22T13:00:08.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='gef'/><title type='text'>GEF: Creating a connection on mouse drag</title><content type='html'>This tip shows how to implement a connection creation when dragging a mouse from EditPart, thus saving user's time (one click instead of three: activating connection creation tool, clicking on EditPart, restoring selection tool).&lt;br /&gt;&lt;br /&gt;What you need is to return a ConnectionDragCreationTool from your EditPart:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public DragTracker getDragTracker(Request request) {&lt;br /&gt;   return new ConnectionDragCreationTool();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The problem begins if your EditPart has a Direct Edit policy, Direct Edit commands won't be handled anymore. The following solution supports both: creating a connection on mouse drag and Direct Edit:&lt;br /&gt;&lt;br /&gt;Create a proxy that implements DragTracker by delegating to ConnectionDragCreationTool and to SelectEditPartTracker:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public class DragConnectionCreationProxy implements DragTracker {&lt;br /&gt;&lt;br /&gt;  private ConnectionDragCreationTool connectionTool;&lt;br /&gt;  private SelectEditPartTracker editPartTracker;&lt;br /&gt;&lt;br /&gt;  public DragConnectionCreation(EditPart editPart) {&lt;br /&gt;    this.connectionTool = new ConnectionDragCreationTool();&lt;br /&gt;    this.editPartTracker = new SelectEditPartTracker(editPart);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void commitDrag() {&lt;br /&gt;    connectionTool.commitDrag();&lt;br /&gt;    editPartTracker.commitDrag();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Implement all other methods ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then return this class instance from your EditPart:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public DragTracker getDragTracker(Request request) {&lt;br /&gt;  return new DragConnectionCreationProxy(this);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-3218202345553248794?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/3218202345553248794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=3218202345553248794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/3218202345553248794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/3218202345553248794'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/09/gef-creating-connection-on-mouse-drag.html' title='GEF: Creating a connection on mouse drag'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-8462401571080804788</id><published>2010-05-10T06:28:00.000-07:00</published><updated>2010-05-10T08:23:46.773-07:00</updated><title type='text'>Fixing Mvix Ultio firmware</title><content type='html'>I always dreamed of a small NAS with BitTorrent capabilities to replace my noisy and always hot AMD-based HTPC computer. Last week I've received &lt;a href="http://www.mvixusa.com/ultio/1080p-high-definition-media-center-bittorrent.html"&gt;Mvix Ultio (MX-800HD)&lt;/a&gt;, which I bought on eBay. This box connected to your LAN via either a cable or wireless from one side, and to your TV panel (via HDMI video and optical audio) from the other side, while having a 3.5 SATA disk bundled inside can be turned into a powerful entertainment device (with minimal power consumption).&lt;br /&gt;&lt;br /&gt;The first thing I did when I connected this device, is flashing a new &lt;a href="http://www.mvixusa.com/support/index.php?_m=downloads&amp;amp;_a=viewdownload&amp;amp;downloaditemid=74"&gt;firmware v3.0&lt;/a&gt; from Mvix Ultio support site. I enabled BitTorrent client and Samba plug-ins, as was described in manual. At that time I didn't expect any disappointment, but it came soon when I left it on overnight: the device hanged every couple of hours with no possibility to reboot it using remote control or panel buttons. I've read in one forum that unlimited number of peers in a bundled BitTorrent client (btpd) can kill this device easily. I tried to change settings of btpd startup script via telnet, but with no success as /etc is actually mapped to memory, and is not changeable.&lt;br /&gt;&lt;br /&gt;Below comes a remedy process based on fixing an existing firmware, and preparing it for further hacking :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DISCLAIMER&lt;/b&gt;: I take no responsibility for any damage you might cause to your device by following this guide.&lt;br /&gt;&lt;br /&gt;1. You must have some Linux machine for that (choose yourself, what's easier: installing Ubuntu on VirtualBox or installing Cygwin on Windows? :-])&lt;br /&gt;&lt;br /&gt;2. Download, compile and put &lt;a href="http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2/"&gt;mkyaffs2image&lt;/a&gt;  and &lt;a href="http://code.google.com/p/unyaffs/"&gt;unyaffs&lt;/a&gt; utilities under your $PATH.&lt;br /&gt;&lt;br /&gt;3. Extract existing firmware image:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;mkdir install&lt;br /&gt;cd install&lt;br /&gt;tar xvf ../intsall.img&lt;/pre&gt;&lt;br /&gt;4. Extract contents of yaffs2_1.img:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;cd package2&lt;br /&gt;mkdir yaffs2_1&lt;br /&gt;cd yaffs2_1&lt;br /&gt;unyaffs ../yaffs2_1.img&lt;br /&gt;cd ../&lt;/pre&gt;&lt;br /&gt;5. Extract contents of usr.local.etc.tar.bz2 (this archive will be extracted into a writable partition on a device, partition size is controlled by &amp;lt;sizeBytesMin&amp;gt; entry in configuration.xml):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;mkdir usr_local_etc&lt;br /&gt;cd usr_local_etc&lt;br /&gt;tar jxvf ../usr.local.etc.tar.bz2&lt;br /&gt;cd ../&lt;/pre&gt;&lt;br /&gt;The whole idea is to place things that we might need to configure later on a running device into this archive. So I've just merged contents of package2/yaffs2_1/etc/ into this archive (please do it carefully as there are plenty of symlinks pointing to the same place: /usr/local/etc). Then, I removed whole directory package2/yaffs2_1/etc/, and created a symlink instead:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;rm -rf yaffs2/etc&lt;br /&gt;ln -s /usr/local/etc yaffs2/etc&lt;/pre&gt;&lt;br /&gt;6. Now, lets fix the BitTorrent client settings:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;vi yaffs2_1/usr/local/bin/package/script/bt.script&lt;br /&gt;# find "start running btpd", and add needed settings after the $btpdbin&lt;br /&gt;# (I've just limited a number of peers by adding: --max-peers 48)&lt;/pre&gt;&lt;br /&gt;BTW, you can move this script into /usr/local/etc archive too, and create a symbolic link to it, if you wish to modify it later on a running device.&lt;br /&gt;&lt;br /&gt;7. Compress usr.local.etc.tar.bz2 back:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;cd .usr_local_etc/&lt;br /&gt;&lt;br /&gt;# Restore original files ownership (I don't know whether this is crucial):&lt;br /&gt;chown -R 500:500 .&lt;br /&gt;&lt;br /&gt;tar jcvf ../usr.local.etc.tar.bz2 *&lt;br /&gt;cd ..&lt;br /&gt;rm -rf usr_local_etc&lt;/pre&gt;&lt;br /&gt;7.1 (maybe optional) I don't know what's the point in duplicate /usr/local/etc/ folder contents under package2/yaffs2_1/usr/local/etc/, so I just did the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;cd yaffs2_1/usr/local/etc/&lt;br /&gt;rm -rf *&lt;br /&gt;tar jxvf ../../../../usr.local.etc.tar.bz2&lt;br /&gt;cd ../../../../&lt;/pre&gt;&lt;br /&gt;8. Compress yaffs2_1.img back:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# Restore original files ownership&lt;br /&gt;chown -R 500:500 yaffs2_1/&lt;br /&gt;&lt;br /&gt;mkyaffs2image yaffs2_1 yaffs2_1.img&lt;br /&gt;chmod 644 yaffs2_1.img&lt;br /&gt;rm -rf yaffs2_1&lt;/pre&gt;&lt;br /&gt;9. Compress the firmware image back:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# Restore original files ownership again :)&lt;br /&gt;chown -R 500:500 .&lt;br /&gt;&lt;br /&gt;tar cvf ../install.img *&lt;br /&gt;cd ../&lt;br /&gt;rm -rf install/&lt;/pre&gt;&lt;br /&gt;That's all. Now you're ready to go, and flash your box with the updated firmware.&lt;br /&gt;&lt;br /&gt;PS: I'm too lazy to write how to setup "ipkg" package manager on Mvix Ultio, which allows installing additional software on this device, may be later...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-8462401571080804788?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/8462401571080804788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=8462401571080804788' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/8462401571080804788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/8462401571080804788'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/05/fixing-mvix-ultio-firmware.html' title='Fixing Mvix Ultio firmware'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-7593930848275085517</id><published>2010-05-10T04:15:00.000-07:00</published><updated>2010-09-22T13:43:16.047-07:00</updated><title type='text'>HTML5 Geolocation API is scaring me</title><content type='html'>What happens if you try to open the following HTML code in your Firefox (or any other browser that supports Geolocation API)?&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    if (navigator.geolocation) {&lt;br /&gt;      navigator.geolocation.getCurrentPosition(function(position) {  &lt;br /&gt;        document.location.href =&lt;br /&gt;          &amp;quot;http://maps.google.com/maps?q=&amp;quot; &lt;br /&gt;          + position.coords.latitude + &amp;quot;,+&amp;quot; &lt;br /&gt;          + position.coords.longitude&lt;br /&gt;          + &amp;quot;+(I'm%20here!)&amp;amp;iwloc=A&amp;amp;hl=en&amp;quot;;&lt;br /&gt;      });&lt;br /&gt;    }&lt;br /&gt;  &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I was pretty scared when I've seen my own house. Actually, I was informed about the fact that the site "wants to know my location", but isn't it just as a matter of courtesy by Firefox!? May be I'm just wrongfully paranoid :-/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-7593930848275085517?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/7593930848275085517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=7593930848275085517' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/7593930848275085517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/7593930848275085517'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/05/html5-geolocation-api-is-scaring-me.html' title='HTML5 Geolocation API is scaring me'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-4894298323522311613</id><published>2010-01-19T06:43:00.000-08:00</published><updated>2010-09-22T13:39:11.767-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>Using animated GIF in CLabel</title><content type='html'>Have you ever tried to use animated GIF in Eclipse RCP? Unlike using regular image you have to provide your own mechanism that switches between image frames when using animated GIF (more about this is &lt;a href="http://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html#Animation"&gt;here&lt;/a&gt;). Fortunately, you can save in implementing your own thread by using org.eclipse.ui.internal.ImageCycleFeedbackBase and org.eclipse.ui.internal.AnimationEngine (though these classes are still in internal package). Let's say we need to add an animated image to a CLabel. First of all, we extend ImageCycleFeedbackBase:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public class AnimatedLabelFeedback extends ImageCycleFeedbackBase {&lt;br /&gt; private CLabel label;&lt;br /&gt;&lt;br /&gt; public AnimatedLabelFeedback(Shell parentShell, CLabel item, Image[] images) {&lt;br /&gt;  super(parentShell, images);&lt;br /&gt;  label = item;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void initialize(AnimationEngine engine) {&lt;br /&gt;  background = label.getParent().getBackground();&lt;br /&gt;  display = label.getParent().getDisplay();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void saveStoppedImage() {&lt;br /&gt;  stoppedImage = label.getImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setStoppedImage(Image image) {&lt;br /&gt;  label.setImage(image);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void showImage(Image image) {&lt;br /&gt;  if (!label.isDisposed()) {&lt;br /&gt;   label.setImage(image);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is how we attach animated GIF to the newly created CLabel:&lt;br /&gt;&lt;pre class="brush:java"&gt;label = new CLabel(parent, SWT.SHADOW_NONE);&lt;br /&gt;Image[] images = loadAnimatedGIF(parent.getDisplay(), "icons/obj16/animated.gif");&lt;br /&gt;AnimatedLabelFeedback feedback = new AnimatedLabelFeedback(parent.getShell(), label, images));&lt;br /&gt;animation = new AnimationEngine(feedback,&lt;br /&gt;  -1, // endless&lt;br /&gt;  100 // delay between frames in milliseconds);&lt;br /&gt;animation.schedule();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;loadAnimatedGIF() is implemented as follows:&lt;br /&gt;&lt;pre class="brush:java"&gt;private void loadAnimatedGIF(Display display, String imagePath) {&lt;br /&gt;  URL url = FileLocator.find(Activator.getDefault().getBundle(),&lt;br /&gt;    new Path(imagePath), null);&lt;br /&gt;  ImageLoader imageLoader = new ImageLoader();&lt;br /&gt;  imageLoader.load(url.openStream());&lt;br /&gt;  images = new Image[imageLoader.data.length];&lt;br /&gt;  for (int i = 0; i &lt; imageLoader.data.length; ++i) {&lt;br /&gt;    ImageData nextFrameData = imageLoader.data[i];&lt;br /&gt;    images[i] = new Image(display, nextFrameData);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Dispose animation engine when it's not needed anymore (usually in dispose() method):&lt;pre&gt;animation.cancelAnimation();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PS: @since 3.3&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-4894298323522311613?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/4894298323522311613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=4894298323522311613' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/4894298323522311613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/4894298323522311613'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2010/01/using-animated-gif-in-clabel.html' title='Using animated GIF in CLabel'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-5789516719159151381</id><published>2009-10-26T09:26:00.000-07:00</published><updated>2009-10-26T09:26:52.697-07:00</updated><title type='text'>Optimize fetching of sources from Eclipse.org</title><content type='html'>Did you ever try to build something from sources placed in Eclipse.org? If your .map file contains just a couple of entries - you're OK, but if there are tens of plug-ins to fetch - the mission becomes really impossible, especially during Eclipse.org server maintenance times. I've wrote a simple Ant task, which shortens the build time twice (at least our Hudson shows so). The Ant task is invoked right after the "getMapFiles" PDE builder task, and does very simple steps:&lt;br /&gt;&lt;br /&gt;1. Runs "rsync -az" to synchronize local CVS repository with the remote one.&lt;br /&gt;2. Updates .map file to direct fetch process to the local repository.&lt;br /&gt;&lt;br /&gt;What you need:&lt;br /&gt;&lt;br /&gt;1. Local CVS repository (I used &lt;a href="https://help.ubuntu.com/7.04/server/C/cvs-server.html"&gt;these&lt;/a&gt; steps to setup one).&lt;br /&gt;2. Set-up SSH private/public keys to the Eclipse.org, so "rsync" will work seamlessly.&lt;br /&gt;&lt;br /&gt;May be this trick is one of CVS advantages over SVN :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-5789516719159151381?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/5789516719159151381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=5789516719159151381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/5789516719159151381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/5789516719159151381'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/10/optimize-fetching-of-sources-from.html' title='Optimize fetching of sources from Eclipse.org'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-6034396759779551598</id><published>2009-10-08T07:32:00.000-07:00</published><updated>2009-10-08T07:50:41.503-07:00</updated><title type='text'>PDT 2.2.0 early access</title><content type='html'>Recently, I've posted &lt;a href="http://wiki.eclipse.org/PDT/Installation#Eclipse_3.5_.2F_Galileo_.2F_PDT_2.2"&gt;these instructions&lt;/a&gt; for installing PDT 2.2.0 from the update site. The new version of PDT contains numerous performance improvements due to the &lt;a href="http://spektom.blogspot.com/2009/07/new-dltk-indexing-is-promising.html"&gt;new indexer&lt;/a&gt;. As always, please &lt;a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=PDT"&gt;report bugs&lt;/a&gt; if you encounter any.&lt;br /&gt;&lt;br /&gt;BTW, big thanks to Jacek Pospychala (and Nickb's support, of course :-]) PDT has moved to using &lt;a href="http://wiki.eclipse.org/Common_Build_Infrastructure"&gt;Athena&lt;/a&gt; as a builder. Watch &lt;a href="https://build.eclipse.org/hudson/view/Athena%20CBI/job/cbi-pdt-2.2-helios/"&gt;live PDT builds&lt;/a&gt; if you have permissions, of course :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-6034396759779551598?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/6034396759779551598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=6034396759779551598' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/6034396759779551598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/6034396759779551598'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/10/pdt-220-early-access.html' title='PDT 2.2.0 early access'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-8511601497012590808</id><published>2009-07-19T04:12:00.000-07:00</published><updated>2009-07-19T05:01:25.807-07:00</updated><title type='text'>New DLTK indexing is promising</title><content type='html'>The last couple of weeks I've been working on improving DLTK indexer, which was derived from JDT as is. The original &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=279374"&gt;bug&lt;/a&gt; report sounds like: "Indexing must be adapted for dynamic languages". I have to explain this point a little bit. In Java, every element reference is strongly bound to the original declaration. This is why one can calculate this binding during source code parsing and hold it in a memory (probably update it when referenced/referencing elements are changed). This is not the case for dynamic languages, consider this example (PHP):&lt;br /&gt;&lt;br /&gt;&lt;font color="#6a5acd"&gt;&amp;lt;?php&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;function&lt;/font&gt;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;__autoload&lt;/b&gt;&lt;/font&gt;&lt;font color="#6a5acd"&gt;(&lt;/font&gt;&lt;font color="#804040"&gt;&lt;b&gt;$&lt;/b&gt;&lt;/font&gt;&lt;font color="#008080"&gt;class_name&lt;/font&gt;&lt;font color="#6a5acd"&gt;)&lt;/font&gt;&amp;nbsp;&lt;font color="#6a5acd"&gt;{&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a020f0"&gt;require_once&lt;/font&gt;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;$&lt;/b&gt;&lt;/font&gt;&lt;font color="#008080"&gt;class_name&lt;/font&gt;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/font&gt;&amp;nbsp;'&lt;font color="#ff00ff"&gt;.php&lt;/font&gt;';&lt;br&gt;&lt;br /&gt;&lt;font color="#6a5acd"&gt;}&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#804040"&gt;&lt;b&gt;$&lt;/b&gt;&lt;/font&gt;&lt;font color="#008080"&gt;obj&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#804040"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#a020f0"&gt;new&lt;/font&gt;&amp;nbsp;MyClass&lt;font color="#6a5acd"&gt;()&lt;/font&gt;;&lt;br&gt;&lt;br /&gt;&lt;font color="#6a5acd"&gt;?&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;In this example PHP file is included before the class is loaded, and there's no way for IDE to determine which one. In order to have all JDT-like features in DLTK-based IDE resolution of elements binding is done each time from scratch. This ends up with &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=259788"&gt; a lot of&lt;/a&gt; queries and updates to index file, which are very I/O intensive operations.&lt;br /&gt;&lt;br /&gt;We've tried to implement indexing using &lt;a href="http://www.h2database.com/html/main.html"&gt;H2 database&lt;/a&gt;, and the results are really amazing! &lt;a href="http://www.screentoaster.com/watch/stVU1WS0NIR11XQF1dXl5aUVFQ"&gt;Here's&lt;/a&gt; a screen-cast showing how fast building of full hierarchy for 'Exception' class is using H2 database based index. Comparing to an older implementation I must admit that it's 10 times faster. Due to the fast access to the model most of other features will have great performance as well: Code Assist, Source Navigation, Source Editing, Mark Occurrences, etc...&lt;br /&gt;&lt;br /&gt;I hope this will be included into DLTK 2.0.0 and PDT 2.2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-8511601497012590808?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/8511601497012590808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=8511601497012590808' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/8511601497012590808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/8511601497012590808'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/07/new-dltk-indexing-is-promising.html' title='New DLTK indexing is promising'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-1654047148869874720</id><published>2009-06-26T04:55:00.000-07:00</published><updated>2009-06-26T05:34:21.954-07:00</updated><title type='text'>Some (low quality) pics from Tel Aviv Eclipse Demo Camp</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS39VFZY7I/AAAAAAAADmw/ul4rhivE0G8/s1600-h/25062009(005).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS39VFZY7I/AAAAAAAADmw/ul4rhivE0G8/s400/25062009(005).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351604521482675122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS39IGP5RI/AAAAAAAADmo/cmYXPVIQfAw/s1600-h/25062009(004).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS39IGP5RI/AAAAAAAADmo/cmYXPVIQfAw/s400/25062009(004).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351604517996586258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wOAHNRxmtSs/SkS38-pKz4I/AAAAAAAADmg/teGWZ_KUaAE/s1600-h/25062009(002).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_wOAHNRxmtSs/SkS38-pKz4I/AAAAAAAADmg/teGWZ_KUaAE/s400/25062009(002).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351604515458699138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS38nFwexI/AAAAAAAADmY/YTDwbnuBP54/s1600-h/25062009(003).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS38nFwexI/AAAAAAAADmY/YTDwbnuBP54/s400/25062009(003).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351604509136157458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wOAHNRxmtSs/SkS38cYYT2I/AAAAAAAADmQ/2sCYHRnZfzM/s1600-h/25062009(001).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_wOAHNRxmtSs/SkS38cYYT2I/AAAAAAAADmQ/2sCYHRnZfzM/s400/25062009(001).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351604506261475170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS5GV063AI/AAAAAAAADnY/q3ZG0jxcHIs/s1600-h/25062009(013).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS5GV063AI/AAAAAAAADnY/q3ZG0jxcHIs/s400/25062009(013).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351605775812451330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS5GKmDumI/AAAAAAAADnQ/NfU8nxXfa6A/s1600-h/25062009(010).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS5GKmDumI/AAAAAAAADnQ/NfU8nxXfa6A/s400/25062009(010).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351605772797327970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS5F5cMNWI/AAAAAAAADnI/6tt3pIBJhdk/s1600-h/25062009(009).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_wOAHNRxmtSs/SkS5F5cMNWI/AAAAAAAADnI/6tt3pIBJhdk/s400/25062009(009).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351605768192537954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wOAHNRxmtSs/SkS5FoEiG-I/AAAAAAAADnA/ZNOknUJvnjI/s1600-h/25062009(008).jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_wOAHNRxmtSs/SkS5FoEiG-I/AAAAAAAADnA/ZNOknUJvnjI/s400/25062009(008).jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351605763529907170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS-NGNa2gI/AAAAAAAADng/UoUKDIP6Do4/s1600-h/25062009.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS-NGNa2gI/AAAAAAAADng/UoUKDIP6Do4/s400/25062009.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5351611389437467138" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-1654047148869874720?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/1654047148869874720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=1654047148869874720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1654047148869874720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1654047148869874720'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/06/some-low-quality-pics-from-tel-aviv.html' title='Some (low quality) pics from Tel Aviv Eclipse Demo Camp'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wOAHNRxmtSs/SkS39VFZY7I/AAAAAAAADmw/ul4rhivE0G8/s72-c/25062009(005).jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-1170206156675194873</id><published>2009-05-19T22:39:00.000-07:00</published><updated>2009-05-19T23:24:05.257-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='magic'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>@var magic comment</title><content type='html'>&lt;div&gt;This is a good example how people get used to a bad habits. @var magic comment has appeared first in early Zend Studio, and this is how it was used:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/_wOAHNRxmtSs/ShOZvrG0VII/AAAAAAAADH8/SKOFVI7WLh4/s400/varcomment1.PNG" style="cursor:pointer; cursor:hand;width: 291px; height: 180px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5337779027668391042" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you can see this magic comment makes content assist know what is the type of $test variable. With PDT 2.0 we have canceled this behaviour due to promising type inference engine, that can resolve variable back to the place where it was declared. For example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_wOAHNRxmtSs/ShOc5IvRg0I/AAAAAAAADIE/QJ6awJ2m8lA/s400/varcomment2.PNG" style="cursor:pointer; cursor:hand;width: 367px; height: 203px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5337782488776409922" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it turned out later this is not enough for most PHP developers as there are many cases where there's no reference from variable usage to its declaration (if declaration exists at all). One example has changed our mind, and we've decided to fix &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=260805"&gt;260805&lt;/a&gt;, &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249705"&gt;249705&lt;/a&gt; and &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257481"&gt;257481&lt;/a&gt; ASAP.&lt;/div&gt;&lt;div&gt;One famous &lt;a href="http://framework.zend.com/"&gt;MVC framework&lt;/a&gt; magically allows to refer to View members from within .phtml script using &lt;a href="http://framework.zend.com/manual/en/zend.view.scripts.html"&gt;$this variable&lt;/a&gt;. To support this you definitely need something to tell content assist that $this variable is actually an instance of some class even though it appears in a global scope...&lt;/div&gt;&lt;div&gt;Ouch... PHP is full of magic :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: @var comment fixes are available in &lt;a href="http://www.eclipse.org/pdt/downloads/?showAll=1&amp;amp;hlbuild=S200905061543&amp;amp;project=#S200905061543"&gt;2.1.0M7&lt;/a&gt;, but I suggest using latest &lt;a href="http://www.eclipse.org/pdt/downloads/?showAll=1&amp;amp;hlbuild=I200905171208&amp;amp;project=#I200905171208"&gt;integration build&lt;/a&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/34385728-1170206156675194873?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/1170206156675194873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=1170206156675194873' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1170206156675194873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1170206156675194873'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/05/var-magic-comment.html' title='@var magic comment'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wOAHNRxmtSs/ShOZvrG0VII/AAAAAAAADH8/SKOFVI7WLh4/s72-c/varcomment1.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-2117343069546758444</id><published>2009-05-19T11:25:00.001-07:00</published><updated>2009-05-19T12:07:44.628-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Continuous Integration for Eclipse-based product: thoughts</title><content type='html'>I've been thinking what is the best way to create a fully bottom-up build infrastructure for Eclipse-based product. What I mean by "fully" is:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Developer commits code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A new build starts automatically.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If the build succeeds - run tests.&lt;/li&gt;&lt;li&gt;If tests are successful - tag the code.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Advantages of this scheme are the following:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;I'll always know what's the status of the product in CVS.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I can choose the "best" package and promote it without invoking any builds.&lt;/li&gt;&lt;/ol&gt;Looks simple, isn't it? Now, how would I achieve this with what I have in my hands... In my hands I have:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;CVS repository&lt;/li&gt;&lt;li&gt;Hudson&lt;/li&gt;&lt;li&gt;Eclipse&lt;/li&gt;&lt;/ul&gt;Unfortunately, Hudson can't be used for 100% when building Eclipse plug-ins, since it's rather used as a wrapper to the Eclipse PDE builder. Here, I don't use the ability of Hudson to poll SCM, checkout &amp;amp; tag, present history, etc... OK, I can setup some CVS handler that invokes build in Hudson by accessing URL. So, the first two problems are solved. Hudson executes build script that uses PDE headless builder to build &amp;amp; test my plug-ins. If the build &amp;amp; test where unsuccessful, then I'll see very sad &lt;a href="http://wiki.hudson-ci.org//display/HUDSON/Emotional+Hudson+Plugin"&gt;Mr. Hudson&lt;/a&gt; and everything is good so far.  But if the build was OK, and number of failed tests is less or equal than in the previous build - then I have to tag the sources. And here I miss the "Team -&gt; Release" action in Ant :-) Even if there was such an action the problem still remains, since plug-ins are versioned with 'HEAD' (and I don't want to use common timestamp version for all plug-ins, but rather for those that have changed from the last tag). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a conclusion: I see a lot of black magic work and hacks to get this done. Or... am I missing some pretty solution here? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&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/34385728-2117343069546758444?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/2117343069546758444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=2117343069546758444' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/2117343069546758444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/2117343069546758444'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/05/continuous-integration-for-eclipse.html' title='Continuous Integration for Eclipse-based product: thoughts'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-1269938873008243942</id><published>2009-04-10T10:50:00.000-07:00</published><updated>2009-04-10T11:26:31.973-07:00</updated><title type='text'>"Writing Eclipse plug-ins in PHP"</title><content type='html'>The &lt;a href="http://socghop.appspot.com/student_proposal/review/google/gsoc2009/wcandillon/t123832879141"&gt;GSoC proposal&lt;/a&gt; starts gathering scores. Why this idea is so important? PHP developers have a lot of &lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;short_desc_type=allwordssubstr&amp;amp;short_desc=&amp;amp;classification=Tools&amp;amp;product=PDT&amp;amp;long_desc_type=allwordssubstr&amp;amp;long_desc=&amp;amp;bug_file_loc_type=allwordssubstr&amp;amp;bug_file_loc=&amp;amp;status_whiteboard_type=allwordssubstr&amp;amp;status_whiteboard=&amp;amp;keywords_type=allwords&amp;amp;keywords=&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bug_severity=enhancement&amp;amp;emailtype1=substring&amp;amp;email1=&amp;amp;emailtype2=substring&amp;amp;email2=&amp;amp;bugidtype=include&amp;amp;bug_id=&amp;amp;votes=&amp;amp;chfieldfrom=&amp;amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;amp;cmdtype=doit&amp;amp;order=Reuse+same+sort+as+last+time&amp;amp;field0-0-0=noop&amp;amp;type0-0-0=noop&amp;amp;value0-0-0="&gt;requests&lt;/a&gt; for improving &lt;a href="http://www.eclipse.org/pdt"&gt;the IDE&lt;/a&gt;. Why wait for mercy of project committers? Imagine that you can easily use the language (that you're not afraid of) for adding some new functionality to your lovely IDE. Isn't it great? William Candillon, the student that has proposed this project participated already in GSoC in &lt;a href="http://phpaspect.org/"&gt;2006&lt;/a&gt;, &lt;a href="http://apdt.googlecode.com/"&gt;2007&lt;/a&gt; and &lt;a href="http://apdt.googlecode.com/"&gt;2008&lt;/a&gt;. I'm quite confident that his participation this year will be felicitous for him and for the community too :)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-1269938873008243942?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/1269938873008243942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=1269938873008243942' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1269938873008243942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/1269938873008243942'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/04/writing-eclipse-plug-ins-in-php.html' title='&quot;Writing Eclipse plug-ins in PHP&quot;'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-3088516988330090632</id><published>2009-03-26T22:24:00.000-07:00</published><updated>2009-03-26T23:34:19.236-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Good bye, EclipseCon '09!</title><content type='html'>One more &lt;a href="http://www.eclipsecon.org/2009/"&gt;EclipseCon&lt;/a&gt; is over. A lot of new thoughts I'm taking away with me. Having a lot of "fun" with PDE builder in the past I was inspired by having a chance to learn about PDE builder wrappers: &lt;a href="http://www.eclipsecon.org/2009/sessions?id=302"&gt;Dash Athena&lt;/a&gt; and &lt;a href="http://www.eclipsecon.org/2009/sessions?id=599"&gt;Buckminster&lt;/a&gt;. Both projects look very interesting, though I haven't tested them yet (Buckminster should be the first one to start with due to .product file support).&lt;div&gt;I'm still under the impression of &lt;a href="http://www.eclipsecon.org/2009/sessions?id=539"&gt;Single sourcing RCP and RAP&lt;/a&gt; and &lt;a href="http://www.eclipsecon.org/2009/sessions?id=735"&gt;Runtime Riena and SOA&lt;/a&gt;. These give you to understand that Eclipse can be used as a platform for creating simple (or even complex) information systems very quickly. Trying both technologies is "a must", and I gonna do that in a near feature.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There where things that I'm not convinced still in their necessity. For example, who will need a &lt;a href="http://www.eclipsecon.org/2009/sessions?id=429"&gt;Real Time Shared Editing&lt;/a&gt;? Don't tell me about pair programming. I'm in doubt that simultaneous typing can have some benefits. Usually, it's one who's typing and another who's staring at the code behind the shoulder. Another example - &lt;a href="http://www.eclipsecon.org/2009/sessions?id=750"&gt;Cloud IDE Principle&lt;/a&gt;. It would be nice to have something like that (and the reason is NOT, since we don't want to bring source code to the local machine, and then deploy it back), but wait, is Web technology strong enough for that? People are used to rely too much on a single XMLHttpRequest... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, it's good that world global crisis does not apply on a public interest in Eclipse. It applies on a number of free T-shirts and bags though - I'm coming back without presents...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-3088516988330090632?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/3088516988330090632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=3088516988330090632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/3088516988330090632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/3088516988330090632'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/03/one-more-eclipsecon-is-over.html' title='Good bye, EclipseCon &apos;09!'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-5714551364590659907</id><published>2009-03-08T06:24:00.000-07:00</published><updated>2009-03-08T06:44:42.403-07:00</updated><title type='text'>PHP 5.3 support in PDT - 2nd stage is over</title><content type='html'>&lt;div&gt;I think picture is worth a thouthand of words (if this ain't photoshop, of course)&lt;/div&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_wOAHNRxmtSs/SbPHkD0-cDI/AAAAAAAADF0/HVKyo6qxAjc/s400/php5.3.PNG" style="cursor:pointer; cursor:hand;width: 400px; height: 278px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5310807807916666930" /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Just a few words more, the following bugs where fixed recently:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=261816"&gt;261816&lt;/a&gt; - Add namespaces presentation into PHP Explorer.&lt;/div&gt;&lt;div&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=261817"&gt;261817 &lt;/a&gt;- Provide Code Assist for PHP 5.3 elements.&lt;/div&gt;&lt;div&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=261818"&gt;261818 &lt;/a&gt;- Provide namespace information in the Outline &amp;amp; PHP Explorer views.&lt;/div&gt;&lt;div&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=264952"&gt;264952 &lt;/a&gt;- Add USE statement automatically after inserting Code Assist proposal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Special thanks to the &lt;a href="http://www.doctrine-project.org/"&gt;Doctrine Project&lt;/a&gt; that provided as with a great PHP application written for PHP 5.3, which we use for testing purposes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&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/34385728-5714551364590659907?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/5714551364590659907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=5714551364590659907' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/5714551364590659907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/5714551364590659907'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/03/php-53-support-in-pdt-2nd-stage-is-over.html' title='PHP 5.3 support in PDT - 2nd stage is over'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wOAHNRxmtSs/SbPHkD0-cDI/AAAAAAAADF0/HVKyo6qxAjc/s72-c/php5.3.PNG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-6623902105121906834</id><published>2009-01-25T12:33:00.001-08:00</published><updated>2009-01-25T13:04:10.955-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php 5.3'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>PHP 5.3 support in PDT: 1st stage is completed</title><content type='html'>For those of you who are desperately waiting for the &lt;a href="http://wiki.php.net/todo/php53"&gt;PHP 5.3&lt;/a&gt; support in PDT - &lt;a href="http://www.eclipse.org/pdt/downloads/"&gt;check out&lt;/a&gt; tommorrow's nightly build for the 2.1/HEAD branch. Here's a list of basic features that where defined for the first stage:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Choosing PHP version when creating a new PHP project...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/_wOAHNRxmtSs/SXzQvUncf6I/AAAAAAAADEk/RktK_aMWzDk/s320/new_php_file.PNG" style="cursor:pointer; cursor:hand;width: 320px; height: 129px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5295336773287444386" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Basic code assit for new keywords...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_wOAHNRxmtSs/SXzQ3NS4saI/AAAAAAAADEs/PFcZwej97K4/s320/basic_ca.PNG" style="cursor:pointer; cursor:hand;width: 271px; height: 168px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5295336908761117090" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;PHP 5.3 syntax support: syntax highlighting, no errors in Problem View; sorry for the mess - I tried to put all new language features into one PHP code snippet :-) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_wOAHNRxmtSs/SXzRsI74Y7I/AAAAAAAADE8/HBhvkewyCbI/s400/mess_of_code.PNG" style="cursor:pointer; cursor:hand;width: 400px; height: 200px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5295337818123953074" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;The next stage will be modeling namespaces... Be prepared, DLTK...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: you know the &lt;a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=PDT"&gt;address&lt;/a&gt; where you can report bugs, right? :)&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/34385728-6623902105121906834?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/6623902105121906834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=6623902105121906834' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/6623902105121906834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/6623902105121906834'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/01/php-53-support-in-pdt-1st-stage-is.html' title='PHP 5.3 support in PDT: 1st stage is completed'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wOAHNRxmtSs/SXzQvUncf6I/AAAAAAAADEk/RktK_aMWzDk/s72-c/new_php_file.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-4398971184169686186</id><published>2009-01-10T07:58:00.000-08:00</published><updated>2009-01-10T08:12:08.453-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='joking'/><title type='text'>Pedal for Code Assist</title><content type='html'>Following many &lt;a href="http://dev.eclipse.org/mhonarc/lists/pdt-dev/msg00779.html"&gt;complains&lt;/a&gt; about unusability of code assist in Eclipse I thought about some interesting construction... Just imaging yourself: your fingers are always free for writing code! No more embarassing CTRL+space shortcuts! Just connect your pedal to the computer, and configure it in the Eclipse preferences:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;img src="http://4.bp.blogspot.com/_wOAHNRxmtSs/SWjHGj0vYfI/AAAAAAAADDs/q-PMoNwSnIg/s320/frag_pedals_use.jpg" style="cursor:pointer; cursor:hand;width: 320px; height: 234px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5289696677856240114" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Do you think this idea can be developed? :)&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-4398971184169686186?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/4398971184169686186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=4398971184169686186' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/4398971184169686186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/4398971184169686186'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/01/pedal-for-code-assist.html' title='Pedal for Code Assist'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wOAHNRxmtSs/SWjHGj0vYfI/AAAAAAAADDs/q-PMoNwSnIg/s72-c/frag_pedals_use.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-5949808738421014939</id><published>2009-01-06T14:24:00.000-08:00</published><updated>2009-01-10T08:11:39.432-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>On improving the PHP Inference Engine...</title><content type='html'>&lt;div style="text-align: left;"&gt;Just committed a new Type Inference "rule" into the PDT 2.1 branch. The following picture illustrates it better :)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wOAHNRxmtSs/SWPahN0X3_I/AAAAAAAADDk/oNe-QYaY_VM/s1600-h/new_ti_goal.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 318px; height: 228px;" src="http://1.bp.blogspot.com/_wOAHNRxmtSs/SWPahN0X3_I/AAAAAAAADDk/oNe-QYaY_VM/s320/new_ti_goal.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5288310651642961906" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-5949808738421014939?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/5949808738421014939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=5949808738421014939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/5949808738421014939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/5949808738421014939'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/01/on-improving-php-inference-engine.html' title='On improving the PHP Inference Engine...'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wOAHNRxmtSs/SWPahN0X3_I/AAAAAAAADDk/oNe-QYaY_VM/s72-c/new_ti_goal.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34385728.post-3526162473374123946</id><published>2009-01-04T01:40:00.000-08:00</published><updated>2009-01-06T14:34:15.866-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>PDT 2.0 Released!</title><content type='html'>4 days ago &lt;a href="http://www.eclipse.org/pdt/release-notes/pdt2_0.php"&gt;PHP Development Tools 2.0&lt;/a&gt; was released, and 20,000 of "early birds" had downloaded and started evaluating its new features. If I'd characterize this release in a few words, I'd concentrate on the following topics:&lt;div&gt;&lt;ul&gt;&lt;li&gt;PHP Inference Engine: code based Completion and Navigation Engines, Type Hierarchy, Marc Occurrences, Override Indicators, and more...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Improved Performance and Scallability: faster startup; RAM usage is limited, irregardless how many projects are open.&lt;/li&gt;&lt;li&gt;Build Path: separate project resources from your source code.&lt;/li&gt;&lt;/ul&gt;And the most important thing is that we're really getting a lot of help from the community: people participate in the &lt;a href="news://news.eclipse.org/eclipse.tools.pdt"&gt;newsgroup&lt;/a&gt;, ask and answer questions in the &lt;a href="irc://irc.freenode.net/pdt"&gt;IRC channel&lt;/a&gt;, report &lt;a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=PDT"&gt;bugs&lt;/a&gt;. I really appreciate your help!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34385728-3526162473374123946?l=spektom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spektom.blogspot.com/feeds/3526162473374123946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34385728&amp;postID=3526162473374123946' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/3526162473374123946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34385728/posts/default/3526162473374123946'/><link rel='alternate' type='text/html' href='http://spektom.blogspot.com/2009/01/4-days-ago-php-development-tools-2.html' title='PDT 2.0 Released!'/><author><name>Michael</name><uri>http://www.blogger.com/profile/15105460784540339083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh3.ggpht.com/_wOAHNRxmtSs/RXXfCLkdAWI/AAAAAAAAAXE/CG0oIyXG_FI/s400/DSCF3510.JPG'/></author><thr:total>3</thr:total></entry></feed>
