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

<channel>
	<title>GhoUl</title>
	<atom:link href="http://cubussapiens.hu/feed/" rel="self" type="application/rss+xml" />
	<link>http://cubussapiens.hu</link>
	<description>A Cubus Sapiens oldal</description>
	<lastBuildDate>Fri, 24 Feb 2012 21:53:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Multitouch gesture support for Zest graphs</title>
		<link>http://cubussapiens.hu/2012/02/multitouch-gesture-support-for-zest-graphs/</link>
		<comments>http://cubussapiens.hu/2012/02/multitouch-gesture-support-for-zest-graphs/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 21:37:34 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[zest]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2275</guid>
		<description><![CDATA[When I read Jan Köhnlein&#8217;s post about multitouch gestures support in their graph viewer, I was thinking, these gestures would be a nice addition to the Zest visualization library. In addition to that, it could be my first new feature &#8230; <a href="http://cubussapiens.hu/2012/02/multitouch-gesture-support-for-zest-graphs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When I read Jan Köhnlein&#8217;s post about <a href="http://koehnlein.blogspot.com/2012/01/multitouch-gestures-in-generic-graph.html">multitouch gestures support in their graph viewer</a>, I was thinking, these gestures would be a nice addition to the <a href="http://wiki.eclipse.org/Zest">Zest visualization library</a>. In addition to that, it could be my first new feature as a Zest committer, so I opened <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=371152">bug 371152</a>.</p>
<p>So I looked into the multitouch API in SWT (btw. it is really to use, check <a title="Multitouch gesture snippet" href="http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet353.java">snippet 353</a>). Luckily, only a gesture listener had to be added, that is already supported by the Zest graph widget.</p>
<p>I thought about what gestures could be universally supported in the Zest graph, and found that scrolling is already supported, magnification is easy to implement, and for rotation I found a possible use.</p>
<p>Today, I finished the implementation, and created a short video presentation that shows the features in action. See the Youtube video: <a href="http://youtu.be/cVVxOIwHN7s">http://youtu.be/cVVxOIwHN7s</a></p>
<p><span style="text-align:center; display: block;"><a href="http://cubussapiens.hu/2012/02/multitouch-gesture-support-for-zest-graphs/"><img src="http://img.youtube.com/vi/cVVxOIwHN7s/2.jpg" alt="" /></a></span></p>
<p>Additionally, it is possible to replace the built-in gestures by creating the graph with a specific style bit, and adding other gesture listeners manually as below:</p>
<pre class="brush: java; gutter: true">//Disabling default gestures
Graph graph = new Graph(parent, ZestStyles.GESTURES_DISABLED);
//Adding own gesture listener
graph.addGestureListener(new GestureListener() {

  public void gesture(GestureEvent e) {
    switch (e.detail) {
      // Do nothing
    }
  }
});</pre>
<p>I believe the base implementation of the gesture support is useful, but I am open to change it if someone has a better idea.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2012/02/multitouch-gesture-support-for-zest-graphs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Reflective tree editor for Xtext-based languages</title>
		<link>http://cubussapiens.hu/2012/02/reflective-tree-editor-for-xtext-based-languages/</link>
		<comments>http://cubussapiens.hu/2012/02/reflective-tree-editor-for-xtext-based-languages/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 23:00:24 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[emf]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[reflective editor]]></category>
		<category><![CDATA[Xtext]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2257</guid>
		<description><![CDATA[Xtext is a great technology. I really mean it. After 15-30 minutes (depending on your previous domain knowledge) you can get a really fancy textual editor, that parses your text into an EMF model. Xbase is even better: you can &#8230; <a href="http://cubussapiens.hu/2012/02/reflective-tree-editor-for-xtext-based-languages/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://eclipse.org/Xtext">Xtext</a> is a great technology. I really mean it. After 15-30 minutes (depending on your previous domain knowledge) you can get a really fancy textual editor, that parses your text into an EMF model. <a href="http://eclipse.org/Xtext/#xbase">Xbase</a> is even better: you can simply include Java-like expressions into your language, that can be easily translated into pure Java code.</p>
<p>However, while using Xtext I found some minor &#8220;paper-cuts&#8221;. One of the most problematic of them was the fact that I cannot open my textual models using the <a href="http://wiki.eclipse.org/Xtext/FAQ#How_can_I_load_my_model_in_the_EMF_reflective_model_editor.C2.A0.3F">Sample Reflective Ecore  Model editor</a>, as I get an exception: <em>java.net.MalformedURLException: unknown protocol: java</em>.</p>
<p>A similar exception occurred if I tried to open the files programatically (but without the help of the generated Xtext editor). When I asked in the Eclipse forums how to <a href="http://www.eclipse.org/forums/index.php/m/777743/">open Xtext model files programatically</a>, I was answered (btw. very quickly &#8211; kudos for that <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) that a specific ResourceSet implementation is needed that refers to model files and classes available in a Java project.</p>
<p>This gave me the idea to create an Xtext extension that allows opening an EMF tree editor, the <strong>Xtext Reflective Tree Editor</strong>. The plug-in consists of two parts:</p>
<ol>
<li>An extended version of the <a href="http://download.eclipse.org/modeling/emf/emf/javadoc/2.7.0/org/eclipse/emf/ecore/presentation/EcoreEditor.html">org.eclipse.emf.ecore.presentation.EcoreEditor</a> class, that opens its ResourceSet using the Xtext API (more specifically, uses an injected ResourceSet);</li>
<li>And an Xtext generator fragment, that can be used to generate a new editor extension to the ui project (with the corresponding dependency added to the reflective editor plug-in).</li>
</ol>
<h2>Usage</h2>
<p>To use the plug-in, just follow the following simple steps:</p>
<ol>
<li>Add <code>hu.cubussapiens.xtext.reflectiveeditor</code> as a dependency to your language project.</li>
<li>Extend your editor generation workflow:</li>
<ol>
<li>Import the generator package: <code>import hu.cubussapiens.xtext.reflectiveeditor.generator.*</code></li>
<li>Add the new generator fragment at the end of the generator (file.extensions is the list of file extensions defined in the default workflow):<br />
<code>fragment = ReflectiveXtextEditorFragment {<br />
fileExtensions = file.extensions<br />
}</code></li>
<li>Regenerate your language.</li>
</ol>
<li>Unless the plugin.xml files are updated automatically, you have to copy the newly generated editor extension from the end of the <em>plugin.xml_gen</em> file of the ui plug-in to the <em>plugin.xml</em> file. The simplest way to do this is to select both files, and open the compare editor from the popup menu (<em>Compare with/Each other&#8230;</em>), the copy the changes manually.</li>
<li>Finally, open the runtime workbench, and open your textual model files from the popup menu using <em>Open with/«LanguageName» Reflective Editor.</em> The result should be similar to the screenshot below.</li>
</ol>
<div id="attachment_2261" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2012/02/xtext-reflective.png" rel="lightbox[2257]" title="xtext-reflective"><img class="size-medium wp-image-2261" title="xtext-reflective" src="http://cubussapiens.hu/wp-content/uploads/2012/02/xtext-reflective-300x172.png" alt="" width="300" height="172" /></a><p class="wp-caption-text">The Xtext Reflective Editor</p></div>
<p>In my case, the editor shows both the domain model generated from the file directly (the <em>Pattern Model element</em>), the inferred JVM model classes (the various <em>JVM Generic Type</em> instances), and also the referred Java classes as external resources (the resources beginning with the <em>java:/</em> URIs).</p>
<h2>Download</h2>
<p>If you are interested in the plug-in in action, download it from our update site: <a href="http://eclipse.cubussapiens.hu,">http://eclipse.cubussapiens.hu,</a> or take a look at the repository on Github: <a href="https://github.com/ujhelyiz/xtext-reflective">https://github.com/ujhelyiz/xtext-reflective</a></p>
<p>Version 0.5.3 is already available, and hopefully works well for all languages.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2012/02/reflective-tree-editor-for-xtext-based-languages/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Applications of high-performance model queries @ OMG/Eclipse workshop</title>
		<link>http://cubussapiens.hu/2012/02/applications-of-high-performance-model-queries-omgeclipse-workshop/</link>
		<comments>http://cubussapiens.hu/2012/02/applications-of-high-performance-model-queries-omgeclipse-workshop/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 12:46:41 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[eclipse/omg workshop]]></category>
		<category><![CDATA[eclipsecon]]></category>
		<category><![CDATA[EMF IncQuery]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2229</guid>
		<description><![CDATA[At the last EclipseCon Europe, my collegue, István Ráth presented our incremental model query approach in the Modeling Symposium. Since then, we are working hard to evaluate further uses of the technology while creating a better tooling support for the &#8230; <a href="http://cubussapiens.hu/2012/02/applications-of-high-performance-model-queries-omgeclipse-workshop/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>At <a title="EMF-IncQuery @ EclipseCon Europe ’11" href="http://cubussapiens.hu/2011/10/emf-incquery-eclipsecon-europe-11/">the last EclipseCon Europe</a>, my collegue, István Ráth presented our <a href="http://viatra.inf.mit.bme.hu/incquery">incremental model query approach</a> in the Modeling Symposium. Since then, we are working hard to evaluate further uses of the technology while creating a better tooling support for the specification of those queries.</p>
<p>This year, during the <a title="OMG/Eclipse workshop program" href="http://www.omg.org/news/meetings/tc/dc-12/special-events/Eclipse_Program.htm">OMG/Eclipse workshop</a> a day before EclipseCon 2012 István will present our approach together with our new results:</p>
<blockquote><p>14:35 – 15:00</p>
<p><strong>High performance queries and their novel applications</strong></p>
<p><em>István Ráth- Research Associate, BME</em></p>
<p>High-performance model queries are still a major challenge for the industry standard Eclipse Modeling Framework (EMF), they are intensively used in various model validation, model transformation or code generation scenarios. Existing EMF-based query technologies (like Eclipse OCL, EMF Model Query 1-2, or native Java programs) can have significant scalability issues for complex queries of models over 50-100000 model elements. Moreover, it is often tedious and time consuming to efficiently implement EMF-based queries manually on a case-by-case basis.</p>
<p>Recent initiatives, such as the EMF-IncQuery framework (<a href="http://viatra.inf.mit.bme.hu/incquery">http://viatra.inf.mit.bme.hu/incquery</a>) have proposed innovative algorithms to mitigate this issue. EMF-IncQuery uses a graph query language, and provides incremental query evaluation by caching the results of the model queries and incrementally maintaining the cache when the underlying EMF model changes. Furthermore, the EMF-IncQuery framework can be easily integrated into existing EMF-based applications in a non-intrusive way.</p>
<p>In the first part of the talk, we overview the results of a thorough benchmark comparison<br />
intended to aid software engineers in picking the best tool for a given purpose. The measurements involve several versions of Eclipse OCL, manually optimized Java code, dedicated academic query and well-formedness checking tools and EMF-IncQuery and highlight the most important practical considerations of queries in model-driven tool design.</p>
<p>In the second part of the talk, we briefly overview novel and innovative uses of high performance queries such design-space exploration, whereby traditional modeling is augmented with AI techniques to aid the (semi-automatic) optimization of model-based software designs.</p></blockquote>
<p>If you are interested in modeling techniques, I recommend attending to the talk. As a teaser, I show now an existing application of such AI-based techniques: an automated quick fix generation for domain-specific modeling languages. We already presented this technique, albeit based on the VIATRA2 transformation framework in VL/HCC 2011. The article, together with a video demonstration is available from <a href="http://dx.doi.org/10.1109/VLHCC.2011.6070373">http://dx.doi.org/10.1109/VLHCC.2011.6070373</a></p>
<p>For interest, the video demonstration is also uploaded to Youtube for easier watching. (<strong>UPDATE</strong>: For feed readers the video url is the following: <a href="http://youtu.be/kPc4x01K7-s">http://youtu.be/kPc4x01K7-s</a>).</p>
<p><span style="text-align:center; display: block;"><a href="http://cubussapiens.hu/2012/02/applications-of-high-performance-model-queries-omgeclipse-workshop/"><img src="http://img.youtube.com/vi/kPc4x01K7-s/2.jpg" alt="" /></a></span></p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2012/02/applications-of-high-performance-model-queries-omgeclipse-workshop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reusing PDE in modeling context</title>
		<link>http://cubussapiens.hu/2011/11/reusing-pde-in-modeling-context/</link>
		<comments>http://cubussapiens.hu/2011/11/reusing-pde-in-modeling-context/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 12:49:36 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[emf]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[PDE]]></category>
		<category><![CDATA[Xtext]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2187</guid>
		<description><![CDATA[If you&#8217;re developing with EMF it is a common task to separate the model into multiple files along with enabling the user to create crosslinks between them. This works out-of box if the files are located inside the same project. &#8230; <a href="http://cubussapiens.hu/2011/11/reusing-pde-in-modeling-context/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re developing with EMF it is a common task to separate the model into multiple files along with enabling the user to create crosslinks between them. This works out-of box if the files are located inside the same project. However, in some cases for larger models it is simply not enough. It can be useful to be able to define reusable (and versioned) packets of models and enable the user to define a configuration which determines the imported model packages. Sounds familiar? The same functionality exists in PDE. Maybe it can be reused for non-java purposes.</p>
<p><span id="more-2187"></span></p>
<p><strong>Plug-ins as model containers</strong></p>
<p>Creating plug-in projects to contain models is easy with PDE: not even a single line of code is needed. The user can create a non-java plug-in project, or convert a resource project to plug-in project by clicking on &#8216;Configure/Convert to Plug-in projects&#8217; in the pop-up menu of the project.</p>
<p>It&#8217;s finished: the user now can define dependencies between projects and even install/update third party plug-ins from update sites!</p>
<p><strong>Creating cross-links</strong></p>
<p>Of course, if the user wants to use the models from the dependent plug-ins we must show the contents of these models on the GUI. This step is highly domain-specific, therefore I leave it to the reader. The part of determining the visible resources from the imported plug-ins is common for all uses.</p>
<p>To use the dependent models, we need to load not only the directly referenced plug-ins, but the plug-ins needed by them recursively:</p>
<pre class="brush: java; gutter: true; first-line: 1; highlight: []; html-script: false">/**
 * Collect all plug-ins on which the given plug-in depends.
 * @param name
 * @return
 */
public static List&lt;String&gt; collectAllDependencies(String name){
    Set&lt;String&gt; all = new HashSet&lt;String&gt;();

    Queue&gt;IPlugin&lt; process = new LinkedList&lt;IPlugin&gt;();
    process.add(getPlugin(name));

    while(!process.isEmpty()){
        IPlugin plugin = process.poll();
        all.add(plugin.getId());
        for(IPluginImport pi : plugin.getImports()){
            String imported = pi.getId();
            if (!all.contains(imported)){
                process.add(getPlugin(imported));
            }
        }
    }

    return new ArrayList&lt;String&gt;(all);
}

public static IPlugin getPlugin(String name){
    IPluginModelBase mb = PluginRegistry.findModel(name);
    IPluginModel m = (IPluginModel)mb;
    return m.getPlugin();
}</pre>
<p>When we got all plug-ins to use, we just need to collect the resources from them. In this step we must prepare for two cases: whether the plug-in is a workspace plug-in or not. A workspace plug-in is a plug-in in development. There is a project in the workspace which contain the plug-in contents. Unlike installed plug-ins which exists in the plugins directory of the eclipse installation:</p>
<pre class="brush: java; gutter: true; first-line: 1; highlight: []; html-script: false">public static Collection&lt;URI&gt; getVisibleResources(String pluginname) throws CoreException{
    IPlugin plugin = getPlugin(pluginname);
    final Collection&lt;URI&gt; result = new ArrayList&lt;URI&gt;();

    //The plugin has an underlying resource if it is a workspace plug-in
    IResource r = plugin.getPluginModel().getUnderlyingResource();
    if (r != null){
        r = r.getProject();
        r.accept(new IResourceVisitor() {

            @Override
            public boolean visit(IResource resource) throws CoreException {
                if (resource instanceof IFile){
                    result.add(URI.createPlatformResourceURI(resource.getFullPath().toString(), true));
                    return false;
                }
                return true;
            }
        });
    }else{
        Bundle b = Platform.getBundle(plugin.getId());
        Enumeration&lt;URL&gt; urls = b.findEntries("/", "*.e", true);
        while(urls.hasMoreElements()){
            URL url = urls.nextElement();
            URI uri = URI.createPlatformPluginURI(pluginname+url.getPath(), true);
            result.add(uri);
        }
    }

    return result;

}</pre>
<p>As for normal eclipse plug-ins, if a workspace plug-in exists with the same name as an installed plug-in, the workspace version will be used.</p>
<p>Because EMF needs all resources to be loaded into one resource set to resolve crosslinks, it is advised to use some kind of indexer to reduce load times.</p>
<p><strong>Special case: Xtext</strong></p>
<p>If you&#8217;re using this method with Xtext, some things will become much simpler as it provides you some additional infrastructure compared to EMF. First, you won&#8217;t need to write your own indexing service as Xtext does everything for you from caching to lazy linking. Second, you can implement your own builders as builder participants, which leverages the problem of creating and configuring resource sets and loading resources.</p>
<p>The easiest way to use PDE functionality is to implement the possible crosslinks as scopes:</p>
<pre class="brush: java; gutter: true; first-line: 1; highlight: []; html-script: false">public class PluginDependencyScope extends AbstractScope {

    private final List&lt;IEObjectDescription&gt; descs = new ArrayList&lt;IEObjectDescription&gt;();

    /**
     * @param parent
     * @param ignoreCase
     */
    public PluginDependencyScope(URI context,ResourceSet resourceset, IScope parent) {
        super(parent, false);
        String projname = context.trimFragment().segment(1);
        List&lt;String&gt; deps = MODembedCore.collectAllDependencies(projname);

        for(String d : deps){
            try {
                for(URI uri : MODembedCore.getVisibleResources(d)){
                    try{
                        Resource r = resourceset.getResource(uri, true);
                        for(EObject eo : r.getContents()){
                            if (eo instanceof Package){
                                String name = ((Package) eo).getName();
                                QualifiedName qname = QualifiedName.create(name.split("\\."));
                                descs.add(EObjectDescription.create(qname, eo));
                            }
                        }
                    }catch(Exception e){

                    }
                }
            } catch (CoreException e) {

            }
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.xtext.scoping.impl.AbstractScope#getAllLocalElements()
     */
    @Override
    protected Iterable&lt;IEObjectDescription&gt; getAllLocalElements() {
        return descs;
    }

}</pre>
<p><strong>Problems</strong></p>
<p>This does the magic, but it&#8217;s not perfect. There are some major flaws which are not easy to deal with:</p>
<ul>
<li>Depending on PDE pulls the entire PDE+JDT into your product even if your user does not intend to use it. This is a minor problem, it just causes overhead on the disk usage.</li>
<li>PDE is defined mainly for Java Plug-in projects. The whole user interface contains items which are meaningless in our special case.</li>
<li>If the user is not familiar with PDE and OSGi concepts, she/he will have a hard time understanding the user interface and the operation of cross-link resolution.</li>
<li>When the user tries to add a plug-in to the dependency list, all installed plug-ins are listed, including platform, PDE, JDT, EMF and other components. It may be hard to tell which plug-in contain models of a specific domain.</li>
</ul>
<p><strong>Conclusion</strong></p>
<p>Functionally, PDE contains everything you will need for partitioning models. If the targeted user base is experienced with eclipse, reusing PDE is an option. If needed, some isses can be worked out with some effort. For example the MANIFEST.MF editor can be replaced with a more domain-specific editor, which can filter out uninteresting plug-ins from the dependency list and include additional information which may needed by your domain.</p>
<p>I&#8217;m using this technique to share some common libraries to users for my own domain-specific language. It&#8217;s better than telling the user to download some files and copy them to the workspace. Let me know if you found better ways.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2011/11/reusing-pde-in-modeling-context/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>EMF-IncQuery @ EclipseCon Europe &#8217;11</title>
		<link>http://cubussapiens.hu/2011/10/emf-incquery-eclipsecon-europe-11/</link>
		<comments>http://cubussapiens.hu/2011/10/emf-incquery-eclipsecon-europe-11/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 14:57:05 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[eclipsecon]]></category>
		<category><![CDATA[EMF IncQuery]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2167</guid>
		<description><![CDATA[The research of my group often build on various Eclipse technologies. We are developers of the VIATRA2 model transformation framework. Recently we also created EMF-IncQuery, an incremental query technology over EMF models, that we believe really useful in various areas, &#8230; <a href="http://cubussapiens.hu/2011/10/emf-incquery-eclipsecon-europe-11/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The research of my group often build on various Eclipse technologies. We are developers of the <a href="http://eclipse.org/gmt/VIATRA2/">VIATRA2 model transformation framework</a>. Recently we also created EMF-IncQuery, an incremental query technology over EMF models, that we believe really useful in various areas, such as <a title="Incremental validation of UML models using EMF-IncQuery" href="http://cubussapiens.hu/2011/06/incremental-validation-of-uml-models-using-emf-incquery/">model validation during editing</a> or model synchronization scenarios.</p>
<p>This year, a collegue of mine, István Ráth will attend at EclipseCon Europe, and during the <a href="http://mariot-thoughts.blogspot.com/2011/10/modeling-symposium.html">Modeling Symposium</a> present the basic use cases of the tool. In the following I attach a short abstract of the talk to give a basic idea:</p>
<blockquote>
<h2>EMF-IncQuery: Incremental evaluation of model queries over large EMF model</h2>
<p>A Talk at the EclipseCon Europe 2011 Modeling Symposium<br />
<strong>Presenter</strong>: <a href="http://www.eclipsecon.org/europe2011/users/68">István Ráth</a></p>
<p>High-performance model queries are still a major challenge for the industry standard Eclipse Modeling Framework (EMF), as they are intensively used in various model validation, model transformation or code generation scenarios.</p>
<p>Existing EMF-based query technologies (like OCL, EMF Query or native Java programs) have significant scalability issues for models over 50000 model elements. Moreover, it is often tedious and time consuming to efficiently implement EMF-based queries manually on a case-by-case basis.</p>
<p>This talk introduces EMF-IncQuery, a declarative and scalable EMF model query framework. EMF-IncQuery uses a graph query language, and provides incremental query evaluation by caching the results of the model queries and incrementally maintaining the cache when the underlying EMF model changes. Furthermore, the EMF-IncQuery framework can be easily integrated into existing EMF-based applications in a non-intrusive way.</p>
<p>During the talk, we quickly overview how easy it is to define and integrate highly scalable model queries into existing EMF-based applications, in the form of a very short live demonstration using the MDT Papyrus modeling tool. The scalability of the engine will also be demonstrated, with on-the-fly constraint revalidation that takes less than 100 milliseconds over large AUTOSAR models with over 1 million elements.</p>
<p>&nbsp;</p>
<p>More info: <a href="http://viatra.inf.mit.bme.hu/incquery">http://viatra.inf.mit.bme.hu/incquery</a></p></blockquote>
<p>Unfortunately, I cannot go to the conference, but I hope, the 10th birthday of Eclipse will be celebrated well. Have fun, and if you are interested, listen at our talk.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2011/10/emf-incquery-eclipsecon-europe-11/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Source code visualisation for my projects</title>
		<link>http://cubussapiens.hu/2011/09/source-code-visualisation-for-my-projects/</link>
		<comments>http://cubussapiens.hu/2011/09/source-code-visualisation-for-my-projects/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 21:11:16 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Debug Visualisation]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[debug visualisation]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[EMF IncQuery]]></category>
		<category><![CDATA[viatra]]></category>
		<category><![CDATA[zest]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2151</guid>
		<description><![CDATA[Today I read the announcement of SourceCloud, a new Zest/Cloudio-based visualization for source code. As I like cool visualizations, I tried it out on the open projects I am participating in. At first I created the cloud for the source &#8230; <a href="http://cubussapiens.hu/2011/09/source-code-visualisation-for-my-projects/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">Today I read <a href="http://misto.ch/tag-cloud-visualization-for-source-code/">the announcement of SourceCloud</a>, a new Zest/Cloudio-based visualization for source code. As I like cool visualizations, I tried it out on the open projects I am participating in.</div>
<div class="mceTemp">At first I created the cloud for the source code of the <a href="http://code.google.com/p/debugvisualisation/">Debug Visualisation project</a>. Globally it consists of about half Eclipse debugger/UI and Java keywords &#8211; as this is quite a small project (about 4 kLOC), this is somewhat expected with 200 words.</div>
<div id="attachment_2155" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2011/09/dv-cloud.png" rel="lightbox[2151]" title="dv-cloud"><img class="size-medium wp-image-2155" title="dv-cloud" src="http://cubussapiens.hu/wp-content/uploads/2011/09/dv-cloud-300x244.png" alt="" width="300" height="244" /></a><p class="wp-caption-text">SourceCloud of the Debug Visualisation Project</p></div>
<p>However, it is interesting, that the strings &#8216;<em>end_of_line</em>&#8216; and &#8216;<em>sp_cleanup</em>&#8216; found their way in. Luckily, only a few one-character names and numbers are present, meaning, we managed to created longer variable names&#8230;</p>
<p>The cloud of the <a href="http://www.eclipse.org/gmt/VIATRA2/">VIATRA2 model transformation framework</a> is more interesting: it is a much larger codebase, developed for several year by around a dozen people. Because of the size I generated the cloud using 300 words, but almost no Java keywords found their way into the graph.</p>
<div id="attachment_2157" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2011/09/viatra-cloud.png" rel="lightbox[2151]" title="SourceCloud of the VIATRA2 framework"><img class="size-medium wp-image-2157" title="SourceCloud of the VIATRA2 framework" src="http://cubussapiens.hu/wp-content/uploads/2011/09/viatra-cloud-300x269.png" alt="" width="300" height="269" /></a><p class="wp-caption-text">SourceCloud of the VIATRA2 framework</p></div>
<p>However, the mandatory comment parts did, e.g. nbsp or the names of some creators. A lot of EMF-specific keywords are also present. They are present because we have quite a large EMF metamodel that provides several hundred generated Java files.</p>
<p>At last, but not least I also checked the cloud of the <a href="http://viatra.inf.mit.bme.hu/incquery">EMF-IncQuery project</a>. This is smaller, then the VIATRA2 project, but larger then the Debug Visualisation. Additionally, it has a shorter history, but with several key committers.</p>
<div id="attachment_2153" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2011/09/iq-cloud.png" rel="lightbox[2151]" title="SourceCode of the EMF-IncQuery project"><img class="size-medium wp-image-2153" title="SourceCode of the EMF-IncQuery project" src="http://cubussapiens.hu/wp-content/uploads/2011/09/iq-cloud-300x266.png" alt="" width="300" height="266" /></a><p class="wp-caption-text">SourceCloud of the EMF-IncQuery project</p></div>
<p>My personal favorite is this diagram, as it shows a lot of nice things: e.g. four digit numbers in large quantities (magic numbers FTW) or the absolute champion string: &#8216;<em>HUKfyM7ahfg</em>&#8216;. All of them are present in the Ecore Diagram of the defined metamodel (the meaningless string 152 times as a postfix of an identifier <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). At least, I learned something about the internal model representation of GMF.</p>
<p>And how do your projects look like?</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2011/09/source-code-visualisation-for-my-projects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Incremental validation of UML models using EMF-IncQuery</title>
		<link>http://cubussapiens.hu/2011/06/incremental-validation-of-uml-models-using-emf-incquery/</link>
		<comments>http://cubussapiens.hu/2011/06/incremental-validation-of-uml-models-using-emf-incquery/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 13:13:16 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[EMF IncQuery]]></category>
		<category><![CDATA[viatra]]></category>
		<category><![CDATA[videó]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2089</guid>
		<description><![CDATA[Last week we created in the university a nice demo application to demonstrate the validation capabilities of our EMF-IncQuery framework. The application was presented on the conference ECMFA 2011 as a tutorial. EMF-IncQuery provides an incrementally evaluated model query framework: &#8230; <a href="http://cubussapiens.hu/2011/06/incremental-validation-of-uml-models-using-emf-incquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Last week we created in the university a nice demo application to demonstrate the validation capabilities of our EMF-IncQuery framework. The application was presented on the conference <a title="ECMFA Tutorial" href="http://www.ecmfa-2011.org/tutorials.html#t2">ECMFA 2011 as a tutorial</a>.</p>
<p>EMF-IncQuery provides an incrementally evaluated model query framework: as the underlying EMF model is changed, the query results are re-evaluated, and are instantly returned when needed. Queries are formulated using the <a href="http://wiki.eclipse.org/VIATRA2/Examples/VTCL/GraphPattern">pattern language of the VIATRA2</a> transformation system, and the Java code necessary to execute queries are generated.</p>
<p>In our demo application we extended the <a title="Papyrus MDT" href="http://www.eclipse.org/modeling/mdt/papyrus/">Papyrus</a> UML editor with on-the-fly validation of well-formedness constraints. During editing we check for non-local constraints (e.g. a Behaviour must have the same number of parameters as the corresponding operation); display the results in the editor and in the problems view; we try to provide and remove these error markers without saving or manual need to start validation.</p>
<p>Basically, the constraint validators are generated from specially annotated VIATRA2 patterns; the generation is currently somewhat specific to the Papyrus editor, but can be extended to support most EMF-based editors easily.</p>
<p>A screencast of the demo is presented below. It is important to note, that the Papyrus editor was not modified in any way, and the framework generated all Java code used during validation. More details about the demo application, such as source code, tutorial slides, can be found on <a href="http://viatra.inf.mit.bme.hu/incquery/events/ecmfa2011">the homepage of the application</a>.</p>
<p><span style="text-align:center; display: block;"><a href="http://cubussapiens.hu/2011/06/incremental-validation-of-uml-models-using-emf-incquery/"><img src="http://img.youtube.com/vi/3FgBYDoXPUU/2.jpg" alt="" /></a></span></p>
<p>(If the embedded video does not show &#8211; e.g. in a feed reader &#8211; you could watch it on <a href="http://www.youtube.com/watch?v=3FgBYDoXPUU">on Youtube</a>)</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2011/06/incremental-validation-of-uml-models-using-emf-incquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Custom markers and annotations &#8211; the bright side of Eclipse</title>
		<link>http://cubussapiens.hu/2011/05/custom-markers-and-annotations-the-bright-side-of-eclipse/</link>
		<comments>http://cubussapiens.hu/2011/05/custom-markers-and-annotations-the-bright-side-of-eclipse/#comments</comments>
		<pubDate>Wed, 25 May 2011 22:06:00 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[annotation]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[markers]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=2021</guid>
		<description><![CDATA[Motto: I have discovered a truly remarkable proof of this theorem which this margin is too small to contain. Pierre de Fermat During the development of editors it is often needed to display additional information next to the document, such &#8230; <a href="http://cubussapiens.hu/2011/05/custom-markers-and-annotations-the-bright-side-of-eclipse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Motto</strong>:</p>
<blockquote><p>I have discovered a truly remarkable proof of this theorem which this margin is too small to contain.<br />
Pierre de Fermat</p></blockquote>
<p>During the development of editors it is often needed to display additional information next to the document, such as error markers, search results or various coverage metrics. However, it is not a good idea to hardcode the list of supported markers during development, as the best ideas will be introduced by others &#8211; who do not want to have anything to do with our editor.</p>
<p>Luckily, Eclipse provides a simple way to attach markers to documents without explicit support needed from the editor developer: the markers (and annotations) created by their corresponding extensions are stored independently from the document, so these additions can be made without disturbing any existing user of the files.</p>
<p>As I described it in my previous post about <a title="Markers and Annotations in Eclipse for Error Feedback" href="http://cubussapiens.hu/2010/11/markers-and-annotations-in-eclipse-for-error-feedback/">error markers</a>, such markers can be defined creating an extension for the extension point <code>org.eclipse.core.resources.marker</code>, and then using the <code>IResource.createMarker()</code> method to create the marker instances as needed. Then using some magic it can be displayed as the yellow or red wriggly lines during the text.</p>
<p>Other markers (and annotations) can be created in similarly: we create our own marker type, and register an annotation type for it, and the platform manages the rest. In my case I wanted to represent a calculated set of program statements similar to the code coverage display used by <a href="http://www.eclemma.org/">the EclEmma tool</a>: the covered statements are highlighted with the green background.</p>
<p><a href="http://cubussapiens.hu/wp-content/uploads/2011/05/eclemma.png" rel="lightbox[2021]" title="Code coverage with EclEmma"><img class="alignnone size-medium wp-image-2043" title="Code coverage with EclEmma" src="http://cubussapiens.hu/wp-content/uploads/2011/05/eclemma-300x183.png" alt="" width="300" height="183" /></a></p>
<p>To support such a display, I created a new marker type, that is a text marker; and to make the lifecycle-management easier, I did not set it persistent. This has been reached using the following code:</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;extension
    id="org.eclipse.viatra2.slicemarker"
    name="GTASM Slice"
    point="org.eclipse.core.resources.markers"&gt;
  &lt;super
    type="org.eclipse.core.resources.textmarker"&gt;
  &lt;/super&gt;
&lt;/extension&gt;</pre>
<p>The most important difference between this marker and the one defined in the previous <a title="Markers and Annotations in Eclipse for Error Feedback" href="http://cubussapiens.hu/2010/11/markers-and-annotations-in-eclipse-for-error-feedback/">Markers and Annotations post</a> is that the newly defined marker is not a problem marker, but a simple text marker. This means, the created marker will not show in the <em>Problems view</em> (that is nice &#8211; we don&#8217;t want to display problems now), and no default annotation is created (that will need fixing).</p>
<p>In theory it is possible to create annotations programmatically together with the markers, but in practice it is really a bad idea. First of all, annotations are created for the document model (thus assuming an open editor and a code dependency to that document model), are never persisted, and the resulting code fails indeterministically (I once debugged a code like that, every annotation creation code ran correctly, but some annotations were missing; re-running the code re-added the missing ones, but sometimes removed others), so this idea will not work.</p>
<p>Luckily, the platform provides two extension points that can be used to automatically assign annotations to marker instances. To define an automatically generated annotation type for the markers, the <code>org.eclipse.ui.editors.annotationTypes</code> extension point is used: basically a marker and an annotation ID is stored this way.</p>
<p>&nbsp;</p>
<pre class="brush:xml">   &lt;extension
         point="org.eclipse.ui.editors.annotationTypes"&gt;
      &lt;type
            markerType="org.eclipse.viatra2.slicemarker"
            name="org.eclipse.viatra2.slicemarker"&gt;
      &lt;/type&gt;
   &lt;/extension&gt;</pre>
<p>&nbsp;</p>
<p>To define the appearance of the created annotation the <code>org.eclipse.ui.editors.markerAnnotationSpecification</code> extension point can be used. In the extensions we have to specify the annotation display methods used together with color and formatting settings.</p>
<p>&nbsp;</p>
<pre class="brush:xml">   &lt;extension
         point="org.eclipse.ui.editors.markerAnnotationSpecification"&gt;
      &lt;specification
            annotationType="org.eclipse.viatra2.slicemarker"
            colorPreferenceKey="org.eclipse.viatra2.slice.color"
            colorPreferenceValue="192,255,192"
            contributesToHeader="false"
            highlightPreferenceKey="org.eclipse.viatra2.slice.highlight"
            highlightPreferenceValue="true"
            includeOnPreferencePage="true"
            label="GTASM Slice Marker"
            overviewRulerPreferenceKey="org.eclipse.viatra2.slice.overview"
            overviewRulerPreferenceValue="true"
            presentationLayer="0"
            textPreferenceKey="org.eclipse.viatra2.slice.text"
            textPreferenceValue="true"
            textStylePreferenceValue="BOX"
            verticalRulerPreferenceKey="org.eclipse.viatra2.slice.ruler"
            verticalRulerPreferenceValue="true"&gt;
      &lt;/specification&gt;
   &lt;/extension&gt;</pre>
<p>Even better, by assigning preference keys to the various settings the platform also offers the users the possibility to configure the annotations: the <em>General/Editors/Text Editors/Annotations</em> preference page will list our annotation, and allows setting its preference values. If the preference keys are unique (that is our responsibility <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), then creating this extension ends our work: annotations will be generated automatically, and they will be displayed in the opened text editors.</p>
<div id="attachment_2061" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2011/05/annotation_prefs.png" rel="lightbox[2021]" title="Annotation preferences"><img class="size-medium wp-image-2061" title="Annotation preferences" src="http://cubussapiens.hu/wp-content/uploads/2011/05/annotation_prefs-300x173.png" alt="" width="300" height="173" /></a><p class="wp-caption-text">Annotation Preferences</p></div>
<p>The marker creation process is entirely the same as the creation of error markers: a new marker is initialized using the IResource.createMarker(String markerId) method, and the <em>IMarker.CHAR_START</em> and <em>IMarker.CHAR_END </em>markers are set for positioning the markers.</p>
<div id="attachment_2065" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2011/05/slices.png" rel="lightbox[2021]" title="Annotated code"><img class="size-medium wp-image-2065" title="Annotated code" src="http://cubussapiens.hu/wp-content/uploads/2011/05/slices-300x157.png" alt="" width="300" height="157" /></a><p class="wp-caption-text">An editor opened with the annotated code</p></div>
<p>Alltogether, the markers and annotations provide an easy way to extend existing editors with meta-information (e.g. execution state, dependencies, coverage, etc.), that can be used with a very little amount of Java programming. Sadly, the content assists for extensions is not that discoverable as the Java APIs, so a lot of experimenting and/or documentation reading is needed. Luckily, documentation is available for these extension points, so knowing their name will be enough for most cases.</p>
<p>So, lets hope, Eclipse gives us a big enough margin to contain our <del>proo</del> metainformation.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2011/05/custom-markers-and-annotations-the-bright-side-of-eclipse/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Debug Visualisation 0.8.2 out</title>
		<link>http://cubussapiens.hu/2011/01/debug-visualisation-0-8-2-out/</link>
		<comments>http://cubussapiens.hu/2011/01/debug-visualisation-0-8-2-out/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 14:23:29 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Debug Visualisation]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1937</guid>
		<description><![CDATA[I update the Debug Visualisation plug-in &#8211; a nasty bug was present related to opening new nodes that caused in the best case slowdowns, in worst cases exceptions and crashes. This release is a bugfix release only, it is avaiable &#8230; <a href="http://cubussapiens.hu/2011/01/debug-visualisation-0-8-2-out/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I update the Debug Visualisation plug-in &#8211; a nasty bug was present related to opening new nodes that caused in the best case slowdowns, in worst cases exceptions and crashes.</p>
<p>This release is a bugfix release only, it is avaiable from the update site or Eclipse Marketplace, and recommended for every user of the plug-in.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2011/01/debug-visualisation-0-8-2-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How I recorded my part for the Virtual Choir</title>
		<link>http://cubussapiens.hu/2010/12/how-i-recorded-my-part-for-the-virtual-choir/</link>
		<comments>http://cubussapiens.hu/2010/12/how-i-recorded-my-part-for-the-virtual-choir/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 00:27:52 +0000</pubDate>
		<dc:creator>thSoft</dc:creator>
				<category><![CDATA[Others]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1771</guid>
		<description><![CDATA[When I heard of Eric Whitacre&#8217;s Virtual Choir, I was immediately sold. After a lot bit of procrastination, I finally got to recording my part. However, things went not as easy as I had thought. The first obstacle I encountered &#8230; <a href="http://cubussapiens.hu/2010/12/how-i-recorded-my-part-for-the-virtual-choir/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When I heard of <a href="http://ericwhitacre.com/the-virtual-choir">Eric Whitacre&#8217;s Virtual Choir</a>, I was immediately sold. After a <del>lot</del> bit of procrastination, I finally got to recording my part. However, things went not as easy as I had thought.</p>
<p>The first obstacle I encountered was that my MacBook&#8217;s built-in microphone is extremely noisy, so I had to record the video and audio separately, since there&#8217;s anyway a <a href="http://www.youtube.com/watch?v=IrQRVI8y5j8">conductor track</a> to synchronize to (so the video and audio won&#8217;t shift out of sync, there will be only temporary discrepancies), and I will attempt the recording multiple times anyway.</p>
<p>The next unpleasant surprise: playing a video consumes so much CPU that the fan is turned on, which is way too noisy. This was also a showstopper. I would have tried CPU throttling, but unfortunately <a href="http://www.willnolan.com/cputhrottle/cputhrottle.html">cputhrottle</a> didn&#8217;t work: the binary archive was corrupted, and the source couldn&#8217;t in any way compile. I almost gave up, when the LG GT540 Android smartphone I just got for this Christmas came into mind: it could serve perfectly as the video player!</p>
<p>This also wasn&#8217;t easy as pie, though. After downloading the video with <a href="https://addons.mozilla.org/hu/firefox/addon/3006">Video DownloadHelper</a> and copying it to the SD card, Android&#8217;s pre-bundled Media Player couldn&#8217;t open it. I found the excellent <a href="http://www.arcmediasoft.com">arcMedia</a> player, which could play it, but at an impossibly slow frame rate. So I had to resize it: I chose <a href="http://handbrake.fr">HandBrake</a>, and with the preset iPod conversion profile selected (320&#215;192), the downgraded video played smoothly even in the built-in Media Player.</p>
<p>So I finally grabbed the phone, my <a href="http://usa.yamaha.com/products/music-production/recorders/pocketrak_2g">Yamaha Pocketrak 2G</a> recorder and the printed sheet music (I preferred the <a href="http://musescore.com/score/1743">SATB score</a> to the part), and dwelved into the music. (Of course, our neighbor&#8217;s dog barked into the silence at the end &#8211; I already expected that, but I managed to cut it out.)</p>
<p>However, replacing the audio track of the video was also hampered: iMovie &#8217;08 can&#8217;t import the clip it recorded to a project, so I had to Google again. After another fair amount of time, I found <a href="http://simplemoviex.com/SimpleMovieX">SimpleMovieX</a>, which suited my needs. I separated the video &amp; audio track, added the new audio track to the video, synchronized them a bit and at last, the dubbed version was ready.</p>
<p>You can view the result <a href="http://www.youtube.com/watch?v=_TCn9autTtc">here</a>. I&#8217;m glad to finally be able to join a worldwide choir in this innovative social media experiment.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2010/12/how-i-recorded-my-part-for-the-virtual-choir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

