Kiss Balázs programozó matematikus, projektmenedzser.
10+ év fejlesztői és oktatói tapasztalattal rendelkezik. Beágyazott rendszerek és okos otthon megoldások iránt érdeklődik. Szabadúszó távmunkában nemzetközi járműipari fejlesztésekben vesz részt, főként C++ és Java backend technológiákkal foglalkozik. Gyakorlott a szoftvertesztelés területén. Rendszeresen tart céges tanfolyamokat, angol nyelven is. Szívesen vállal egyéni tutorálást/mentorálást. Szakdolgozó hallgatókat is konzultál. Néhány éve mobil fejlesztéssel is foglalkozik, Android és Kotlin platformokon. Minden nyáron és télen 20-20 napos digitális detoxot tart, ami nyáron külföldi kerékpáros kirándulást, télen pedig síelést jelent. Nyékyné fan: best ever & forever. 2020 óta blogol velünk.
Szívgörbét ábrázolunk Java programmal. A Valentin-nap inspirálta ezt a feladatot. Számos matematikai görbe ismert, amelyek szívformához (kardioid) hasonlítanak. Szükséges egy megfelelő paraméteres görbe. A függvény szív formájú ábrája/grafikonja és egyenletrendszere alapján is nagy a választék.
Ábrázoljuk ezt a paraméteres szívgörbét Java swing GUI felületen!
Négy megoldást mutatok. Mindegyik azonos szívgörbét rajzol a fenti egyenletrendszer alapján. Mindegyik metódus átveszi az
N paramétert, amely az összetartozó
x és
y koordinátapárok számát jelenti. Az
N db pont meghatározása/kiszámolása szükséges a szívgörbe ábrázolásához. A szívgörbe ábrázolása önálló ablakban – grafikus felhasználói felületen – jelenik meg. A feladat matematikai jellegéből adódik, hogy tipikus a
t nevű ciklusváltozó használata. A metódusokat a vezérlés az
512 paraméterrel hívja meg.
A
heartCurveDraw1() metódus a kiszámolt
x és
y koordinátákat két párhuzamos,
double típusú tömb adatszerkezetben tárolja. A két tömbbe összesen
2*N db
double típusú szám kerül. Azonos index jelöli az összetartozó koordinátapárokat. Az egymást követő két ciklus közül az első előállítja az adatszerkezetet és a második megjeleníti a pontokat.
2. megoldás
1
2
3
4
5
6
7
8
9
10
staticvoidheartCurveDraw2(finalintN){
Point2D[]point=newPoint2D[N];
for(intt=0;t<N;t++)
point[t]=newPoint2D.Double(
Math.sqrt(2)*Math.pow(Math.sin(t),3),
-Math.pow(Math.cos(t),3)-Math.pow(Math.cos(t),2)+
2*Math.cos(t));
for(inti=0;i<N;i++)
StdDraw.point(point[i].getX(),point[i].getY());
}
A
heartCurveDraw2() metódus a párhuzamos tömbök helyett adatszerkezetként egyetlen tömböt használ. A
java.awt.geom csomag
Point2D osztályú objektumai kerülnek a tömbbe. Mivel a
Point2D absztrakt osztály, így a
Double() osztálymetódusával (factory method) példányosítható úgy, hogy a szükséges koordinátapárokat megfelelően tudja tárolni. A tömbbe
N db objektum kerül.
3. megoldás
1
2
3
4
5
6
7
8
9
staticvoidheartCurveDraw3(finalintN){
for(intt=0;t<N;t++){
Point2Dp=newPoint2D.Double(
Math.sqrt(2)*Math.pow(Math.sin(t),3),
-Math.pow(Math.cos(t),3)-Math.pow(Math.cos(t),2)+
2*Math.cos(t));
StdDraw.point(p.getX(),p.getY());
}
}
A
heartCurveDraw3() metódus nem használ tömb adatszerkezetet. Tehát nem emlékszik az összes pont koordinátájára. Ehelyett a ciklus röptében, egyesével létrehozza a pontobjektumokat és azonnal ki is rajzolja azokat (átmeneti az emlékezet).
4. megoldás
1
2
3
4
5
6
7
8
staticvoidheartCurveDraw4(finalintN){
IntStream.range(0,N).
mapToObj(t->newPoint2D.Double(
Math.sqrt(2)*Math.pow(Math.sin(t),3),
-Math.pow(Math.cos(t),3)-Math.pow(Math.cos(t),2)+
2*Math.cos(t))).
forEach(p->StdDraw.point(p.getX(),p.getY()));
}
A
heartCurveDraw4() metódus Stream API-t és lambda kifejezéseket használ. Az első
N természetes számból készül egy sorozat, amihez röptében hozzákötődik a
t-edik
Point2D típusú objektum. Ezzel létrejön egy folyam adatszerkezet. Tehát van egy pillanat, amíg a program emlékszik az összes folyambeli pontobjektumra. Végül a folyam feldolgozása, bejárása során egyesével megszólítva a folyam objektumait, a pontok kirajzolódnak a vászonra.
A vezérlés
1
2
3
4
5
6
7
8
9
10
publicstaticvoidmain(String[]args){
StdDraw.setPenRadius(0.01);
StdDraw.setPenColor(Color.RED);
StdDraw.setXscale(-Math.PI,Math.PI);
StdDraw.setYscale(-5.0/4*Math.PI,3.0/4*Math.PI);
//heartCurveDraw1(512);
//heartCurveDraw2(512);
//heartCurveDraw3(512);
heartCurveDraw4(512);
}
Az eredmény
A szívgörbe önálló – swing, grafikus felhasználói felület, GUI – ablakban így jelenik meg:
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
A feladat – a matematikai háttértől eltekintve – a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 21-24. óra: Objektumorientált programozás 2. rész, valamint a 29-36. Grafikus felhasználói felület alkalmaihoz kötődik.
Saját doktorandusz csoporttársaimmal én is többször beszélgettem már arról – ahogyan Sándor is tette 2018-ban –, hogyan tudnák/tudják használni a programozás eszköztárát, módszereit, lehetőségeit saját kutatási munkájukban, beépítve a kutatási folyamat egyes lépéseibe, illetve disszertációjuk elkészítésébe.
A 7 fős csoportban mindenkinek más az alapvégzettsége, így szoftverfejlesztéshez, programozáshoz közös szókincs és terminológia haladó szinten természetesen nincs, viszont közös bennünk, hogy mindannyian alkotunk különféle modelleket és elemzünk adatokat. A csoport teljesen inhomogén, több szempontból is: ki melyik évfolyamot végzi, hol tart a kutatómunkájában, vannak-e ipari kapcsolatai, nappali vagy levelező képzésben végzi tanulmányait és persze ki mikor ér rá.
Különféle modelleket alkotunk
a mérnökök, fizikusok, geográfusok, biológusok többféle kísérletet végeznek el, szimulációkat terveznek és futtatnak, mérőeszközöket és műszereket használnak,
az informatikusok különböző matematikai eszközöket alkalmazva objektumorientált – vagy másféle – modellezést végeznek, szoftvereket terveznek, javítanak, újraírnak.
Adatokat is elemzünk, ki-ki előképzettségének megfelelően
Az öt évvel ezelőtti tematikát újragondoltuk. Kérdőívben felmértük a csoporttársak koncepcionális és konkrét igényeit. Más doktori iskolák hallgatói közül is toboroztunk. Ehhez kötődően köszönjük a DOSZ segítségét. Ezek alapján összeállítottunk egy olyan 3 részből álló tematikát, ami mindannyiunk számára hasznos. A 72 óra három 24 órás modulból áll: Java programozás, MATLAB programrendszer, mesterséges intelligencia.
Java programozás modul
1-6. óra: Objektumorientált modellezés, MVC rétegek, algoritmus- és eseményvezérelt programozás
7-12. óra: Fájlkezelés és szövegfeldolgozás (XLS, CSV, XML, JSON formátumú adatok írása, olvasása, feldolgozása), helyi és távoli adatforrásból
13-18. óra: Adatbázis-kezelés JDBC alapon (SQL parancsok, CRUD műveletek, hierarchikus lekérdezések), helyi és távoli adatforrásból, natív módon és készen kapott API-kkal
19-24. óra: Komplex adatfeldolgozási feladatok megoldása programozási tételek használatával, egyszerű statisztikai funkciók implementálásával
MATLAB programrendszer modul
1-6. óra: Bevezetés az MATLAB nyelvbe (R2012 vs. R2022), utasításkészlet, vektorok, mátrixok, szkriptek, függvények, grafika
13-18. óra: Adatok importálása helyi és távoli adatforrásból is, fájlkezelés: szövegfájlok, Excel-fájlok, import, feldolgozás, export, statisztikai alapok
1-6. óra: Klasszikus és újabb megközelítések, alap AI funkcionalitás, megerősítéses és gépi tanulás lehetőségei és korlátai, OpenAI GPT nyelvi modell
7-12. óra: Általános csevegés lehetőségei, korlátai, hasznos tanácsok; csevegés fájlok (szöveg, multimédia) tartalmáról; generatív AI funkciói; kép, ábra, grafikon, térkép, hang, animáció, videó generálása és ezek tömeges feldolgozása; programozási tételek alkalmazása multimédia analitikával együtt
13-18. óra: Statisztikai adatok elemzése AI eszközökkel, automatikus tételbizonyítás AI eszközökkel, gráfelméleti kérdések kontra AI, hatékonysághoz kötődő kérdések AI eszközök esetén
19-24. óra: Objektum- és aspektusorientált tervezés AI eszközökkel, kutatómunkát támogató AI eszközök
Mivel mindenki doktorandusz a csoportban, így a különböző MSc-s alapvégzettsége ellenére mindannyiunknak vannak strukturális programozáshoz kötődő alapismeretei, valamint adatok elemzéséhez szükséges elméleti matematikai/statisztikai alapjai.
A csoport órái szeptembertől decemberig, szombatonként zajlottak. Sándor tartotta a 24 órás Java programozás modult. Ez nagyban lefedi a Java SE szoftverfejlesztő tanfolyamunk tematikáját és kapcsolódik a Java EE szoftverfejlesztő tanfolyamunk és a Java adatbázis-kezelő tanfolyamunk tematikájához is. Én tartottam a 24 órás MATLAB programrendszer modult. Ketten közösen tartottuk a 24 órás Mesterséges intelligencia modult. Igazán tartalmas őszi időszakot jelentett számunkra ez a 12 szombat. Mindenki elvitte, amit beletett.
A koncepciót once-in-a-lifetime jelleggel dolgoztuk ki 🙂 (újratöltve) azzal a fő szándékkal, hogy hatékonyabban működjünk együtt a jövőben. A visszajelzések alapján bátran állíthatom, hogy ez gördülékenyen fog menni. Egyben köszönöm mindenkinek az aktív, konstruktív részvételt.
Az Hour of Code egy 2013-ban kezdődött globális mozgalom 180-nál több országban. Több tíz millió embert érint világszerte. Célja, hogy mindenki megismerkedjen a programozás alapjaival, egy órányi közös tanulás alkalmával. Az Óbudai Egyetem Neumann Informatika Karán 7. alkalommal került sor a Kódolás órája rendezvényre 2023. december 18-án.
A rendezvény weboldalán megtalálható néhány hívószó, szemléletformáló gondolat:
Miért tanuljak programozni? Azért, mert megtanít gondolkodni! A programozás egy tanulható, elsajátítható készség, amely fejleszti a logikai érzéket és a rendszerszemléletet.
Világszerte, így hazánkban is, olyan általános igény van informatikusokra, amelyet az álláskeresők tömege sem tud kiszolgálni.
A munkaerőpiacon is értékes tudás a programozás ismerete.
9:30-kor indult a feladatmegoldás a NIK számítógépes laborjaiban. Kezdő és haladó szintű feladatok, kihívások, számítógépes játékokban való vezérlés, stratégia tervezése, megvalósítása, tesztelése. Mindez igény szerint egyénileg vagy kiscsoportosan zajlott. A használt online felület élményalapú tanulást, gamifikációt biztosított. Többféle programozási nyelv közül lehetett választani, attól függően, hogy kinek milyen előismeretei voltak. A többség Python vagy JavaScript nyelveket választott.
11 órától – újra plenárisan – a NIK bemutatkozására került sor. Dr. Kertész Gábor – a NIK kutatási dékánhelyettese – ismertette a kar képzéseit, az alapképzések felépítését és a választható specializációkat. Természetesen a nyílt napokra jellemző erősségeink, hallgatók támogatása, ipari kapcsolatok, kari kutatások, munkavállalás hallgatóként kötelező elemek sem maradtak ki.
12 órától két ismeretterjesztő előadás következett. Az első előadás – a NJSZT részéről – a Neumann 120 rendezvénysorozat alkalmából Neumann János életét és munkásságát összegezte. Dömölki Bálint Neumann, a polihisztor című kutatásából megtudtuk, hogy Neumann összesen hat különböző szakterületen publikált. Ezek: „tiszta” matematika; analízis, alkalmazott matematika; logika, halmazelmélet; fizika, kvantummechanika; számítástudomány; gazdaságtan, játékelmélet. A második előadás – a NIK részéről – egy kategóriájában nyertes TDK (Tudományos Diákkör) munka ismertetése volt. Csippán György – a NIK hallgatója mesterséges intelligencia szakirányon – tartotta Szavakon túl: beszédvizualizáció MI segítségével, az elragadó vizuális média létrehozásáért címmel. Ismertette a beszélt mondatok rögzítéséhez, videó létrehozásához, valós idejű futtatás biztosításához kötődő metodológiáját, valamint felhasznált két generatív modellt, amelyeket össze is hasonlított kutatómunkájában.
Végül 13 órától a résztvevők megtekintették – szakszerűen felkészült tárlatvezetővel – a kar épületének 1. emeletén található IT Evolúció 2.0 című kiállítást. Az 52 db vitrinben található eszközök az alábbi témakörökhöz, szakterületekhez kötődnek: nyelv és beszédtechnológia, írás és írástechnológia, műszaki rajzolás eszközei, könyvnyomtatás, hang- és képrögzítés, elektromos távközlés, számítógépek, személyi számítógépek, az internet hazai megvalósítása, mobil és okos technikák. A kiállítás Dr. Kutor László, az Óbudai Egyetem címzetes egyetemi tanárának több mint 40 évnyi gyűjtő és rendszerező munkájával kifejlődött magángyűjteményéből jött létre.
Az Európai Programozási Hét idén 2023. október 7-22-ig kerül megrendezésre. Ez egy önkéntesek által működtetett, alulról szerveződő kezdeményezés. Az önkéntesek saját országukban a Programozási Hét nagyköveteként népszerűsítik a programozást. Ehhez nyílt és ingyenes (online és offline) eseményeket hirdetnek meg a CodeWeek.eu weboldalon.
A Programozási Hét célja
a programozással való alkotás megünneplése,
az emberek felvértezése képességekkel,
az emberek összekapcsolása,
még több ember érdeklődésének felkeltése a tudomány, a technológia, a mérnöki ismeretek és a matematika iránt.
Miért jó ez az érdeklődőknek/résztvevőknek?
A programozás szórakoztató!
Programozni kreatív tevékenység! Az emberiség a kezdetektől fogva alkot: agyagból, kőből, téglából, papírból vagy fából. Manapság programozással is alkotunk.
A programozás felvértez! Sokkal többre is képesek vagyunk annál, hogy csak fogyasszuk a digitális tartalmat; programozással sokféle dolgot alkothatunk, és azokat milliók számára elérhetővé tehetjük. Létrehozhatunk weboldalakat, játékokat, irányíthatunk egy számítógépet vagy egy robotot.
Értsük meg a világot! Manapság egyre több minden össze van kapcsolva. Ha némi rálátásunk van arra, hogy mi történik a színfalak mögött, akkor a világot is jobban megérthetjük.
A programozás megtanítja nekünk a számítógépes gondolkodást, fejleszti a problémamegoldást, kreativitást, kritikus érvelést, analitikus gondolkodást, valamint csapatmunkára késztet.
Manapság a munkahelyek 90%-a digitális készségeket, köztük programozási ismereteket követel a munkavállalóktól.
2015-től veszünk részt az esemény szervezésében, programozást népszerűsítő előadások, laborgyakorlatok meghirdetésével és megtartásával. 2022-ben világszerte 80+ országban 4+ millió érdeklődő résztvevő csatlakozott. Ajánljuk korábbi beszámolóinkat is szakmai blogunkból, lásd: CodeWeek.eu címke.
Meghirdetett eseményeink
2023-ban hat it-tanfolyam.hu-s eseményt hirdettünk meg a Programozási Hét 2023 rendezvényen.
Helyszín: 1056 Budapest, Váci utca 47., 3. emelet, megközelítés
Dátum és időpont: 2023. október 21. 9:00-12:00-ig
Az események ingyenesek voltak, de a részvétel előzetes regisztrációhoz kötött.
Rendezvényünk plakátja
A rendezvény jó hangulatban telt, 40+ érdeklődőt vonzott. Többen rendszeresen visszatérő vendégek voltak, például a tavaszi Digitális Témahét, vagy a szeptember végi Kutatók éjszakája rendezvényeinkről. Eltérő belső motivációval érkeztek, ezek kulcsszavakban: kíváncsiság, pályaorientáció, karrierváltás, programozási trükkök. Igazán tartalmasan telt el idén is ez a rendezvényre szánt három óra. Köszönöm oktató kollégáimnak és 2 korábbi hallgatónknak, hogy előadóként részt vettek a Programozási hét 2023 – CodeWeek.eu rendezvényünkön. Prezentációinkat tanfolyamaink hallgatói számára – a témához kapcsolódó témakörökhöz, ILIAS-ra feltöltve – tesszük elérhetővé.
9:00-9:25 – Szegedi Kristóf: Játékprogramok heurisztikáinak elemzése A tudásalapú rendszerek elméleti alapjaihoz tartoznak a mesterséges intelligencia különböző megoldáskereső módszerei, az állapottér-reprezentáció és a klasszikus keresési stratégiák, heurisztikák. Egy játék állapotait nyilvántartjuk egy adatszerkezetben. Lehet, hogy néhány lépést előre kalkulálunk (kiterjesztünk) és ezek elágazásaiból fát (fa adatszerkezet) tudunk építeni. Ezeket hatékonyan karban kell tartani konstrukciós és szelekciós műveletekkel. Heurisztika alapján döntéseket kell hozni. Vajon melyik állapot a jobb, vagy kevésbé rossz, legalább olyan jó mint ahol járunk? Ki kell értékelni és abba az irányba érdemes haladni, amelyben végül a döntések sokasága igazolja és egyben adja a nyerő stratégiát. Ha ez nem megy, akkor még mindig játszhatunk nem vesztő stratégiával, azaz lehet cél a hosszabb játékmenet, vagy akár a döntetlen állapot is. Az előadás ismertet néhány tipikus problémaszituációt, játékteret leképező reprezentációs gráfbeli navigációt és összehasonlít néhány fabejáró/gráfbejáró stratégiát. A program mindhárom Java tanfolyamunk orientáló moduljához kötődik. Előismeretként feltételezünk némi jártasságot a programozási alapismeretek, programozási tételek, ciklusok, metódusok, tömbök témakörökből.
9:30-9:55 – Kaczur Sándor: Írjunk hatékony adatbázis-lekérdezéseket! Az Oracle HR sémában, először tipikus, hétköznapi szavakkal megfogalmazunk néhány lekérdezést, majd SQL nyelven megvalósítjuk és elemezzük, hogy helyesek-e, hatékonyak-e, mit adnak vissza. Szükség esetén optimalizáljuk, testre szabjuk ezeket. Kategóriák: egyszerű, összetett, aggregáló, soktáblás, hierarchikus/rekurzív lekérdezések. Ha lehet, grafikusan is megjelenítjük a lekérdezések eredményeit Java swing felületen, beépített
JTable és
JTree komponensekkel, illetve
JFreeChart grafikonnal is. A Java adatbázis-kezelő tanfolyamunk tematikájához kötődik a program. Előismeretként feltételezünk némi jártasságot adatbázis-kezelés, SQL, Java swing felhasználói felület témakörökből.
10:00-12:20 – Hollós Gábor: Érvényes lottószelvényt kaptunk?
Garantáltan helyes lottószelvény helyett előállítunk valamit, amiről feltételezhetjük, hogy lehet lottószelvény. Egymásra épülő unit teszteket készítünk, hogy valóban lehet-e. Például: kapott a teszt metódus egyáltalán valamit paraméterként? Tömböt kapott paraméterként? Hány elemű tömböt? Mekkora a tömbben lévő legkisebb és legnagyobb elem? Különböző a tömbben minden elem? (Ha nagyon szigorúak vagyunk: növekvő sorrendben vannak a tömbben az elemek?) Ha minden kritérium teljesül, akkor érvényes lottószelvényünk van. Kiegészíthetjük időméréssel is. Megtudjuk, hogyan kapjuk meg azt, hogy az esetek 89%-a helyes ötöslottó szelvény lesz. A program a Java SE szoftverfejlesztő tanfolyamunk tematikájához kapcsolódik. Előismeretként feltételezünk némi jártasságot programozási alapismeretek, programozási tételek, ciklusok, metódusok, tömbök, listák, halmazok, lambda kifejezések témakörökből.
10:25-10:55 – Kaczur Sándor: Java kollekciók hatékonysága
Adott egy ismert algoritmus egy ismert problémára. A gyakorlati bemutató példákat mutat arra, hogy az ismert Java kollekció keretrendszer különböző adatszerkezeteinek funkcionalitását/szolgáltatásait felhasználva mennyire eltérő megoldásokat tudunk készíteni. Mindegyik megoldás ugyanazt az eredményt adja, de alapjaiban más gondolatmenettel születtek. Vajon melyik tekinthető hatékonyabbnak? Mennyi tárhelyet igényelnek? Mennyi idő alatt hajtódnak végre? Mennyire bonyolultak, azaz mennyire könnyű/nehéz megérteni/dokumentálni/elmagyarázni? Előkerülnek különböző
Set,
Queue,
List,
Map implementációk, programozási tételek. Amit csak lehet, mérünk, összehasonlítunk, elemzünk. Végül az eredmények alapján javaslatokat adunk: mikor, miért, mit (mit ne), hogyan (hogyan ne) használjunk. A program a Java SE szoftverfejlesztő tanfolyamunk tematikájához kötődik. Előismeretként feltételezünk némi jártasságot a programozási alapismeretek, programozási tételek, ciklusok, metódusok, tömbök, listák, halmazok, lambda kifejezések témakörökből.
11:00-11:25 – Kiss Balázs: Gondolkodjunk logikusan!
Az előadás során áttekintjük az intelligencia, a kreatív problémamegoldó és logikus gondolkodás összefüggéseit és izgalmas feladatokból válogatva közösen megoldunk néhány fejtörő feladatot. Néhány példa: Hány éves a kapitány?, CHOO + CHOO = TRAIN, Logikus gondolkodás teszt. Minden feladathoz adunk rávezető példákat – ha esetleg egyik-másik nem menne, akkor ebből megtudod, miket érdemes gyakorolni, hogy menjen. A program mindhárom Java tanfolyamunk orientáló moduljához kötődik. Előismeretként feltételezünk némi jártasságot az algoritmusok, programozási alapismeretek, programozási tételek témakörökből.
11:30-12:00 – Falus Anita, Horváth Zoltán Miklós: Friss munkaerőpiaci tapasztalataink szoftverfejlesztőként Mennyire könnyű ma szoftverfejlesztőként elhelyezkedni szakirányú felsőfokú végzettség nélkül? Milyen kihívásokkal találkozhatunk a felvételi folyamat során? Milyen elvárásokat támasztanak a munkaadók egy junior szakemberrel szemben? Hogyan telnek a beilleszkedés után a hétköznapok junior fejlesztőként kis létszámmal működő informatikai profilú kisvállalkozásnál? A tanfolyamainkon 2021-ben és 2022-ben végzett előadók karrierváltó junior szakemberként személyes tapasztalataikról számolnak be és válaszolnak a kérdésekre. A program a Java tanfolyamaink orientáló moduljához kötődik.
Adott egy mappában lévő sok-sok képfájl, többféle formátumban, kiterjesztéssel. A feladat az, hogy időzítve jelenítsük meg ezeket a képeket véletlen sorrendben saját fejlesztésű Java program segítségével. A tervezés során áttekintünk többféle lehetőséget. Bemutatjuk a megoldáshoz szükséges lépéseket és a program működését.
A program tervezése
A szükséges bemeneti adatok
Egy mappa, abszolút vagy relatív útvonal, ahol a képfájlok megtalálhatók. A mappa átvehető a program paramétereként (ha parancssorban meghívva átadjuk) vagy lehet az aktuális mappa (ahonnan a programot
jar fájlként elindítjuk). A program a mappában közvetlenül megtalálható képeket olvassa be. Az ott található almappákba nem megy bele.
A képfájlok különböző kiterjesztéseit tárolni kell. Többféle is lehet, így ehhez szükséges alkalmas adatszerkezet. A listában nem szereplő kiterjesztéssel rendelkező fájlok nem kerülnek feldolgozásra.
Érdemes a képfájlokat egy lépésben betölteni a memóriába. Így a program takarékos erőforrásként bánik a tárhellyel (merevlemez, pen-drive, SSD, hálózati meghajtó). Csak egyszer dolgozza fel (olvassa végig) a mappát. Feltételezzük, hogy a képfájlok beférnek a memóriába.
A program teljes képernyős, amiből elérhető a rendelkezésre álló terület mérete, ahol megjeleníthetők a képek. A program a betöltött képfájlok méreteihez is hozzáfér. Ez a méret kétféle lehet: bájtban kifejezhető a képfájl elfoglalt tárhelye, illetve pixelben kifejezhető a képfájl dimenziója (másképpen a megjelentéséhez szükséges terület mérete a képernyőn).
Hogyan működik a program?
Egyszerre egy kép jelenik meg. Időzítő befolyásolja a képfájlok közötti váltást. Meghatározza, hogy a képfájlok meddig látszanak (másképpen: eltelt idő, késleltetés, várakoztatás). A swing GUI-hoz tartozó időzítőt kell hozzá használni.
A program alkalmazkodik a képernyő, kijelző felbontásához, képarányához. A program végtelenítve működik, Alt + F4 billentyűkombinációval lehet kilépni belőle.
A képfájlok megjelenítésük során optimálisan, dinamikusan kitöltik a rendelkezésre álló téglalap alakú területet. A túl kicsi képeket nagyítani kell. A túl nagy képeket kicsinyíteni kell. Mindezt úgy, hogy a képarányt (aspect ratio) meg kell tartani, hogy a képek ne torzuljanak el. Az alábbi három példa balról-jobbra mutatja az optimális kitöltést, illetve azt a két esetet, ami akkor történik, amikor a kép méretéhez képest a megjelenítésre használható terület túl magas vagy túl széles:
A galériába tartozó képek közötti véletlen sorrendet meg kell oldani. A program a memóriába betöltött képek sorszámai alapján valósítja meg a véletlenszerű kiválasztást. A sorszámok összekeverednek. Egymás után nem jöhet ugyanaz a kép többször. Ha a képek „elfogynak”, akkor a program végtelenített működése szerint a képek sorszámai újra összekeverednek és „lejátszásra kerülnek”.
A program megvalósítása
A mappát a
java.io csomag
File osztályából létrehozott
folder objektum tárolja (a
"./" szövegliterál jelöli az aktuális mappát). A feldolgozandó képfájlok kiterjesztéseinek listáját egy dinamikus tömbből létrehozott generikus lista oldja meg:
ArrayList<String>imageFileExtensionList=newArrayList<>(Arrays.asList("JPG","JPEG","PNG","GIF")). Egy képfájl memóriabeli tárolását a
java.awt.image.BufferedImage típus valósítja meg, amelyekből szintén generikus lista épül:
ArrayList<BufferedImage>imageList. A grafikus felhasználói felülethez tartozó
javax.swing csomagbeli
Timer osztály szükséges, például 2 mp-es várakoztatás és eseménykezelés:
timer=newTimer(2000,(ActionEvent)->{showRandomImage();}). A GUI
JFrame leszármazott keretobjektum. A grafikus felhasználói felület a teljes képernyőt elfoglalja:
setExtendedState(MAXIMIZED_BOTH) és
setUndecorated(true). A keretre egyetlen
JLabel típusú, fekete hátterű
lbImage objektum kerül, az alapértelmezett határmenti elrendezésmenedzser közepére (vízszintesen és függőlegesen egyaránt). A képfájlok sorszámai (a későbbi véletlen kiválasztáshoz) az
imageIndexList generikus listába/kollekcióba kerülnek. Az
index változó jelöli az aktuális, memóriába betöltött képfájl sorszámát, ami kezdetben nulláról indul.
A képfájlok betöltése az alábbiak szerinti:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
privatevoidcreateImageList(){
File[]imageArray=folder.listFiles((File path)->{
Stringextension=path.getName().toUpperCase().
substring(path.getName().lastIndexOf(".")+1);
returnimageFileExtensionList.contains(extension);
});
try{
for(inti=0;i<imageArray.length;i++){
imageList.add(ImageIO.read(imageArray[i]));
imageIndexList.add(i);
}
Collections.shuffle(imageIndexList);
}
catch(IOExceptione){
//
}
}
A fájlok kiterjesztésének szűrése a
FileFilter interfész
accept() metódusának megvalósításával történik. A fenti forráskódban mindez tömör, lambda kifejezéssel (művelettel) valósul meg. A fájlszűrőn az képfájl megy át, aminek a nagybetűssé alakított kiterjesztését tartalmazza az
imageFileExtensionList kollekció. Az
i-edik képfájl memóriába való betöltését az
ImageIO osztály statikus
read() függvénye oldja meg. A képfájlok sorszámainak véletlen összekeverése kezdetben megtörténik:
Collections.shuffle(imageIndexList). A fájlkezelés miatt kötelező kivételkezelést most – itt a szakmai blogban – nem részletezzük.
Az időzítő eseménykezelése, a 2 másodpercenkénti képváltás így valósul meg:
Érdemes lehet tesztelni nem ajánlott (rossz) megoldásként azt, hogy a program az időzítőnek megfelelően, dinamikusan olvasná be a képfájlokat, amivel lényegesen kevesebb memóriát igényelne.
Van-e reális korlát arra, hogy mennyi, mekkora képek „férnek el” a memóriában?
Hogyan befolyásolja a képfájlok száma és az általuk elfoglalt tárhely a program indulását?
Mi történik, ha nincs megfelelő kiterjesztésű képfájl a mappában? És ha több 1000 kép van benne?
Hogyan jelennek meg (megjelennek-e) az animációt tartalmazó képfájlok? Például a GIF képformátum nem csak statikus egyetlen képet tartalmazhat, hanem lehet animált is.
Teljesen megvalósul-e a reszponzivitás? Ha igen, mi indokolja? Ha nem, miért nem és hogyan lehetne megoldani?
Ha átmenetileg kikapcsoljuk a teljes képernyős megjelenítést, akkor könnyen tesztelhetővé válik a megvalósuló reszponzivitás. Másképpen a program dinamikusan alkalmazkodik a rendelkezésre álló (rajzolható) terület méreteihez (szélesség és magasság):
A program továbbfejlesztési lehetőségei
A program rekurzívan bejárhatná a
folder által megjegyzett útvonalból kiindulva a teljes (al)mappaszerkezetet.
A program paraméterezhető lehetne a képfájlok kiterjesztéseivel. Akár konfigurációs fájlból is beolvashatná az
imageFileExtensionList adatszerkezetet, például XML, JSON formátumban is.
A program ellenőrizhetné, hogy a mappában lévő összes kép befér-e a memóriába. A program kezelhetne ehhez kötődően többféle limitet: például az első 100 db képet töltené be, és/vagy csak annyi képet tölt be, ami belefér például 64 MB-ba.
A program mutathatná folyamatindikátorral induláskor a képfájlok betöltését. Vagy betölthetné például az első 5 db-ot és háttérszálon a többit, amíg az első 5-öt „lejátssza”.
Ha például a program 10 képet tölt be mappában lévő képfájlokból, akkor ezek 0-tól 9-ig sorszámozódnak. A sorszámok összekeverve következnek. Ha az első menetben az utolsó kép sorszáma például a 7 volt, akkor a következő ismétlődő menet nem kezdődhetne 7-tel.
A programból ki lehetne lépni az Esc billentyűvel is.
KeyListener interfésszel megoldható.
A program kezelhetne egyéb képfájlformátumokat is: például animált GIF, statikus WebP, animált WebP.
A program könnyen kiegészíthető prezentációk diáinak időzített/felülbírált megjelenítésére.
A program által beolvasott képfájlokból generálható PDF fájl is (rácsos sablonnal, például 6 db kép laponként). A feldolgoztt mappában lévő képfájlok könnyen feltölthetők FTP szerver adott mappájába, átméretezhetőek csoportosan, elküldhetők nyomtatási sorba is.
Érdemes megismerni a JDK-n kívüli egyéb, képfájlokat kezelő osztályok, csomagok funkcióit, például: OpenIMAJ, TwelveMonkeys ImageIO.
A swing-es felület kiegészíthető mappatallózással, egyéni fájl(típus)szűrőkkel, paraméterezhető lehet a véletlenszerű kiválasztás algoritmusa, változtatható az időzítés késleltetése.
Mivel a program teljes képernyős, így elrejthető az egérmutató.
A képek „lejátszásából” lehetne generálni animált GIF-et.
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
A Java SE szoftverfejlesztő tanfolyamunkon, a szakmai modul Objektumorientált programozás témakörét követő 29-36. óra Grafikus felhasználói felület alkalmain már tudunk egyszerűbb animációs, szimulációs programot tervezni, kódolni, tesztelni.
Weboldalunkon cookie-kat (sütiket) használunk, melyek célja, hogy teljesebb szolgáltatást nyújtsunk látogatóink részére. További böngészésével hozzájárul ezek használatához. ElfogadAdatkezelési szabályzat
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.