GWT – kliens szerver határán

Lassan 1 éve foglalkozok GWT-vel. Gondoltam eljött az idő, hogy röviden számotvessek magammal, milyen is volt ez az 1 év…
A maga a koncepció, ahogy a megvalósították, hogy java-ban hozhatunk létre böngészőfüggetlen javascriptet, a szabad forráskódú fejlesztés, hogy a rendszer minden részének működését forráskód szinten látjuk, hogy módosíthatók (vagy utánozhatóak) az alap implementációk, és még sorolhatnám. Ez kétségtelenül megérdemel egy + jelet 🙂

Persze az ismerkedés nem volt egyszerű, néhány fejlesztési alapvetést, és nézetet adaptálni kellett, tehát aki gwt-re adja a fejét (szerintem ez ajax-ra, sőt minden asszinkron működésű programra vonatkozik) kénytelen picit „másképp gondolkodni”.
A tapasztalataim részletekbe menő ismertetését most sajnos nem írom le, de néhány gondolatot azért igen.

Nem, nem bántam meg, hogy gwt-be fejlesztek, és ha újra kellene választanom, én ismét ezt választanám. (bár ilyen téren mindegy miben kell fejleszteni, ha valaki elég eltökélt, bármivel tud nagyszerű dolgokat készíteni, max sok idő, és áldozat árán 😉 )

A GWT alkalmazásokban gondolkozik, és ezért „nagy alkalmazás” fejlesztése során felmerülnek problémák (pl. a memória használat, kódok mérete). Ha viszont egy picit tovább gondoljuk a dolgot, minden nagy alkalmazás nem más mint kis alkalmazások összessége, amik viszont játszi könnyedséggel integrálhatóak egy nagy alkalmazásba (ez a megközelítés egyébként is rengeteg előnnyel jár, mint pl. az egymástól független verziókezelés, stb).

Kliens és szerver oldali kódok az RPC hívások miatti duplikálása (ami sajnos mostanában elég bevett szokás), egy hibás koncepció. Rengeteg fejlesztő duplikálja a DAO kódokat (pl. egy tábla leíró osztály), hogy a gwt számára a böngészőbe át tudja adni a benne lévő adatot. Erre nincs szükség. Amikor a gwt fordít, akkor a gwt fordító fordít, amiből javascript lesz. Amikor a java fordít abból pedig szerver oldali java class fájlok. A két folyamat eltéréséből adódik, hogy megtehető az, hogy a gwt fordítás alatt az ember picit más class-okat használ fel, mint a java fordítás alatt.
Egy életből vett példa, hogy érthető legyen:

Tegyük fel, hibernate-t használunk, és csinálunk egy partner osztályt:

@Entity
@Table(name = "Partner")
public class Partner {

@Id
@GeneratedValue
@Column(name = "PARTNER_ID")
public long getId() {
return this.id;
}



Ha ezt gwt oldalon el szeretnénk érni két általános dolgot kell tennünk:
– levinni a kódot a kliens oldalra
– implementálni az IsSerializable típust

A második dolog viszonylag egyszerű, ellenben amikor a kliens oldalra mozgatjuk az osztályt, akkor a gwt fordító kedvesen figyelmeztet, hogy kliens oldalon nem lehet szerver oldali komponenseket használni (mint a hibernate notáció).

Persze azért mondja ezt, mert nem tudja, hogy mi ezeket a kódokat kliens oldalon nem is akarjuk használni. A megoldás kézenfekvő, és egyszerű. A hibernate forrásából ki kell szedni azokat a fájlokat amiket kliens oldalon is használunk. A forrásban használt függvényeket meghagyuk, de az implementációs részt töröljük. Fordítunk belőlle egy olyan jar-t amiben benne van a forrás is, és a fordított funkció nélküli class fájlok, megmondjuk a gwt fordítónak, hogy tessék ezt használni.

A kód lefordul, a javascript a hibernate notációval ellátott, de funkcióval nem rendelkező osztályokat használja, ellenben amikor ez az adat felkerül szerver oldalra, ott már a hibernate funkcionalitás is elérhetővé vállik, nincs szükség az osztályok duplikálására.

Ugyanez az elv használható a validációk során is, a jól megírt validációt végző keretrendszer minden esetben használható mind kliens mind szerver oldalon (optimális esetben notációkkal, pl. a hibernate által használt dao osztályban… ).

Részemről a geek hajlamok ezzel letudva a hétvégére 🙂

Mix

Nem sok időm van mostanság, és azt hiszem ezt a post-ok száma is hűen tükrözi. Ma viszont sikeresen szakítottam egy fél órácskát a zenélésre, és ennek eredményeképpen született egy kis mix.

Mix letöltése

Compromising demo

Ismét volt egy kis időm, így sikerült tovább csiszolgatni a hamarosan szinpadra álló leendő zenekarunk egyik irányadó dalát…
Reményeim szerint hamarosan sok sok ehhez hasonló zene lesz majd elérhető itt…
Addigis érjétek be ezzel:
compromising.ogg.

Zene

Végre volt egy kis időm zenélni, aminek eredménye egy kis sample mire is lehet számítani majd, ha majd lesz időm. Addig is a sample letölthető itt.

Új effektek

El leszek tűnve 1 hétre legalább, de ha minden jól megy amire visszaérek az alábbi dolgok már itthon fognak várni:

2x Technics MKII
Mackie d.4 Pro
Electro-Harmonix Small Stone Phase Shifter
Lehle Dual Looper

És azt hiszem lassan elkezdődik a nyár is 🙂
Ha visszaértem megpróbálok majd felvarázsolni pár hangmintát az új szerzeményeimmel 🙂

Windows rendszer klónozása

Ha van két hasonló gépünk, és szeretnénk a windowst átrakni, kicsit bonyolultabb a dolgunk mintsem hogy lemásoljuk a /etc könyvtár tartalmát.

Röviden összefoglalva:

Ubuntu install cd-ről elindítani az Ubuntut.

Nyitni egy konzolt

sudo su -
hogy root jogaink legyenek, mert az nekünk jó, és egyébként is, igazi linuxos e nélkül semmit nem csinál, mi meg olyan igaziak vagyunk, hogy csak na 🙂

fdisk -l
(ha nem tudjuk milyen lemezek vannak a gépben ez akkor jöhet jól… ha nem tudjuk ez mi, akkor még itt érdemes abbahagyni a dolgot 🙂

sfdisk -d /dev/hda > /media/tmp/hdapt.out
Tegyük fel, hogy a hda1-en levő windowst szeretnénk másolni. Lementjük a partíciós tábláját a teljes lemeznek. Törölhetjük belőlle a többit, nekünk csak az 1. bejegyzés a fontos.

dd if=/dev/hda1 conv=sync,noerror bs=1024k > /media/tmp/hda1.img
Mentsük le a teljes tartalmát az első partíciónak (ez még jól jöhet később 🙂

Ezekután mint aki jól végezte dolgát tegyük át az Ubuntu cd-t a másik gépbe, és bootoljunk be ott róla. Tegyük meg a szokásos dolgokat, console, sudo…

sfdisk /dev/hda < /media/tmp/hdapt.out
vagy
sfdisk --force /dev/hda < /media/tmp/hdapt.out

Beállítjuk a partíciós táblát pont arra, ami a másik helyen volt.
Ha a merevlemez fizikai paraméterei eltérőek, sok sok warningot fogunk kapni, ignoráljuk, használjuk a –force paramétert, mert az erő velünk van.

dd of=/dev/hda1 conv=sync,noerror bs=1024k < /media/tmp/hda1.img
Pakoljuk vissza a tartalmat is, elvégre ezért csináljuk ezt az egésszet.

Aki örül, az esetek nagy részében rosszul teszi, mert a windows nem fog bootolni.
Aggodalomra semmi ok.
Méretezzük át a partíciót gparted-ben. Ez meg fogja javítani azokat a dolgokat ami miatt az sfdisk sírt hogy így meg úgy nem megfelelő.
Az átméretezés után nagy valószínűséggel még mindig nem fog a windows bootolni, mert a windows boot managere eléggé finnyás.
Ilyenkor lehet telepíteni grub-ot, vagy bármilyen más alternatívát.
Én a System Resource Cd-ről telepítettem a gag-ot, mert a cd kéznél volt, és a gag-nak olyan C64-es feelingje van 🙂
Ezt oly módon ktudjuk megtenni, hogy a boot: promptnál beírjuk
gag
Elindul, beállítások után ne felejtsük el felvenni a lemezt, valamint menteni a változásokat a lemezre.
Ezekután csupa öröm, és boldogság.

Ha a windows ezután sem bootol:
próbáljuk ki a windows telepítő rescure console-t (telepítés első lehetőségénél nyomjunk R-t)
fixboot
fixmbr
(gag újratelepités 🙂

Ha a windows ezután sem bootol:
Telepítő cd, windows repair

Az esetleges kockázatokról, és mellékhatásokról kérdezze meg kezelőorvosát, gyógyszerészét.

Az ötletekért köszönet qzy-nek.

angol róka (Gimp)

Ha valaki magyar local settings-el használja a windows-át, meglepő módon tapasztalhatja, hogy a gimp midnig magyarul akar kommunikálni vele… A megoldás, le kell törölni minden könyvtárat, ami nem en-el kezdődik az alábbi helyről:

C:\Program Files\GIMP-2.0\share\locale\

Effect chain

Van az a mondás, hogy embert barátjáról, gitárost setupjáról…
Hát íme az enyém.

Az effekt loop szívét, egy Lehle 3in1 kapcsoló pedál képezi, ez szolgál a váltásra a két (3) effektkör között.
Az első kör az erősítő reverb csatornájába kötött, enyhén úsztatott hang, amit egy kicsit teltebbé, kiemeltebbé tesz a TubeScreamer.
A második kör, pedig egy FuzzFactory által erősen torzított, Dunlop Wah effekten keresztül az erősítő tiszta csatornájába kötött (a nem erősített bemenetbe, mert a fuzz elég hangos tud lenni) sor, a szólóknak, vagy a kiemelt részeknek.
Mindkét kör keresztülmegy ugyanazon a DD-9-es Delay uniton, így elég egy helyen beállítani a kívánt Delay effektet.
Ami érdekesebb, hogy a második körbe opcionálisan bekapcsolható (C kapcsoló) az EMU 1616, Cubase SX Studio, és ez által a VST effektek egész sora. A külön kapcsolás több dolog miatt is hasznos. Ha valami nem jó, az EMU helyett szól a fuzz és a wah. Szintén ez történik, ha valami hardver, szoftver probléma adódna (de nem nagyon adódik szerencsére).
Az effektek paramétereit a Novation Remote Zero SL által lehet állítani, ami nagyon gyorsan a szívembe lopta magát, de terveim szerint ezt egy későbbi postban még jobban kifejtem, pontosan miért is. A midi kontrol egységhez csatlakozik a Boss volume pedálja, de itt, mint midi exp pedál (ezt is tudja ugyanis), Volume pedálnak kicsit zajos, midi exp pedálnak tökéletes (kevés robosztusabb midi exp pedált láttam eddig). Ezzel lehet az effektek azon paraméterét állítani amit játék alatt is gyakran módosítani szeretnék.

Backup és Undelete

Mostanában körülnéztem, a fenti témában fellelhető programok között. Hosszas keresgélés után, az alábbi két program tűnt a legjobbnak (feltétel volt hogy ingyenesek legyenek):

A Backup-ok készítésére az alábbi program tűnt a legjobbnak: Areca Backup

Az Undelete funkciót pedig az alábbi program csinálta a legjobban: TouchStone Software Undelete Plus

IRC pidgin alatt

Megjelent az új pidgin verzió, és régen elég sokat bosszankodtam egy problámával vele kapcsolatban, gondoltam írok róla egy picit.
Aki Pidgint használ, és IRC-et is, az beleütközhet abba a hibába, hogy bizonyos karakterek helyén „?” karakter jelenik meg (rendszerint magyar karakterek természetesen). Erre a problémára a megoldás az alábbi:
El kell menni a Pidgin Accounts menüpontban, majd rábökni a Manage funkcióra (vagy CTRL+A).
Ott válasszuk ki az IRC-hez kapcsolódó accountot, majd Modify.
Az Advanced fülön található egy olyan szövegdoboz, hogy Encodings: Oda kell felvenni két értéket:
UTF-8,ISO-8859-15

És minden jó lesz 🙂