<?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; Fejlesztés</title>
	<atom:link href="http://cubussapiens.hu/category/programming/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>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>Mi a hiba a kódban? #2</title>
		<link>http://cubussapiens.hu/2009/12/mi-a-hiba-a-kodban-2/</link>
		<comments>http://cubussapiens.hu/2009/12/mi-a-hiba-a-kodban-2/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 21:38:46 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programozás]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1314</guid>
		<description><![CDATA[A [intlink id="1249" type="post"]múltkori, nagy sikerű írásom[/intlink] hatására Tompika küldött nekem egy hasonlóan izgalmas problémát. [cc_java]while (true) { Process p = Runtime.getRuntime().exec(&#8220;macska&#8221;); p.waitFor(); }[/cc_java] A kód eredeti, Tompika kedvenc állatait, a macskákat felemlegetve. A kód elméletben a következőt kellene, hogy &#8230; <a href="http://cubussapiens.hu/2009/12/mi-a-hiba-a-kodban-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A [intlink id="1249" type="post"]múltkori, nagy sikerű írásom[/intlink] hatására Tompika küldött nekem egy hasonlóan izgalmas problémát.</p>
<p>[cc_java]while (true) {<br />
Process p = Runtime.getRuntime().exec(&#8220;macska&#8221;);<br />
p.waitFor();<br />
}[/cc_java]</p>
<p>A kód eredeti, Tompika kedvenc állatait, a macskákat felemlegetve. A kód elméletben a következőt kellene, hogy csinálja: az első sor a [cci_java]p[/cci_java] referenciával elérhető módon indít egy processzt; míg a második sor vár, amíg a processz fut.</p>
<p>Ha megnézzük a kapcsolódó JavaDoc kommenteket, ez így működőképes is lehet. Ezzel szemben futásidőben problémák léptek fel, amiket feltehetőleg a következő kódrészletre való kicserélés javított:</p>
<p>[cc_java]while (true)<br />
{<br />
Process p = Runtime.getRuntime().exec(&#8220;macska&#8221;);<br />
p.waitFor();<br />
p.getErrorStream().close();<br />
p.getOutputStream().close();<br />
p.getInputStream().close();<br />
p.destroy();<br />
}<br />
[/cc_java]</p>
<p>A kódrészlet utolsó sora vicces. Idézném a <a href="http://java.sun.com/javase/6/docs/api/java/lang/Process.html#destroy%28%29">Javadoc kommentet</a>:</p>
<blockquote><p>[cci_java]public abstract void destroy()[/cci_java]</p>
<p>Kills the subprocess. The subprocess represented by this   [cci_java]Process[/cci_java] object is forcibly terminated.</p></blockquote>
<p>Amit én úgy értelmeznék, hogy a függvényt meghívva explicite lezárom a Processt. Viszont állítólag nem így történik. Valaki tudja a magyarázatot? Kíváncsi lennék rá.</p>
<p>PS.: ha valaki hozzájut hasonló gyöngyszemekhez, és eljuttatja hozzám, szívesen közzéteszem.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/12/mi-a-hiba-a-kodban-2/feed/</wfw:commentRss>
		<slash:comments>0</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>Fejlesztés, metodikák, ortogonális kódok</title>
		<link>http://cubussapiens.hu/2009/10/fejlesztes-metodikak-ortogonalis-kodok/</link>
		<comments>http://cubussapiens.hu/2009/10/fejlesztes-metodikak-ortogonalis-kodok/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 21:10:11 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[programozás]]></category>
		<category><![CDATA[tervezés]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1272</guid>
		<description><![CDATA[D-nee tett fel hétvégén egy érdekes linket a deliciousre: Jeremy D. Miller írt egy egész részletes szösszenetet Orthogonal Code címmel, és egész jól összefoglal bizonyos programtervezési elveket. Mondjuk ha csak annyi lenne a véleményem róla, hogy érdemes elolvasni, akkor egyszerűen &#8230; <a href="http://cubussapiens.hu/2009/10/fejlesztes-metodikak-ortogonalis-kodok/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>D-nee tett fel hétvégén egy érdekes linket a deliciousre: Jeremy D. Miller írt egy egész részletes szösszenetet <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/01/08/Orthogonal-Code.aspx">Orthogonal Code</a> címmel, és egész jól összefoglal bizonyos programtervezési elveket.</p>
<p>Mondjuk ha csak annyi lenne a véleményem róla, hogy érdemes elolvasni, akkor egyszerűen fognám magam, és én is feltenném a deliciousre, hogy az a kevés ember, aki véletlenül odatéved, megtalálja. De a helyzet az, hogy egyfelől érdekesnek tartom, másrészt nem értek vele (mindenben) egyet.</p>
<p>Ami feltétlenül tetszett az írásban, és ami miatt minden, programozásban érintett embernek ajánlom elolvasásra, hogy konkrét példán bemutatja a különböző programfejlesztési elveket. Ráadásul mosóporreklám stílusban, azaz ilyen volt és ilyen lett összehasonlítással.</p>
<p>Előrebocsátanám még (egyszer), mielőtt elkezdek belemenni egyes részletkérdésekbe, hogy a cikkel alapvetően egyetértek, de néhány dolog érdemes továbbgondolásra. Az egyik, hogy ezeket a tervezési elveket szabálynak állítja be, szerintem viszont legfeljebb ökölszabálynak lehet tekinteni. Azaz alapvetően érdemes követni őket, kivéve, ha nem jók az adott helyzetben. <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Miért lehetnek rosszak ezek az elvek? Például ha minden egyes funkciót külön osztályba teszünk, az osztályok, interfészek száma könnyen kezelhetetlen méretűre duzzadhat. Szóval amit megnyerünk a réven (áttekinthetőbbek és szerkeszthetőbbek a lokális kódok), elveszíthetjük a vámon (struktrurálisan nehezen áttekinthető a rendszer, nagy a betanulási idő).</p>
<p>Emellett a sok indirekció és absztrakciós szint teljesítményproblémákhoz vezethet. Például egy hívásnak nem elhanyagolható költségei vannak (stackelés, stb.). Vagy éppen hivatkozhatnék arra a nem túl régi tapasztalatomra, hogy egy algoritmusnál a legtöbb időt az vitte el, hogy a <strong>memóriából</strong> ismételten lekért adatokat. Ezt profilerrel derítettem ki, és lokális változóba áttöltve az adatokat és újra felhasználva kb. felére csökkentettem a futási időt. Vicces dolog az a cache miss (legalábbis szerintem ez történhetett).</p>
<p>És a legkomolyabb, kimutatható probléma (szerintem): a &#8220;tell, don&#8217;t ask&#8221; elvet jelenleg piszkosul nem szokás adatmodellre alkalmazni. Legalábbis Java környékén az aktuális state of the art marhára nem teszi &#8211; kivéve, ha rosszul látom, hogy mi a legfejlettebb. Aminek akár még oka is lehet.</p>
<p>A &#8220;tell, don&#8217;t ask&#8221; elv mit is jelent? Mondd meg az objektumnak, hogy mit csináljon (állapotfüggően), ne lekérd az állapotát, és ez alapján te döntsél helyette.</p>
<p>Érdekes módon viszont az adatmodellek manapság egyre inkább mennek a nagyon buta, csak getter/setterekből álló modellek felé. Miért is? Én úgy tippelem azért, mert</p>
<ol>
<li>Ez a rész jól generálható. Az EMF alaptechnológia tipikusan arról szól, hogy valahogy összeklikkelgetsz egy EMF modellt, beállítod a genmodellt, és kapsz egy gyönyörűséges Java osztályhalmazt. Ami persze nem tud semmit azon túl, hogy getter, setter és factory hívásokkal felépíthető és bejárható.</li>
<li>J2EE technológiánál az entitásokat menti le a rendszer egy az egyben adatbázisba, amely entitásoknak tipikusan szintén getter/setter metódusai vannak. Esetleg még számított mezők is beköszönnek.</li>
</ol>
<p>Mindkét esetben az a szokás, hogy a modellbefolyásoló logikát külön Manager jellegű osztályokba tesszük, akik a tényleges igényeknek megfelelően építik (rombolják <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) a modellt.</p>
<p>És végül a legfontosabb hozzáfűznivalóm az íráshoz: igen, hosszú távon megéri ezeket az elveket követve tervezni, kivéve, ha amiatt, mert nem készülünk el határidőre, rövid/közepes távon befejeződik a projekt. És ennek a kezelése bizony emberi kérdés. Emiatt zárszóként <a href="http://www.codinghorror.com/blog/archives/001288.html">Jeff Atwoodot idézném</a>:</p>
<blockquote><p>The guys and gals who show up every day <a href="http://www.codinghorror.com/blog/archives/000856.html">eager to hone their craft</a>, who are passionate about building stuff that <em>matters</em> to them, and perhaps in some small way, to the rest of the world &#8212; those are the people and projects that will ultimately succeed.</p></blockquote>
<p>PS.: Mostanában <a href="http://www.adamnemeth.hu/2009/10/02/architect-dolgok-logika-es-struktura/">Aadaam</a> is foglalkozik azzal, hogyan <a href="http://www.adamnemeth.hu/2009/10/19/architect-dolgok-framework-napok-alatt/">érdemes nagyobb rendszereket összerakni</a>. Ráadásul azt mutatja meg, hogyan lehet PHP-ban nem gányolni. Szép teljesítmény az is.</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/10/fejlesztes-metodikak-ortogonalis-kodok/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Eclipse Trivia: ListDialog</title>
		<link>http://cubussapiens.hu/2009/10/eclipse-trivia-listdialog/</link>
		<comments>http://cubussapiens.hu/2009/10/eclipse-trivia-listdialog/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 21:19:47 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[programozás]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1263</guid>
		<description><![CDATA[Némi bugfixing kapcsán eljutottam egy Eclipse plug-in belsejében a JFace ListDialog osztályhoz. A dolog lényege, hogy egy definiált listát megjelenít, és lehetővé teszi a felhasználó számára az elemek kiválasztását egy dialógusban. Az ötlet jó, hiszen viszonylag gyakran szükséges feladat. Ugyanakkor &#8230; <a href="http://cubussapiens.hu/2009/10/eclipse-trivia-listdialog/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Némi bugfixing kapcsán eljutottam egy Eclipse plug-in belsejében a <a href="http://help.eclipse.org/galileo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/dialogs/TrayDialog.html#getLayout%28%29">JFace ListDialog</a> osztályhoz.</p>
<p>A dolog lényege, hogy egy definiált listát megjelenít, és lehetővé teszi a felhasználó számára az elemek kiválasztását egy dialógusban. Az ötlet jó, hiszen viszonylag gyakran szükséges feladat.</p>
<p>Ugyanakkor egy érdekes adalék a működéséhez: működik az a hasznos (és elvárt) funkció, hogy a lista elemei dupla kattintással történő kiválasztása működik. Feltéve, hogy a Mégsem gomb is engedélyezve van&#8230; <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  No comment. (Ld. még <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=292576">Bug 292576</a>).</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/10/eclipse-trivia-listdialog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mi a hiba a kódban?</title>
		<link>http://cubussapiens.hu/2009/10/mi-a-hiba-a-kodban/</link>
		<comments>http://cubussapiens.hu/2009/10/mi-a-hiba-a-kodban/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 20:14:16 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1249</guid>
		<description><![CDATA[Volt ma egy szép debug köröm. Nagyon nem értettem, miért nem működik egy kód &#8211; ami ráaásul régebben (július végén) szépen ment, és azóta nem nyúltam hozzá, és elvileg a kapcsolódó libekben sem volt lényegi változás azóta. Úgy gondolom, bemutatom &#8230; <a href="http://cubussapiens.hu/2009/10/mi-a-hiba-a-kodban/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Volt ma egy szép debug köröm. Nagyon nem értettem, miért nem működik egy kód &#8211; ami ráaásul régebben (július végén) szépen ment, és azóta nem nyúltam hozzá, és elvileg a kapcsolódó libekben sem volt lényegi változás azóta.</p>
<p>Úgy gondolom, bemutatom a kódot, és felteszem a kérdést, látja-e más is a hibát benne.</p>
<p>[ccw_java]private ICoreNotificationObject notificationObject;</p>
<p>public void actionPerformed(ICoreNotificationObject notification) {<br />
  this.notificationObject = notification;<br />
  Display.getDefault().aSyncExec(new Runnable() {</p>
<p>  public void run() {<br />
    String action = notificationObject.getActionType();<br />
    if (isOneOf(action, new String[] {<br />
          ICoreNotificationObject.TA_TRANSACTION_END,<br />
          ICoreNotificationObject.TA_UNDO_END,<br />
          ICoreNotificationObject.TA_SUBTRANSACTION_END})) {<br />
       updateGraph();<br />
       transactions.pop();<br />
    } else if (isOneOf(action, new String[] {&#8230;}){<br />
       //&#8230;<br />
    }<br />
  });[/ccw_java]</p>
<p>Még némi információ a kód működéséről: a kód egy eseményfigyelő osztály belsejében van, és a Runnable adatváltozásokat próbál követni, amely tranzakciókba van szervezve, ill. a tranzakciók során visszavonás események is érkezhetnek.</p>
<p>Na, kinek van tippje, mi lehet a hiba? Ha nincs tipp véges időn belül (előre nem specifikálnám), akkor majd megosztom a helyes megfejtést. Annyit mondok előre, hogy fejet falbaverős hiba <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<p><strong>Update</strong>: először is helyesbítettem a kódot, mert sikeresen a javított változatot töltöttem fel.</p>
<p>A problémát az okozta, hogy az asyncExec() hívás indított egy új jobot, amit valamikor majd végrehajt. Csak közben visszaadja a vezérlést, és ezzel lehetővé teszi a rendszer számára, hogy felülírja a run() metóduson belül is használt notificationObject változót.</p>
<p>Az asyncExec() hívás syncExec()-re cserélése megoldotta a problémát, ugyanis az megvárja, hogy visszatérjen a meghívott thread.</p>
<p>Ez a hiba kifejezetten mocskos dolog, mert eredetileg működött, míg a környezet refactoringja előhozta a bugot&#8230;</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/10/mi-a-hiba-a-kodban/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LPG generálás OSX-en Eclipse-ből</title>
		<link>http://cubussapiens.hu/2009/10/lpg-generalas-osx-en-eclipse-bol/</link>
		<comments>http://cubussapiens.hu/2009/10/lpg-generalas-osx-en-eclipse-bol/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 09:41:55 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[lpgparser]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1240</guid>
		<description><![CDATA[Megnyertem egy parser frissítésének és karbantartásának feladatát. Igen, ez remekül hangzik. Ahogy az is. A parser az LPG parser generátorral készült, méghozzá annak az 1.0-s változatával. Most már van 2-es is, ami természetesen nem kompatibilis a régivel (legalábbis generált kód &#8230; <a href="http://cubussapiens.hu/2009/10/lpg-generalas-osx-en-eclipse-bol/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Megnyertem egy parser frissítésének és karbantartásának feladatát. Igen, ez remekül hangzik. Ahogy az is.</p>
<p>A parser az <a href="http://sourceforge.net/projects/lpg/">LPG parser generátorral</a> készült, méghozzá annak az 1.0-s változatával. Most már van 2-es is, ami természetesen nem kompatibilis a régivel (legalábbis generált kód szintjén semmiképp sem &#8211; többek között más java package-et használ). Miután nem sokkal release előtt kaptam meg, frissíteni most biztos nem lehet (később meg valószínűleg úgyis kellene).</p>
<p>Na, tehát ott tartottam, hogy 1-es verzió. Minden nagyon szép, minden nagyon jó, mindennel meg vagyok elégedve, úgyhogy módosítottam a grammar fájlt. Na, ideje újragenerálni a kódot. És itt jön a feketeleves: az LPG parser generátor régi verziójához csak egy Windows-os exe fájl van, azzal lehet futtatni. Természetesen forráskód is van, de még a makefile is a Visual C++ fordítóra van kihegyezve. Szóval lefordítani macerás.</p>
<p>Nem is kezdem el, mert feltehetőleg csak ideiglenes megoldás kell (max. 1-2 év <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ). Ugyanakkor cél, hogy a megoldás integrálódjon az Eclipse-be, azaz néhány klikkeléssel sikerüljön a programot elindítani. A lehetőségeim: wine vagy VMware.</p>
<p>Az utóbbi nem tetszene, mert relatíve sok erőforrást eszik, ráadásul egyszerűen csak a VMware alatt futó Eclipse példánnyal lehetne összekapcsolni, amelynek a gyorsbillentyűi teljesen mások, mint a natív Mac-es példányé.</p>
<p>Szóval lehet reménykedni, hogy a wine-osok jó munkát végeztek. És szerencsém van, mert az lpg.exe gond nélkül futtatható vele.</p>
<p>Most már csak az Eclipse integráció van hátra. Ennek remek eszköze az External Tools eszköz (megjegyzés: natív Windows-on is csak így lehet futtatni az lpg.exe-t Eclipse-ből &#8211; nincs jobb támogatás) a Run menüben.</p>
<p>Létrehozhatunk egy saját eszközt, amelynek felparaméterezéséhez használhatjuk az Eclipse különböző változóit. Számunkra ehhez kettőre van szükség:</p>
<ul>
<li>[cci]${resource_loc}[/cci]: az aktuálisan kijelölt erőforrás elérhetősége a fájlrendszerben (nem workspace-relatív módon!)</li>
<li>[cci]${container_loc}[/cci]: az aktuális erőforrást tartalmazó mappa elérhetősége (szintén nem workspace-relatív módon)</li>
</ul>
<p>Az LPG parser generátor számára fontos a munkakönyvtár beállítása, ide fogja generálni a fájlokat. A többi adat kitöltése magától értetődő, ezért csak egy képernyőfotót illesztek be róla.</p>
<div id="attachment_1241" class="wp-caption alignnone" style="width: 310px"><a href="http://cubussapiens.hu/wp-content/uploads/2009/10/lpg_extprogram.png" rel="lightbox[1240]" title="LPG futtatása Wine segítségével az aktuális fájlra"><img class="size-medium wp-image-1241" title="LPG futtatása Wine segítségével az aktuális fájlra" src="http://cubussapiens.hu/wp-content/uploads/2009/10/lpg_extprogram-300x192.png" alt="LPG futtatása Wine segítségével az aktuális fájlra" width="300" height="192" /></a><p class="wp-caption-text">LPG futtatása Wine segítségével az aktuális fájlra</p></div>
<p>Az LPG futásához három dologra van szükség: a nyelvtan fájlra vagy fájlokra, az include fájlokra és a template fájlokra. Ezek lehetnek mind a munkakönyvtárban (ez a helyzet, ha saját sablonokat használunk), vagy pedig környezeti változók által kijelölt mappában, esetleg paraméterként is át lehet adni.</p>
<p>Szerintem a legtisztább a környezeti változók használata, ezért az Environment fülön felvettem az [cci]LPG_INCLUDE[/cci] és az [cci]LPG_TEMPLATE[/cci] környezeti változókat, azokat a megfelelő mappákra irányítva.</p>
<p>Ezután a futtatás gombra kattintva jött a varázslat: a wine az OSX-es útvonalakat lefordítja a Windows-os program számára érthető formátumra (megfigyelhetőek az Y:\ kezdetű útvonalak a szöveges kimeneten &#8211; amik természetesen megjelennek az Eclipse Console view-ban), és az ugyanilyen formátumban készülő fájlok megjelennek az OSX-es mappában. Sőt, a környezeti változókra is igaz ez. Nagyon cool.</p>
<p>A technológiával két kisebb gondom van: nem tudom az LPG-t így a .g fájl jobb gombos menüjéből futtatni (nincs ott külső eszköz futtatásához lehetőség), és nem működik a megoldás, ha nem a Navigator view aktív a Run external tool használatakor (természetesen akkor sem, ha nem a .g fájl van kijelölve, de ez természetes <img src='http://cubussapiens.hu/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Van ezekre valakinek valami ötlete?</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/10/lpg-generalas-osx-en-eclipse-bol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibakeresés: LaTeX ábrafelirat probléma</title>
		<link>http://cubussapiens.hu/2009/09/hibakereses-latex-abrafelirat-problema/</link>
		<comments>http://cubussapiens.hu/2009/09/hibakereses-latex-abrafelirat-problema/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 18:38:02 +0000</pubDate>
		<dc:creator>Zoltán Ujhelyi</dc:creator>
				<category><![CDATA[Fejlesztés]]></category>
		<category><![CDATA[hogyancsináld]]></category>
		<category><![CDATA[kép]]></category>
		<category><![CDATA[latex]]></category>

		<guid isPermaLink="false">http://cubussapiens.hu/?p=1236</guid>
		<description><![CDATA[Nemrég volt szerencsém egy idegesítő LaTeX feature-höz (ugye nem bug, hanem feature). Miután visszafejteni a hiba okát elég macerás volt, ezért gondoltam, megosztom itt is. Megkérdezték tőlem, van-e ötletem, mitől lehet az, hogy egy ábra hivatkozásánál a számot miért jeleníti &#8230; <a href="http://cubussapiens.hu/2009/09/hibakereses-latex-abrafelirat-problema/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nemrég volt szerencsém egy idegesítő LaTeX feature-höz (ugye nem bug, hanem feature). Miután visszafejteni a hiba okát elég macerás volt, ezért gondoltam, megosztom itt is.</p>
<p>Megkérdezték tőlem, van-e ötletem, mitől lehet az, hogy egy ábra hivatkozásánál a számot miért jeleníti meg teljesen más stílusban, mint a többi ábrahivatkozást, ill. mint az ábra feliratát. A probléma úgy jelentkezett, hogy <em>Figure 9.</em> számú ábra (ez az elvárt formátum), míg a hivatkozása <em>Figure 4.4</em> formátumban jelent meg.</p>
<p>A hivatkozásokat a LaTeX vissza tudta fejteni, semmiféle hibaüzenet nem jelent meg, csak rosszul jelent meg a sorszám. Nagyon látványos hiba sem volt a kódban, többszöri átolvasás után (lényegében hasonlóan nézett ki, mint a többi ábrabeillesztés).</p>
<p>Megpróbálgatva kihagyni elemeket, áthelyezni a kritikus ábrát, illetve hivatkozást sikerült rájönni, hogy a LaTeX valami miatt a fejezet/szakasz-számot jeleníti meg az ábra sorszáma helyett.</p>
<p>Innen már egy gyors Google megadta a megoldást: <a href="http://www.leancrew.com/all-this/2008/09/latex-figure-captions/">http://www.leancrew.com/all-this/2008/09/latex-figure-captions/</a> , ill. az oldalon keresztül a következő lap: <a href="http://en.wikibooks.org/wiki/LaTeX/Labels_and_Cross-referencing#Fixing_wrong_labels">http://en.wikibooks.org/wiki/LaTeX/Labels_and_Cross-referencing#Fixing_wrong_labels</a></p>
<p>A megoldás lényege a következő: semmilyen körülmények között ne legyen a [cci_latex]\label[/cci_latex] címkeparancs a [cci_latex]\caption[/cci_latex] feliratparancs elé. A feliratparancs belsejébe vagy a feliratparancs utánra nyugodtan kerülhet.</p>
<p>A végére beszúrok egy javasolt mintát kép beillesztésére, ami ezt a hibát elkerüli (a forrás a <a href="http://texlipse.sourceforge.net">TeXlipse</a> plug-in sablon gyűjteménye:</p>
<p>[cc_latex]\begin{figure}[htp]<br />
\begin{center}<br />
\includegraphics[width=${figureWidth}]{${filename}}<br />
\caption[${labelInTOC}]{${figureCaption}}<br />
\label{${figureLabel}}<br />
\end{center}<br />
\end{figure}[/cc_latex]</p>
<p>A TeXlipse editor ezt a mintát automatikusan beilleszti, ezért nekem nehéz ezt a hibát elkövetnem, de másnak még hasznos lehet. Remélem, van, akinek a megoldás megosztásával</p>]]></content:encoded>
			<wfw:commentRss>http://cubussapiens.hu/2009/09/hibakereses-latex-abrafelirat-problema/feed/</wfw:commentRss>
		<slash:comments>0</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>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>
	</channel>
</rss>

