<?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 &#187; Balage</title>
	<atom:link href="http://cubussapiens.hu/author/Balage/feed/" rel="self" type="application/rss+xml" />
	<link>http://cubussapiens.hu</link>
	<description>A Cubus Sapiens oldal</description>
	<lastBuildDate>Sat, 14 Jan 2012 23:33:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<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>How to turn a printer power unit to a fancy lab power supply</title>
		<link>http://cubussapiens.hu/2010/06/how-to-turn-a-printer-power-unit-to-a-fancy-lab-power-supply/</link>
		<comments>http://cubussapiens.hu/2010/06/how-to-turn-a-printer-power-unit-to-a-fancy-lab-power-supply/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 21:07:50 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Hardware Hacks]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[lab]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1445</guid>
		<description><![CDATA[A dead printer is a great possibility to gain useful components. You can scoop many kind of parts, like DC motors (stepper motors if you&#8217;re lucky), wires, gears, etc.. And of course a power supply unit. The power supply can &#8230; <a href="http://cubussapiens.hu/2010/06/how-to-turn-a-printer-power-unit-to-a-fancy-lab-power-supply/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A dead printer is a great possibility to gain useful components. You can scoop many kind of parts, like DC motors (stepper motors if you&#8217;re lucky), wires, gears, etc.. And of course a power supply unit. The power supply can be useful in many ways, for example as a lab power supply. But without a case it is a bit dangerous, as you can accidentally touch something, which would be painful. Warning! Don&#8217;t try this at home, unless you&#8217;re perfectly know what are you doing, and have practice handling with 220 Volts.</p>
<p>Now, if you dare, run up to attic, and bring down the dead printer, clean the dust and grab a screwdriver. After tearing down the device to the smallest parts possible without breaking anything, you should see a component like this:</p>
<p><a href="http://www.flickr.com/photos/gbalage/4746189721/" title="DSCF7533 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4136/4746189721_5f861119bc.jpg" width="500" height="375" alt="DSCF7533"/></a></p>
<p>It&#8217;s rather simple: it has an input, AC 220 Volts in Europe usually connected with thick wires. The output varies by brand and type but it&#8217;s surely DC, low voltage connected with thin wires. Look for the numbers printed on the board, they usually tell the output voltage and maximum power. In this case, it&#8217;s 18 Volts and 25 Watts. This is more than enough for experimental purposes.</p>
<p>Before you continue, check it out carefully. The printer is not working because of a cause, and maybe that cause is the power supply itself. The easiest way to check is to connect a multimeter to the output and plug it in. Be very careful with this step, try to not touch the device while it is under power. </p>
<p>If the power supply is not working, try to check out the fuse. If it&#8217;s burnt, you should replace it and try again. If it solves the problem, then maybe it was the cause that rendered the printer dead. At this point you can just put the printer together, and live on. And of course make merit of fixing a dead printer. Both cases, continue reading, the lab supply is far from finished yet.</p>
<p>To make it safe and easy to use, it should be inserted in a case. You can buy one in any electronics shop. I&#8217;ve used a plastic one as it&#8217;s easier to use, but many thinks that a metal box looks better. If you use a metal box, more work is needed as you should take care of grounding the box itself, and insulation of the power supply board. A printer is usually not grounded, so the power cable of the printer won&#8217;t be adequate. I&#8217;ve reused the AC connector of the printer, it can be clipped easily into a matching hole, which was easy to cut into the back board of the box using a drill and a rasper:</p>
<p><a href="http://www.flickr.com/photos/gbalage/4746822292/" title="DSCF7537 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4095/4746822292_a9f4f4bd46.jpg" width="500" height="375" alt="DSCF7537"/></a></p>
<p>I&#8217;ve used similar method on the front board, which contains two banana connectors for the output, and a switch which enables to turn off the device without unplugging it:</p>
<p><a href="http://www.flickr.com/photos/gbalage/4746458485/" title="DSCF7536 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4143/4746458485_01821b52d9.jpg" width="500" height="375" alt="DSCF7536"/></a></p>
<p>Soldering is hard in small places, and the hot iron can damage the plastic box badly. So instead of soldering the wires together in the box, I recommend using a terminal block as I did. The block can be fixed to the box using a glue gun. I&#8217;ve also used glue gun to mount a screw and two copper wires into the hold the power supply board in place:</p>
<p><a href="http://www.flickr.com/photos/gbalage/4746194307/" title="DSCF7540 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4138/4746194307_bfa116f246.jpg" width="500" height="375" alt="DSCF7540"/></a></p>
<p><a href="http://www.flickr.com/photos/gbalage/4746191697/" title="DSCF7543 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4136/4746191697_9a65a525ec.jpg" width="500" height="375" alt="DSCF7543"/></a></p>
<p>The hard work is done, all is left is to put the whole thing together. Doing some wiring work:</p>
<p><a href="http://www.flickr.com/photos/gbalage/4746815822/" title="DSCF7546 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4081/4746815822_eac4b4bf21.jpg" width="500" height="375" alt="DSCF7546"/></a></p>
<p>And then voilá, it&#8217;s finished:</p>
<p><a href="http://www.flickr.com/photos/gbalage/4746826890/" title="DSCF7548 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4077/4746826890_3367ef43c0.jpg" width="500" height="375" alt="DSCF7548"/></a></p>
<p><a href="http://www.flickr.com/photos/gbalage/4746824568/" title="DSCF7549 by GBalage;, on Flickr"><img src="http://farm5.static.flickr.com/4118/4746824568_621a72b3e1.jpg" width="500" height="375" alt="DSCF7549"/></a></p>
<p>Have fun doing your own lab power supply! More pictures here:<a href="http://www.flickr.com/photos/gbalage/sets/72157624262231051/">http://www.flickr.com/photos/gbalage/sets/72157624262231051/</a></p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2010/06/how-to-turn-a-printer-power-unit-to-a-fancy-lab-power-supply/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inkrementális enkóderek alkalmazása</title>
		<link>http://cubussapiens.hu/2010/04/inkrementalis-enkoderek-alkalmazasa/</link>
		<comments>http://cubussapiens.hu/2010/04/inkrementalis-enkoderek-alkalmazasa/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 12:58:27 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[pic]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1356</guid>
		<description><![CDATA[Kicsit lassan haladok az önképzéssel, nehezen gyűjtöm össze a megfelelő mennyiségű szorgalmat, hogy a hétköznapi hajtás után egy-egy hétvégén pihenés helyett elővegyem a hardvereket a fiókból. Ezen a hétvégén kivételesen sikerült. Hogy pontos legyek, kezembe került egy inkrementális enkóder, ami &#8230; <a href="http://cubussapiens.hu/2010/04/inkrementalis-enkoderek-alkalmazasa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Kicsit lassan haladok az önképzéssel, nehezen gyűjtöm össze a megfelelő mennyiségű szorgalmat, hogy a hétköznapi hajtás után egy-egy hétvégén pihenés helyett elővegyem a hardvereket a fiókból. Ezen a hétvégén kivételesen sikerült. Hogy pontos legyek, kezembe került egy inkrementális enkóder, ami (akinek nem ismerős a fogalom) arra jó, hogy forgó mozgás irányát, mennyiségét és esetleg sebességét meghatározzuk. </p>
<p>Az abszolút enkóderekkel ellentétben az inkrementális enkóderek nem képesek megadni a forgás pillanatnyi helyét, segítségükkel csak azt lehet meghatározni, hogy történt-e forgás valamelyik irányba. Viszont jelentősen olcsóbbak, és kevesebb lábat foglalnak el a mikrokontrolleren. Ez sem utolsó szempont, tekintve hogy pár óra kínlódás után rájöttem, hogy a kontrolleremen két láb halott.. </p>
<p>Általában véve a forgási enkóderek működését a <a href="http://en.wikipedia.org/wiki/Rotary_encoder">Wikipedia vonatkozó cikke</a> jobban elmagyarázza, mint én tudnám, így erre nem térek ki részletesen. A lényeg csupán annyi, hogy egy egységnyi forgás alatt két kapcsoló zár az enkóderben egymás után, a forgás irányától függően. Ennek tipikus bekötése active-low jelleggel rendkívűl egyszerű, az enkóder C csatlakozója ráköthető a földre, az A és B lábak számára pedig kiválasztunk két portot a kontrolleren, az én esetemben ez RB6 és RB7 lett. Ezen kívül semmilyen más alkatrészre nincs szükség, hiszen a Pic16F690-es processzor integráltan tartalmaz felhúzó áramkört, ami képes magas szinten tartani az adott portot, és leföldelés esetén biztonságos szinten tartja az áramot.</p>
<p>A feladat tehát a következő: detektálni kell az enkóder kapcsolóinak a zárását, figyelembe véve a sorrendjüket, és ennek megfelelően kell egy változó értékét növelni, vagy csökkenteni. Ha az A kapcsoló zár előbb, és később a B, akkor növelni, ha fordítva akkor csökkenteni kell eggyel a változót. Az általam használt  EC12E típusú enkóder 24 diszkrét egységre bont egy kört, azaz 15 fokonként képes érzékelni a forgást, tehát a változó értékét 15-el megszorozva megkapjuk a pontos forgást. Az enkóder mechanikus jellege miatt a használat közben számítani kell pergés előfordulására, aminek a kezeléséről gondoskodni kell.</p>
<p>A mikroprogram gyors időközönként leolvassa a kapcsolók állását, és ez alapján kell eldöntenie, hogy merre forgatjuk az enkóder karját. Mivel figyelembe kell venni a kapcsolók korábbi állapotát is, triviálisan adja magát egy állapotgép-alapú megoldás, ami a pergést úgy küszöböli ki, hogy megengedi az állapotok közötti oda-vissza ugrálást a pergést követve, a pergés stabilizálódásával pedig az állapot is a megfelelő értéken rögzül.</p>
<p>Az állapotgép bemenete a két kapcsoló állása és minden leolvasáskor végrehajt egy lépést:<br />
<a href="http://cubussapiens.hu/wp-content/uploads/2010/04/statemachine.png" rel="lightbox[1356]" title="state machine"><img src="http://cubussapiens.hu/wp-content/uploads/2010/04/statemachine.png" alt="" title="state machine" width="176" height="185" class="alignnone size-full wp-image-1357" /></a></p>
<p>Az állapotgép megfelelő élei biztosítják, hogy amíg valamelyik kapcsoló pereg, addig a megfelelő két állapot között lépkedjen. Az ábrán pirossal és kékkel jelöltem azokat a lépéseket, mikor is növelem vagy csökkentem a forgást mérő változó értékét. </p>
<p>A programot a gyakorlatban is kipróbáltam, assembly-ben írtam a Pic16F690-hez a kódot, és a pickit2 próbapanelen lévő 4 led segítségével jelzem a változó aktuális értékét:</p>
<pre>
#include &lt;p16F690.inc&gt;
     __config (_INTRC_OSC_NOCLKOUT &#038; _WDT_OFF &#038; _PWRTE_OFF &#038; _MCLRE_OFF &#038; _CP_OFF &#038; _BOR_OFF &#038; _IESO_OFF &#038; _FCMEN_OFF)

     cblock 0x20
State		;state machine variable
Display         ;data to be displayed
     endc

     org 0
Start:
	clrf PORTB
     	bsf STATUS,RP0		; select Register Page 1
	bcf OPTION_REG,7
     	movlw 0xFF
     	movwf TRISA		; Make PortA all input
     	movwf TRISB
     	clrf TRISC		; Make PortC all output
     	clrf ANSEL 		; all pins digital

     	bcf STATUS,RP0		; back to Register Page 0
     	bsf STATUS,RP1		; Reg page 2

	movlw 0xFF
	movwf WPUB		; enable weak pull-up for Port B

	bcf STATUS, RP1		; Reg page 0

     	clrf Display
	clrf State

MainLoop:

;state table:
; input	|  000 	|  010	|  100	|  011	|  101	|
;  00	| 		->000			| == always ->000
;  01	|      ->010 	| ->000 | ->010 |->000- | == if state,0 ->000 (dec if 101), else ->010
;  10	| ->100	| ->000	| ->100 |->000+	| ->100 | == if state,1 ->000 (inc if 011), else ->100
;  11	| ->000 | ->011 | ->101 | ->011 | ->101 | == if state,0 ->101, else if state,1 ->011, else ->000

;decide current input: 00, 01, 10, or 11
;note that all input are active low

	btfss PORTB,6
	goto Input0
	goto Input1

Input0:
	btfss PORTB,7
	goto Input00
	goto Input01	

Input1:
	btfss PORTB,7
	goto Input10
	goto Input11

Input11: ;00
	clrf State		;state ->000
	goto Output
Input10: ;01
	btfss State,0
	goto I01B		;if 0xx
	goto I01A		;if 1xx
I01A:
		btfsc State,2	;if xx1
		decf Display,1	; decrement data
		clrf State	;->000
		goto Output
I01B:
		clrf State	;->010
		bsf State,1
		goto Output
Input01: ;10
	btfss State,1
	goto I10B		;if x0x
	goto I10A		;if x1x
I10A:
		btfsc State,2	;if xx1
		incf Display,1	; increment data
		clrf State	;->000
		goto Output
I10B:
		clrf State	;->100
		bsf State,0
		goto Output
Input00: ;11
	btfsc State,0		;if 1xx
	goto IA
	btfsc State,1		;or x1x
	goto IA
	goto Output
IA:
		bsf State,2 	;->uu1
	goto Output

Output:

     movfw     Display       ; Copy the display to the LEDs
     movwf     PORTC

     goto      MainLoop
     end
</pre>
<p>A dolgot összeállítva minden várakozásomat felülmúlva működött, a forgást pontosan és gyorsan méri, bár csak kézzel forgattam, így nem tudtam letesztelni, hogy mekkora szögsebességet képes még mérni. Mindenestre akár felhasználónak nyújtott bemeneti eszközként is remekül szerepelhet, mindenképpen kifinomultabb megoldás mint pl. egy potméter A/D átalakítóval. Digitális hifiken rendszeresen találkozhatunk ezzel a megoldással hangerő-szabályozás formájában.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2010/04/inkrementalis-enkoderek-alkalmazasa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New service release: 0.7.2</title>
		<link>http://cubussapiens.hu/2009/11/new-service-release-0-7-2/</link>
		<comments>http://cubussapiens.hu/2009/11/new-service-release-0-7-2/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 19:22:56 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Debug Visualisation]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://en.cubussapiens.hu/?p=28</guid>
		<description><![CDATA[I&#8217;m proud to announce that after a long time, we finally managed to throw out a new release. I&#8217;ve managed to improve the core functionality therefore this release contains a significant advance in overall performance. Also, Stampie managed to fix &#8230; <a href="http://cubussapiens.hu/2009/11/new-service-release-0-7-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:en--></p>
<p>I&#8217;m proud to announce that after a long time, we finally managed to throw out a new release. I&#8217;ve managed to improve the core functionality therefore this release contains a significant advance in overall performance.</p>
<p>Also, Stampie managed to fix a long-awaited feature, the two-way synchronization with the variables view.</p>
<p>In the future, we plan to redesign the use-cases of the tool. Currently, we&#8217;re in an experimental phase, which means we do not know how we want it to work.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/11/new-service-release-0-7-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Eclipse GEF wtf</title>
		<link>http://cubussapiens.hu/2009/11/eclipse-gef-wtf/</link>
		<comments>http://cubussapiens.hu/2009/11/eclipse-gef-wtf/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 19:25:56 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programozás]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1287</guid>
		<description><![CDATA[Az előző kitérő után most térjünk vissza egy kis kocka témához. A minap érdekes felfedezést tettem, miközben véletlenül a GEF belső kódjába tévedtem debug közben. Alapvetően egyébként meg vagyok elégedve a GEF és általában az eclipse platform minőségével, ritka az &#8230; <a href="http://cubussapiens.hu/2009/11/eclipse-gef-wtf/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Az előző kitérő után most térjünk vissza egy kis kocka témához. A minap érdekes felfedezést tettem, miközben véletlenül a GEF belső kódjába tévedtem debug közben. Alapvetően egyébként meg vagyok elégedve a GEF és általában az eclipse platform minőségével, ritka az az eset, hogy a fejemet fogom egy-egy megoldás láttán. </p>
<p>A következő kódrészlet ugyan működik és mivel a publikus api elrejti, az átlag fejlesztő nem találkozik vele, mégis  érdemes rávetni egy pillantást. További szócséplés helyett következzék a kód, szerintem magáért beszél:</p>
<p><code lang="java"><br />
//AbstractEditPart.class</p>
<p>private Object[] policies;</p>
<p>//...</p>
<p>/**<br />
 * @see EditPart#installEditPolicy(Object, EditPolicy)<br />
 */<br />
public void installEditPolicy(Object key, EditPolicy editPolicy) {<br />
	Assert.isNotNull(key, "Edit Policies must be installed with keys");//$NON-NLS-1$<br />
	if (policies == null) {<br />
		policies = new Object[2];<br />
		policies[0] = key;<br />
		policies[1] = editPolicy;<br />
	} else {<br />
		int index = 0;<br />
		while (index < policies.length &#038;&#038; !key.equals(policies[index]))<br />
			index += 2;<br />
		if (index < policies.length) {<br />
			index++;<br />
			EditPolicy old = (EditPolicy)policies[index];<br />
			if (old != null &#038;&#038; isActive())<br />
				old.deactivate();<br />
			policies[index] = editPolicy;<br />
		} else {<br />
			Object newPolicies[] = new Object[policies.length + 2];<br />
			System.arraycopy(policies, 0, newPolicies, 0, policies.length);<br />
			policies = newPolicies;<br />
			policies[index] = key;<br />
			policies[index + 1] = editPolicy;<br />
		}<br />
	}</p>
<p>	if (editPolicy != null) {<br />
		editPolicy.setHost(this);<br />
		if (isActive())<br />
			editPolicy.activate();<br />
	}<br />
}<br />
</code></p>
<p>Akinek nem világos elsőre, kifejteném a problémát: láthatóan egy tömböt használ a java-ban alapértelmezésként elérhető "Map" funkcionalitásának a kiváltására. A tömb páros (és nulladik) helyén szereplő elem tárolja a kulcsot, az utána lévő páratlan helyen lévő elem az érték. </p>
<p>Minden elem hozzáadásakor dinamikusan növeli a tömb méretét, törléskor meg egyszerűen null-ra állítja a tömb megfelelő elemét. Ehhez még társul egy custom iterátor is, ami a tömb nem null elemeit listázza.</p>
<p>Őszintén nem értem a tervezési döntést, ami a tömb-alapú Map-hez vezethetett. A memóriaigénye a HashMap-nek nem sokkal több, és mivel jellemzően kis elemszámú esetek fordulnak elő, ez nem számottevő. A sebessége a HashMap-nek jobb, a "get" és "put" metódusok általános esetben konstans, de mindenképpen kevesebb a tömb végigjárásánál. Mindennek a tetejébe a fenti kód Map alkalmazásával kb. 3 sorra cserélhető, nem beszélve az osztály egyéb kódjáról, ami a tömböt piszkálja.</p>
<p>Egyetlen érthető mentségként csak arra tudok gondolni, hogy esetleg a kód korábban íródott, minthogy a java collections API-ba belekerült volna a Map. Ez viszont az 1.2-es verzióban történt meg, tehát elég régen. Nem tudom mennyi idős a GEF, így ezt nem tudom eldönetni.. Mindenesetre ez a kód nálam megütötte a WTF szintet.</code></p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/11/eclipse-gef-wtf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java konstruktor hívási sorrend</title>
		<link>http://cubussapiens.hu/2009/09/java-konstruktor-hivasi-sorrend/</link>
		<comments>http://cubussapiens.hu/2009/09/java-konstruktor-hivasi-sorrend/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 21:05:12 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programozás]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1219</guid>
		<description><![CDATA[Rég írtam, valóban. Hogy újra rávezessem magam a kedvenc munkán kívüli elfoglaltságomhoz, most egy egyszerűbb témát vetek fel, ami mégis okozott pár kobak-koppanást az asztalon. Nevezetesen arról szándékozom írni, hogy a Java hogyan sorrendezi egy objektum inicializálásában résztvevő kódokat. Mert &#8230; <a href="http://cubussapiens.hu/2009/09/java-konstruktor-hivasi-sorrend/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Rég írtam, valóban. Hogy újra rávezessem magam a kedvenc munkán kívüli elfoglaltságomhoz, most egy egyszerűbb témát vetek fel, ami mégis okozott pár kobak-koppanást az asztalon. Nevezetesen arról szándékozom írni, hogy a Java hogyan sorrendezi egy objektum inicializálásában résztvevő kódokat. Mert bizony több lehet, és nem egyértelmű a lefutási sorrend, ahogy azt a követkető kódrészlet szemlélteti:</p>
<p><code lang="java"><br />
public class AB{<br />
	public static abstract class A{<br />
		public A(){<br />
			doSomething();<br />
	    }<br />
	    protected abstract void doSomething();<br />
	}</p>
<p>	public static class B extends A{<br />
		final String s = "1234";<br />
		final Object o = "1234";<br />
	    public B(){<br />
	    	super();<br />
	    }<br />
	    @Override<br />
	    protected void doSomething(){<br />
	    	System.out.println(s.getClass());<br />
	    	System.out.println(o.getClass());<br />
	    }<br />
	}</p>
<p>	public static void main(String[] args){<br />
	    new B();<br />
	}<br />
}<br />
</code></p>
<p>A példát igyekeztem egyszerűnek tartani, de talán megérdemel egy rövid magyarázatot: Két osztályt definiáltam, az egyik leszármazottja a másiknak. Érdekesség még, hogy az ős konstruktora kódot hív meg a leszármazottból absztrakt metóduson keresztűl. Egy &#8220;B&#8221; típusú objektum létrehozásához láthatóan három helyről kell kódot hívni: Az &#8220;A&#8221; és a &#8220;B&#8221; konstruktora, továbbá a &#8220;B&#8221; osztályban lévő, konstruktoron kívüli inicializálás. A probléma ezen három kódrészlet lefutásának sorrendje.</p>
<p>Első ránézésre a kóddal semmi probléma nincs azon kívül, hogy teljesen haszontalan. Mindkét mező final, így gondolnánk a konstruktor elött inicializálódnak, tehát nem okozhat problémát. Azonban a kód futtatásakor egy csinos NullPointerException kacsint vissza ránk. A futás kimenete:</p>
<p><code><br />
class java.lang.String<br />
Exception in thread "main" java.lang.NullPointerException<br />
	at AB$B.doSomething(AB.java:22)<br />
	at AB$A.<init>(AB.java:8)<br />
	at AB$B.</init><init>(AB.java:17)<br />
	at AB.main(AB.java:27)<br />
</init></code></p>
<p>Láthatóan a B.doSomething() első sora lefut hiba nélkül, a probléma utána keletkezik. Tehát az &#8220;s&#8221; változó már létezik, az &#8220;o&#8221; viszont nem. A konstruktorok lefutásának sorrendje tehát: s=..,A(),o=..,B(). A két mező között csupán az a különbség, hogy az &#8220;s&#8221; mező típusa megegyezik a futásidejű értékének típusával. Ez meghatározza, hogy a mező a szülő osztály konstruktora előtt vagy után kap értéket. Érdemes kipróbálni, ha az &#8220;s&#8221; mező elöl kivesszük a final kulcsszót, az azt okozza, hogy az is a szülő konstruktor hívása után kap értéket. Vajon hogy határozódik meg a pontos sorrend, mitől függ, hogy hova ütemezi be a java a mezők értékadását? </p>
<p>Nyílván valahogy igyekszik meghatározni, hogy az adott értékadás kiértékelhető-e az osztály örökölt részének inicializálása nélkül vagy sem. Ennek tesztelésére tettem még egy kísérletet, kicsit módosítva a példát:</p>
<p><code lang="java"><br />
public class AB{<br />
	public static abstract class A{<br />
		protected String a;<br />
		public A(){<br />
			a = "abc";<br />
			doSomething();<br />
	    }<br />
	    protected abstract void doSomething();<br />
	}</p>
<p>	public static class B extends A{<br />
		final String s = "1234"+a;<br />
		final Object o = "1234";<br />
	    public B(){<br />
	    	super();<br />
	    }<br />
	    @Override<br />
	    protected void doSomething(){<br />
	    	System.out.println(s.getClass());<br />
	    	System.out.println(o.getClass());<br />
	    }<br />
	}</p>
<p>	public static void main(String[] args){<br />
	    new B();<br />
	}<br />
}<br />
</code></p>
<p>Ez a kód is szépen elszáll, méghozzá a B.doSomething() első sorában! Azaz, az explicit hivatkozás egy szülő objektum-beli elemre azt eredményezi, hogy a mező értékadását a szülő konstruktor utánra ütemezi. Elég intelligensnek tűnik a dolog, de mégis beleütközik az ember, mert másra számít. </p>
<p>Persze elkerülhető a dolog ha a konstruktorból hívott absztrakt metódusokat anti-pattern-nek kiáltjuk ki, bár gyakran jól jön. Mégis pontosan mi határozza meg a sorrendet, és lehet-e befolyásolni valahogyan? Van valaki aki nálam sikeresebben guglizott?</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/09/java-konstruktor-hivasi-sorrend/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>A burst of commits</title>
		<link>http://cubussapiens.hu/2009/08/a-burst-of-commits/</link>
		<comments>http://cubussapiens.hu/2009/08/a-burst-of-commits/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 09:21:27 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Debug Visualisation]]></category>
		<category><![CDATA[plans @en]]></category>

		<guid isPermaLink="false">http://blog.cubussapiens.hu/?p=20</guid>
		<description><![CDATA[I&#8217;ve commited the project a long ago, but the previous few days I&#8217;ve had some spare time to kill on the project. The work mostly focused on the input package, which I didn&#8217;t liked at all when I wrote it &#8230; <a href="http://cubussapiens.hu/2009/08/a-burst-of-commits/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:en-->I&#8217;ve commited the project a long ago, but the previous few days I&#8217;ve had some spare time to kill on the project. The work mostly focused on the input package, which I didn&#8217;t liked at all when I wrote it in the first time. I just didn&#8217;t have better idea. But i have now and rewrote the whole part.</p>
<p>I&#8217;m satisfied with the currently used approach (for now), as I&#8217;ve managed to separate different functionalities, and connect them in a simple way. Also, it is reasonably faster than before, but it still makes the eclipse lagging when the user steps the debug context, which I don&#8217;t know why (yet). Anyway, navigating in the graph, hiding/showing nodes and other display-related functions are now fast enough.</p>
<p>For a more detailed explanation of the new operation, see the wiki page <a href="http://code.google.com/p/debugvisualisation/wiki/InputPackage">InputPackage</a>.</p>
<p>ps.: for a change as big as this, I&#8217;m thinking of a maintenance step in the version numbering (0.7.0 instead of 0.6.2), what do you think? I&#8217;m hesitating because of the lack of new features.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/08/a-burst-of-commits/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Debug Visualisation 0.6.0 released</title>
		<link>http://cubussapiens.hu/2009/06/debug-visualisation-0-6-0-released/</link>
		<comments>http://cubussapiens.hu/2009/06/debug-visualisation-0-6-0-released/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 15:11:29 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Debug Visualisation]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://blog.cubussapiens.hu/?p=11</guid>
		<description><![CDATA[<!--:hu-->Release version 0.6.0 of Debug Visualisation view<!--:--><!--:en-->Release version 0.6.0 of Debug Visualisation view<!--:--> <a href="http://cubussapiens.hu/2009/06/debug-visualisation-0-6-0-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:en--></p>
<p>After many hours of work we finally managed to release a new version of the Debug Visualisation project! This release is a complete rewrite of the previous version (0.5.X), and now it is built upon the JFace API and other standard eclipse technologies instead of different custom hackings. We expect improved stability and maintainability from the new techniques, which means that we can implement more advanced features in the plugin.</p>
<p>Currently, the new version does not include all functionality what the old version did, but we&#8217;re sure we will manage to reach it soon.  For more information about this release, please refer to the <a href="http://code.google.com/p/debugvisualisation/wiki/ReleaseAnnouncement0_6_0">release announcement</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/06/debug-visualisation-0-6-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kiválasztás átvitele eclipse nézetek között</title>
		<link>http://cubussapiens.hu/2009/06/kivalasztas-atvitele-eclipse-nezetek-kozott/</link>
		<comments>http://cubussapiens.hu/2009/06/kivalasztas-atvitele-eclipse-nezetek-kozott/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 20:05:15 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[view]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Érdekes problémákba ütközik az ember, ha eclipse környékén fejleszt. Ezek nagyrészét ugyan már megoldották, de a megoldást külön művészet megtalálni a tengernyi dokumentációban. Mindenesetre legalább dokumentálták. A probléma, amiben pár napja az örömömet leltem, az az, hogy hogyan lehet egy nézet által kiválasztott elemeket átadni egy másik nézetnek, ami természetesen hasonló modell felett dolgozik. Konkrétan a <a href="http://code.google.com/p/debugvisualisation/">Debug Visualisation</a> projektem által definiált nézetet akartam <a href="http://code.google.com/p/debugvisualisation/issues/detail?id=12&#038;can=1">összekötni</a> a Variables View-vel és vice-versa.
 <a href="http://cubussapiens.hu/2009/06/kivalasztas-atvitele-eclipse-nezetek-kozott/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Érdekes problémákba ütközik az ember, ha eclipse környékén fejleszt. Ezek nagyrészét ugyan már megoldották, de a megoldást külön művészet megtalálni a tengernyi dokumentációban. Mindenesetre legalább dokumentálták. A probléma, amiben pár napja az örömömet leltem, az az, hogy hogyan lehet egy nézet által kiválasztott elemeket átadni egy másik nézetnek, ami természetesen hasonló modell felett dolgozik. Konkrétan a <a href="http://code.google.com/p/debugvisualisation/">Debug Visualisation</a> projektem által definiált nézetet akartam <a href="http://code.google.com/p/debugvisualisation/issues/detail?id=12&amp;can=1">összekötni</a> a Variables View-vel és vice-versa.</p>
<p>Pár óra keresgélés és javadoc olvasgatás után rábukkantam a megoldásra: Minden view-t tartalmazó IWorkbenchPartSite lehetőséget biztosít egy ISelectionProvider regisztrálására, amely interfészt ad kiválasztási információk kinyerésére és átadására, továbbá listener-ek regisztrálására. A másik, csatlakoztatni kívánt view által megadott ISelectionProvider-nek az általunk generált kiválasztási eseményeket át lehet adni, illetve figyelni lehet az általa generált ilyen eseményeket.</p>
<p>A problémát csak az okoz, hogy egy adott view által generált és elfogadott kiválasztandó elemek az adott view modelljéből kerül ki, tehát ugyanezen modell elemeit kell neki átadni. Ha az általunk írt view más modellen, vagy ugyanazon modell felett máshogy definiálja a kiválasztást, akkor a kiválasztást konvertálni kell a modellek között. Ez természetesen csak akkor oldható meg, ha egyáltalán értelmezhető a közös kiválasztás.</p>
<p>Mindehhez persze az első lépés az, hogy megtaláljuk a csatlakoztatni kivánt view-t, amit az azonosítójának ismeretében tehetünk meg a következő módon:</p>
<p><code lang="java"><br />
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(viewID).getSite().getSelectionProvider();<br />
</code></p>
<p>ahol a [cci_java]viewID[/cci_java] helyére a keresett view szöveges azonosítóját kell megadni. A Variables View azonosítóját az org.eclipse.debug.ui plugin egy [cci_java]IDebugUIConstants[/cci_java] nevű publikus interfész elérhetővé teszi.</p>
<p>Mint az eclipse esetében általában erre problémára is egy jól kitalált megoldás létezik, ami megfelelően egyszerű ahhoz, hogy a módszer ismeretében könnyű legyen implementálni, a nehézséget csak a módszer megtalálása jelenti.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/06/kivalasztas-atvitele-eclipse-nezetek-kozott/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Resource fájlok eclipse plugin extension-ben</title>
		<link>http://cubussapiens.hu/2009/04/resource-fajlok-eclipse-plugin-extension-ben/</link>
		<comments>http://cubussapiens.hu/2009/04/resource-fajlok-eclipse-plugin-extension-ben/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 16:53:03 +0000</pubDate>
		<dc:creator>Balage</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[hogyancsináld]]></category>
		<category><![CDATA[tanulás]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aki fejlesztett már Eclipse PDE felett, az talán találkozott a lehetőséggel, hogy egy extension point tulajdonság típusa lehet "resource" is. Ez annyit tesz, hogy a kiterjesztésben megadhatunk egy, a plugin-nel csomagolt fájlt. De a másik oldalon, az extension point beolvasásakor hogyan is olvassuk ezt be? Hiszen fogalmunk sincs honnan jött, melyik plugin adja az extension-t, és hol keressük a fájlt. A megoldás nem triviális, és kell egy kis kutatást végezni, hogy rájöjjünk. Én ezt megtettem, és igyekszem közérthető formában továbbadni.
 <a href="http://cubussapiens.hu/2009/04/resource-fajlok-eclipse-plugin-extension-ben/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Aki fejlesztett már Eclipse PDE felett, az talán találkozott a lehetőséggel, hogy egy extension point tulajdonság típusa lehet &#8220;resource&#8221; is. Ez annyit tesz, hogy a kiterjesztésben megadhatunk egy, a plugin-nel csomagolt fájlt. De a másik oldalon, az extension point beolvasásakor hogyan is olvassuk ezt be? Hiszen fogalmunk sincs honnan jött, melyik plugin adja az extension-t, és hol keressük a fájlt. A megoldás nem triviális, és kell egy kis kutatást végezni, hogy rájöjjünk. Én ezt megtettem, és igyekszem közérthető formában továbbadni.<br />
<!--break--><br />
A probléma, kicsit formálisabban: adott egy extension point, melyen egyik attributúma resource típusú. Mikor egy plugin extension-t csatol ehhez a ponthoz, az adott attríbutúmnak úgy ad értéket, hogy a programozó kiválaszt egy fájlt, amit a pluginnel együtt csomagolva ad. Az extension point-ot adó plugin pedig az ilyen módon regisztrált fájlokat szeretné beolvasni.</p>
<p>Amikor beolvassuk ezt az értéket az extension-ből, a fájl relatív elérési útvonalát kapjuk meg a plugin csomagjában. Első feladatunk tehát, megtalálni a plugin csomagot ([[http://www.osgi.org/javadoc/r4v41/org/osgi/framework/Bundle.html|Bundle]]), ahonnan az extension jött, hiszen abban kell keresni a fájlt is. Ha megvan a csomag, kérhetünk tőle egy URL-t a fájlhoz. A kapott URL azonban nem szokványos, &#8220;bundleresource:&#8221; előtaggal rendelkezik. Korábban létezett egy asLocalUrl() függvény, ami az ilyen jellegű URL-t hivatott átalakítani abszolút &#8220;file:&#8221; URL-é. Azonban ez a függvény a 3.2-es verzióban @Deprecated megjegyzést kapott, tehát ez nem a megfelelő mód a megnyitásra. Szerencsére azonban az ilyen URL-ekhez implementálták az URL.openStream() metódust, ami nyit egy megfelelő adatfolyamot a számunkra. Kicsit egyszerűsítve a kód valahogy így néz ki:</p>
<p><code lang="java"><br />
//Listázzuk az extension point-hoz csatolt extension-öket:<br />
IExtensionRegistry registry = Platform.getExtensionRegistry();<br />
IExtensionPoint point = registry.getExtensionPoint("ExtensionPointID");<br />
for (IExtension extension : point.getExtensions()){<br />
        //Így kell lekérni az extension-t adó plugin csomagot:<br />
        Bundle bundle = Platform.getBundle(extension.getNamespaceIdentifier());<br />
	for (IConfigurationElement element : extension.getConfigurationElements()){<br />
                //A csomagon belüli relatív elérési út:<br />
		String path = element.getAtribute("resourceAttrib");<br />
                URL url = bundle.getResource(path);<br />
                InputStream is = url.openStream();<br />
                //...Olvasás...<br />
	}<br />
}<br />
</code></p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/04/resource-fajlok-eclipse-plugin-extension-ben/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

