<?php
/**
 * Copyright (c) 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation) - initial API and implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<div class="col-xs-24">
  <h2>Enabling the Eclipse Mobile and Embedded Software Development Lifecycle</h2>
  <p>The Eclipse PluginFest is a two day developer event to test interoperability and compatibility between Eclipse based plugins and products.  The event will be a workshop format
    that will feature interoperability testing sessions among participating organizations.
  </p>
  <p>The goal of the workshop is to further enable the tool chain that supports the software development
    lifecycle for mobile and embedded development.   Therefore, participation is open to organizations that
    produce or use Eclipse based solutions addressing the embedded and mobile markets.
  </p>
  <p>The Eclipse Pluginfest is being hosted and sponsored by Symbian Software and will occur at the Symbian Waterloo office location in London, UK.</p>
  <table class="table">
    <tr>
      <td>
        <strong>
          Date:
      </td>
      <td> January 23 - 24, 2007</strong></td>
    </tr>
    <tr>
      <td><strong>Location:</strong></td>
      <td>Symbian Offices
      <td>
      <td rowspan="6"><img src="http://www.symbian.com/files/rx/file1966.gif" width="150" alt="" /></td>
    </tr>
    <tr>
      <td> </td>
      <td>2 - 6 Boundary Row</td>
    </tr>
    <tr>
      <td> </td>
      <td>SE1 8HP London
      <td>
    </tr>
    <tr>
      <td> </td>
      <td>United Kingdom</td>
    </tr>
    <tr>
      <td> </td>
      <td><a href="http://www.symbian.com/images/rx/img/img1099.gif">View Map</a></td>
    </tr>
  </table>
  <h2>Event Goals</h2>
  <ul>
    <li>Detect and resolve interoperability problems between products in the tool chain</li>
    <li>Create a community of tools providers within the embedded and mobile development sectors</li>
    <li>Identify areas for development and collaboration within Eclipse</li>
    <li>Publish helpful "how to's" and source code examples</li>
    <li>Find new partners and end users</li>
  </ul>
  <h2>Who Should Attend</h2>
  <ul>
    <li>Organizations that produce, use, or are planning to use solutions for the embedded or mobile sectors and that are utilizing Eclipse as the main tool for development or tool integration point.</li>
    <li>At least one representative must be a software engineer or technical
      architect in charge of the product being tested at PluginFest.  Technical representatives should arrive prepared to make
      source code level changes to their product, either directly or with the assistance of their home office, within the
      time frame of PluginFest.  The second representative may be another developer or a product manager.
    </li>
  </ul>
  <h2>Participants</h2>
  <table class="table">
    <tr>
      <th>Company</th>
      <th>Product</th>
      <th>Product Prerequisites</th>
    </tr>
    <tr>
      <td>ARM</td>
      <td>RealView DEVELOP Eclipse Plugins</td>
      <td>SDK 3.2, CDT 3.1</td>
    </tr>
    <tr>
      <td>Borland Software</td>
      <td>Borland StarTeam 2006 Eclipse Client</td>
      <td>SDK 3.1 or 3.2</td>
    </tr>
    <tr>
      <td>Code Red Technologies</td>
      <td>Internal tools</td>
      <td>SDK 3.2.1, CDT 3.1.1</td>
    </tr>
    <tr>
      <td>Collabnet</td>
      <td>Subversion</td>
      <td> - </td>
    </tr>
    <tr>
      <td>IBM</td>
      <td>Rational Systems Developer, Rational Test Realtime</td>
      <td>SDK 3.2, uml, CDT, EMF, EMFT, GMF</td>
    </tr>
    <tr>
      <td>Klocwork</td>
      <td>Klocwork Development Suite</td>
      <td>SDK 3.2, CDT</td>
    </tr>
    <tr>
      <td>LynuxWorks</td>
      <td>LynuxWorks Luminosity</td>
      <td>SDK 3.2</td>
    </tr>
    <tr>
      <td>Macrobug</td>
      <td>Internal tools</td>
      <td>Carbide C++ (e.g. platform 3.1.2), CDT 3.0.2 + Nokia patches</td>
    </tr>
    <tr>
      <td>Mentor Graphics</td>
      <td>Nucleus EDGE development tools</td>
      <td>SDK 3.1</td>
    </tr>
    <tr>
      <td>Mobile Tools for the Java Platform Project (IBM & Nokia)</td>
      <td>Mobile Tools for the Java Platform</td>
      <td>SDK 3.2, JDT 3.2, EMF 2.1</td>
    </tr>
    <tr>
      <td>Motorola</td>
      <td>Internal tools</td>
      <td>SDK 3.2, CDT, MTJ, current version only works on Linux x86 host</td>
    </tr>
    <tr>
      <td>Nokia</td>
      <td>Carbide C++ Development Tools</td>
      <td>SDK 3.2.1, CDT 3.1.1</td>
    </tr>
    <tr>
      <td>Perforce Software</td>
      <td>P4WSAD, the Perforce Plug-in for WebSphere Studio</td>
      <td> - </td>
    </tr>
    <tr>
      <td>QNX Software Systems</td>
      <td>QNX Momentics Development Suite v6.3 SP3 with QNX Momentics IDE 4.0</td>
      <td>SDK 3.2, CDT 3.1</td>
    </tr>
    <tr>
      <td>Sony Ericsson</td>
      <td>Internal tools</td>
      <td>SDK 3.1, CDT 3.1</td>
    </tr>
    <tr>
      <td>STMicroelectronics</td>
      <td>Internal tools (Workbench, profiler, Time Sequence Chart)</td>
      <td>SDK 3.2, CDT 3.1.1</td>
    </tr>
    <tr>
      <td>Symbian Software</td>
      <td>Internal tools</td>
      <td>SDK 3.1, CDT 3.0, EMF 2.1</td>
    </tr>
    <tr>
      <td>SysOpen Digia</td>
      <td>EUnit Pro</td>
      <td>SDK 3.2.1, CDT 3.1.1</td>
    </tr>
    <tr>
      <td>Telelogic</td>
      <td>Rhapsody</td>
      <td>SDK 3.2, CDT</td>
    </tr>
    <tr>
      <td>Wind River</td>
      <td>Wind River Workbench 3.0 alpha 2</td>
      <td>SDK 3.3 M4, CDT 4.0 M4, EMF 2.3.0 M4, RSE 2.0 M4
    </tr>
  </table>
  <br>
  <ul>
    <li>More to come!</li>
  </ul>
  <h2>Registration</h2>
  <p>Space is limited for this event, so we are restricting each product group to two representatives.   Registration will also be accepted
    on a first come, first served basis.
  <p>There is no fee to attend PluginFest.  Attendees will be expected to cover the cost of travel and hotel.  To register, e-mail the Eclipse Foundation at
    <a href="mailto:pluginfest@eclipse.org">pluginfest@eclipse.org</a> with the following information:
  </p>
  <ol>
    <li>Name of product to be tested or indicate if you will be testing "internal tools"</li>
    <li>Company name</li>
    <li>Name, email address, and title of the engineer/architect/developer representative</li>
    <li>Name, email address, and title of the second representative, if applicable
    <li>Product prerequisites, including Eclipse SDK version (3.0,3.1,3.2) and other Eclipse project requirements (ex. CDT, EMF, etc)
  </ol>
  <h2>Hotel</h2>
  <p>The following hotel is a 6 minute walk away from the Symbian Office.  Availability is on a first come, first served basis.<br><br>
    <a href="http://www.mercure.com/mercure/fichehotel/gb/mer/2814/fiche_hotel.shtml">Mercure London City Bankside</a><br>
    75 - 79 Southwark St., SE1 0JA London<br>
    Phone (+44) (0)207 902 0800<br>
    Fax (+44) (0)227 902 0810<br>
    Email <a href="mailto:h2814@accor.com">h2814@accor.com</a><br>
  </p>
  <h2>Questions</h2>
  <p><a href="http://wiki.eclipse.org/index.php/PluginFest_2007" target="blank">PluginFest Wiki Page</a>
    <br><br>
    Lynn Gayowski, Marketing Events Manager, Eclipse Foundation<br>
    Email <a href="mailto:pluginfest@eclipse.org">pluginfest@eclipse.org</a><br>
    Phone (613) 224-9461 ext. 234<br>
    <br><br>
  </p>
</div>