Híres idézetek

hires_idezetekHí­res idé­ze­te­ket min­dig ér­de­mes fi­gye­lem­mel kí­sér­ni és hasz­nos né­ha el­gon­dol­kod­ni is eze­ken. Az alábbi­ak­ban prog­ra­mo­zás­hoz, szoft­ver­fej­lesz­tés­hez, illet­ve in­for­ma­ti­ká­hoz kö­tő­dő­en gyűj­töt­tem össze 12 idé­ze­tet. A hí­res em­be­rek kö­zött van­nak mér­nö­kök, ma­te­ma­ti­ku­sok, ku­ta­tók, akik prog­ra­mo­zá­si nyel­ve­ket al­kot­tak, akik hard­vert ter­vez­tek, cé­get ala­pí­tot­tak, akik in­for­ma­ti­kus­ként dol­goz­tak/dol­goz­nak. További idé­ze­te­ket szí­ve­sen fo­ga­dok.

„Tévedés azt hinni, hogy egy komplex rendszerhez tervezők és programozók hada szükségeltetik. Egy olyan rendszert, melyet teljesen vagy jelentős mértékig nem ért meg egyetlen személy, valószínűleg nem kell megépíteni.”

Niklaus Wirth (1934-), számítástudománnyal foglalkozó svájci matematikus, informatikus, a Pascal programozási nyelv tervezője és fejlesztője

„Amikor kommentárokat olvasok javaslatokról, hogy a C nyelvnek merre kellene haladnia, gyakran visszagondolok a múltra és hálát adok, hogy nem a széleskörű nyilvánosság tanácsait figyelembe véve végeztük a fejlesztését.”

Dennis M. Ritchie (1941-2011), amerikai számítógéptudós, a C programozási nyelv tervezője

„Szeretném látni, hogy a Perl-t használók kreatívan ragasztják össze a dolgokat, nem csak technikailag, hanem társadalmilag is.”

Larry Wall (1951-), amerikai programozó, a Perl programozási nyelv alkotója

„Ha a Java-n kívül más nyelvet választanék, akkor az a Scala lenne.”

James Gosling (1954-), kanadai számítógéptudós, a Java programozási nyelv atyja

„Tulajdonképpen utálom a programozást, de szeretek problémákat megoldani.”

Rasmus Lerdorf (1968-), dán-kanadai programozó, a PHP programozási nyelv tervezője

„Az emberek úgy gondolják, hogy a számítástechnika a zsenik művészete, de a valóság az ellenkezője: sokan csinálnak olyan dolgokat, amelyek egymásra épülnek, mint mini kövekből a fal.”

Donald E. Knuth (1938-), amerikai matematikus, az algoritmuselemzés atyja

„Az objektumorientált programozás egy rendkívül rossz ötlet, amely csak Kaliforniából származhatott.”

Edsger W. Dijkstra (1930-2002), holland matematikus, informatikus, a strukturált programozás fogalmának bevezetője

„A programozás ma a gyémántbányászat ellentéte. A gyémántbányászatban rengeteg szennyeződést ásunk ki, hogy egy kis értéket találjunk. A programozásnál az értékkel kezdünk, majd eltemetjük azt egy csomó szennyeződésbe.”

Charles Simonyi (1948-), magyar származású, USA-ban élő szoftverfejlesztő, az objektumorientált programozás bevezetője a Microsoftnál

„A szoftver egy nagyszerű kombináció a művészet és a mérnöki munka között.”

Bill Gates (1955-), amerikai szoftverfejlesztő, a Microsoft cég társalapítója

„Egész életemben olyan számítógépeket terveztem, amelyeket soha nem tudtam megépíteni.”

Steve Wozniak (1950-), amerikai elektromérnök, az Apple Computer cég társalapítója

„Néhányan amiatt aggódnak, hogy a mesterséges intelligencia elgyengít bennünket, de bárkinek – józan ésszel gondolkodva – alsóbbrendűségi komplexusa kellene, hogy legyen mindig, amikor egy virágra néz.”

Alan Kay (1940-), amerikai számítógéptudós, az objektumorientált programozás és a grafikus felhasználói felület koncepcióinak úttörője

„Ha egy gép várhatóan tévedhetetlen, akkor nem is lehet intelligens.”

Alan Turing (1912-1954), brit matematikus, a Turing-gép fogalmának megalkotója

FIRST® LEGO® League robot verseny 2018

First Lego LeagueA Nemzetközi LEGO® Robot versenyek azért jöttek létre, hogy a segítsék/erősítsék a műszaki, természettudományos és informatikai kompetenciák fejlesztésén túl a kooperatív csoportmunkát, a problémamegoldásra orientáló komplex gondolkodásmódot. A hazai oktatási rendszerben ezek az összetevők is egyre hangsúlyosabban jelennek meg. A Magyarországon is „játszható” nemzetközi versenyek közül kiemelkedik két verseny: a FIRST® LEGO® League (FLL) és a World Robot Olympiad™ (WRO).

2018. december 15-én FLL bíróként részt vettem az Edutus Egyetem által – már sokadik alkalommal – megrendezett FLL robotika verseny tatabányai regionális fordulóján. 3 fős zsűri tagjaként a feladatom a versenyre elkészült kutatási projektek értékelése volt.

First Lego League FLL kép1

Az FLL verseny 1998-ban indult, melyen 70 országból, mintegy 30 000 csapat vesz részt évente. Magyarország a Central Europe régióban vesz részt, ahol kb. 800-900 csapat mérkőzik meg egymással. Egy csapat 3-10 főből áll, választott csapatvezetőjük van és mindannyian 9-16 év közötti tanulók.

First Lego League FLL kép2

Minden évben van egy központi témája a versenynek, ami két szálon fut:

  • Kutatási projekt: a kutatási feladat témáját megismerve a csapatok egy problémát keresnek, amelyre az életkoruknak megfelelő megoldást kell adniuk és tevékenységükről 5 perces prezentációban számolnak be a versenyen. A zsűri értékeli a kutatási projekt megvalósítása során a probléma azonosítását, elemzését, a meglévő megoldások áttekintését, a csapat megoldását, a megjelenő innovációt, a prototípust, a prezentáció felépítését, hatékonyságát, eredetiségét, a csoportmunkát. Letölthető a 2018-as kutatási feladat leírása.
  • Robotika: egy kb. 3 m2-es akadálypályán tűznek ki 10-15 megoldandó feladatot, amelyre a csapatnak robotot kell tervezni, építeni és programozni. A robotnak 2,5 perc alatt kell önállóan, a programja által vezérelve megoldania a feladatokat. Az akadálypálya egységes, minden évben központilag készítik el. A feladatok teljesen probléma centrikusak, a csapat találja ki, hogyan oldja meg, nincs abszolút jó megoldás. A verseny során a robotot át lehet építeni, és csak a pálya kijelölt területén lehet kézzel hozzáérni. A zsűri értékeli a robot dizájnt, amely a megépített konstrukció ötletességét, hatékonyságát, valamint a programok forráskódjainak működését jelenti. Külön feladat alapján értékelik a csapatmunkát is. A nemzeti fordulókból a legjobbak jutnak tovább a nemzetközi fordulókba. Letölthető a 2018-as robotverseny feladat leírása.

A 2018-as verseny során az INTO ORBIT nevű projektet kellett megvalósítani, amelyben a csapatnak azonosítania kellett egy olyan fizikai vagy társadalmi problémát, amellyel szembe kell néznie az embereknek egy hosszú távú űrutazás során a naprendszerünkön belül, és javaslato(ka)t kellett tenniük a megoldására. A korábbi évek projekt témakörei is, illetve korábbi események hírei is elérhetők: Edutus 2017, Debrecen 2018, valamint nemzetközi és hazai robotversenyek általában.

First Lego League FLL kép3

First Lego League FLL kép4

A verseny teljes dokumentációja, specifikációja több száz oldal angol nyelven és részben nonverbálisan elérhető anyagból áll és évről-évre változnak a konkrétumok, de a koncepció (alapértékek: discovery, innovation, impact, inclusion, teamwork, fun) állandó. A 2018-as robotverseny akadálypálya megépítve így nézett ki:

First Lego League FLL kép5

First Lego League FLL kép6

5 csapat mérkőzött meg egymással: Refisek, RoboGo_5vos, Maros Robo Team, legÓÁG, FrankaRobotics. A kutatási projektben többféle megközelítést alkalmaztak. Volt, ahol a technológiai, informatikai eszközorientált, kommunikációs problémák, fiziológiai szükségletek domináltak, máshol inkább perspektivikusabb társadalmi, szociológiai aspektusok és a fenntarthatóság kerültek előtérbe. Három csapat igazán kiemelkedett a délelőtti zsűri előtti fordulóban prezentációjukkal és kaptak sok-sok ötletet, javaslatot. Ők délután még egyszer megtartották előadásaikat, immár a teljes – kb. 120 fős tanulókból, felkészítő tanáraikból, szülőkből, testvérekből álló – közönség előtt. Szeretném kiemelni, hogy – miközben több szálon is futottak az egész napos rendezvényen az események – a TOP 3 csapat tagjai kiegészítették, átdolgozták délutánra a délelőtti prezentációikat és figyelembe vették a kapott ötleteket, javaslatokat. Egy markáns példa: a Plútóra küldött expedíció vezetője délelőtt még erősen autokratikus diktátor politikusként jelent meg, de délutánra már inkább emberközpontú spirituális vezetővé szelídült.

Örülök, hogy részt vehettem az FLL 2018 versenyen. Tartalmasnak bizonyult ez a nap. A szervezés nagyon profi volt. Legközelebb is szívesen csatlakozom.

Télapó probléma

Télapó-problémaAz operációs rendszerek tervezésének fontos része az ütemezési, erőforrás- és szálkezelési feladatok problémamentes, holtpontmentes megoldása, szinkronizálása, amiről sok ismert szerző publikált már, néhányan közülük angol nyelven: W. Stallings, A. B. Downey, A. S. Tanenbaum, A. S. Woodhull., és magyarul is: Galambos Gábor, Knapp Gábor és Adamis Gusztáv. Ehhez a szakterülethez tartozik több népszerű probléma/esettanulmány, például a vacsorázó bölcsek problémája, illetve a Santa Claus Problem, vagyis a Télapó probléma.

A Télapó probléma specifikációját és megoldását a konkurens programozás eszközeire építve J. A. Trono készítette el (szemaforokkal), amire építve is – és kritizálva is azt – több Java implementáció is elkészült (például: P. Steiner), valamint több programozási nyelv szálkezelési lehetőségeinek összehasonlításáról is publikált J. Hurt és J. B. Pedersen és kliens-szerver elosztott környezetben is áttekintette a lehetőségeket D. Marchant és J. Kerridge. Ismert Haskell, Erlang, Polyphonic C# implementáció is.

A Télapó probléma meghatározása

A Télapó alszik az északi-sarki boltjában és csak akkor ébredhet fel, ha mind a 9 rénszarvas visszatér a dél-csendes-óceáni trópusi szigetén töltött rendes évi nyaralásukról, illetve ha akad néhány manó, akiknek nehézségei vannak az ajándékkészítés során. A 10 manó közül 1 manó problémája nem elég komoly ahhoz, hogy felébressze a Télapót (egyébként sosem aludna), így 3 manó megy egyszerre a Télapóhoz. Amikor a 3 manó problémáit közösen megoldották, akkor mind a 3 manónak vissza kell térnie a többi manóhoz, mielőtt egy újabb manólátogatás megtörténne. Ha a Télapó úgy ébred, hogy 3 manó várja őt a bolt ajtajánál és az utolsó rénszarvas is visszatért a trópusokról, akkor a Télapónak fontosabb, hogy olyan gyorsan elinduljon a szánnal, amilyen gyorsan csak lehetséges – így a manóknak várniuk kell karácsony utánig. Feltételezzük, hogy a rénszarvasok nem akarják elhagyni a trópusokat, ezért az utolsó pillanatig maradnak, amíg csak lehetséges. Lehet, hogy egyáltalán nem is jönnének vissza, ameddig a Télapó fizeti a számlát a paradicsomban… Ez is megmagyarázhatja az ajándékok kiszállításának gyorsaságát, hiszen a rénszarvasok alig várják, hogy visszatérhessenek oda, ahol meleg van. Az utolsóként érkező rénszarvas büntetést kap a Télapótól, mialatt a többi rénszarvas a meleg kunyhóban várja, hogy befogják őket a szán elé.

A Télapó probléma – egyik – megoldása

Találtam egy kb. 10 perces kiváló YouTube videót/animációt (The Santa Claus Problem – Thread Synchronization), amely lépésenként felépíti a feladatot, érzékelteti a közben felmerülő problémákat, és megoldást is mutat. Ezt ajánlom december 6-án minden érdeklődő figyelmébe:

A feladatot részletekbe menően és komplex módon gondolkodva kell megtervezni, és implementációi komoly nyelvi eszköztárat igényelnek. Érdemes P. Steiner Java megoldását részletesen átnézni, újragondolva – újabb nyelvi eszköztárral – implementálni.

A feladat a Java EE szoftverfejlesztő tanfolyam 1-4. óra: Elosztott alkalmazások, webszolgáltatások, illetve 5-8. óra: Szálkezelés, párhuzamosság alkalmaihoz kapcsolódik.

Fibonacci nap 2018

Fibonacci nap 2018A Fun Holidays – Fun, Wacky & Trivial Holidays weboldal sokféle különleges ünnepnapot listáz. Ezek leírása többnyire vicces, emlékezős, de néhány igazán érdekes, régi-régi hagyományt elevenít fel.

Ma van (november 23.) a Fibonacci nap. Fibonacci középkori matematikus volt, ő tette közismertté a Fibonacci-sorozat-ot. A (0), 1, 1, 2, 3, 5, 8, 13, 21, 34, sorozat igen népszerű azok közében is, akik programozást tanulnak. A sorozat első két eleme 1 és 1 (ha szükséges, akkor a nulladik eleme ), és minden további elem az előző két elem összege. Többféle történet is fűződik ehhez, talán az egyik legismertebb a nyúlpárok szaporodásához kötődik.

Honnan származik a Fibonacci nap? A mai nap hh.nn. formátumban 11.23. , és a számjegyek részei a Fibonacci-sorozatnak. Mindössze ennyi, ilyen egyszerű. 😉

A sorozat elemei könnyen előállíthatók néhány változó használatával, ha a kezdő programozó már ismeri a ciklust, mint algoritmikus építőelem – ez az iteratív megoldás. A rekurzív megoldás tipikus rossz megoldásként ismert, lássuk ennek Java megvalósítását:

Ha kiadnám a fenti Java forráskódot papíron ezt egy dolgozatban, zárthelyin, állásinterjú szakmai részén azzal a kérdéssel, hogy mit ír ki a program a képernyőre, akkor bizony sokan bajban lennének. Meg is történt ez már sokszor, tapasztalatból írom. A rekurzió első leszálló ágáig szinte mindenki eljut, de az ott induló első felszálló ágat követően sokan belezavarodnak a részlépések egymásutániságába. A végeredményt szinte mindenki tudja, de itt most arra helyezzük a hangsúlyt, hogy hogyan jutunk el odáig. Persze n=5-re fib(5)=5. Alig fordult még elő, hogy valaki hibátlanul leírta volna az alábbi eredményt:

 
A megoldás során – emlékeztetek arra, hogy ez atipikus megközelítés – sok-sok redundáns lépés történik. Hiszen például a fib(3)-at tudni kell a fib(4)-hez és a fib(5)-höz is, hiszen fib(4)=fib(2)+fib(3) és fib(5)=fib(3)+fib(4), valamint ebben az implementációban nincs semmilyen emlékezet (puffer, adatszerkezet), amivel a sok feleslegesnek vélhető számítást elkerülhetnénk.

Nyert ügye lehet annak, aki „fejben összerakja” az alábbi fát – akár dinamikusan, menet közben hozzáadva és törölve elemeket – és ebben navigálva (ezt bejárva) válaszolja meg a kérdést:

Fibonacci-sorozat-n=5

Az alábbi animáció segíthet a megértésben: 45 lépésben mutatja be az aktuális részlépést/részfeladatot (leszálló ág) és/vagy az aktuális részeredményt (felszálló ág):

Fibonacci-sorozat-n=5

A Fibonacci-sorozat többféleképpen kapcsolódik a természethez, természeti jelenséghez, növényekhez, állatokhoz (virágszirmok száma, levelek elfordulása, napraforgók magjai, fenyőtoboz pikkelyei, nautilus háza, aranymetszés, zenei hangolás, zeneművek tagolása), felhasználható algoritmusok futási idejének becsléséhez, fa adatszerkezetek építéséhez is. Az aranymetszésről megoszlanak a vélemények: vannak akik szinte mindenben ezt látják (művészet: festészet, szobrászat), mások módszeresen cáfolják ezt (például Falus Róbert: Az aranymetszés legendája, Magyar Könyvklub, 2001, második, javított kiadás, ISBN 963-547-332-X).

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 Java SE szoftverfejlesztő tanfolyam szakmai moduljának 9-12. óra: Metódusok, rekurzió alkalomhoz kötődik.

Az animált gif a gifmaker.me weboldalon készült.

Fát építünk

Fát építünkAz adatok strukturális és könnyen értelmezhető formában való megjelenítése egy szoftver felhasználói felületén átgondolt tervezést igényel. Az adatokhoz hozzá kell jutni, ki kell választani a megfelelő grafikus komponenst, a mögötte lévő adatmodellt, össze kell ezeket kötni. Gyakran előforduló feladat, hogy táblázatosan is ábrázolható adatokból – felhasználva az adatok közötti összefüggéseket és kapcsolatokat – csoportosítva jelenítsünk meg hierarchikusan, fa struktúrában, kinyitható-becsukható formában, ahogyan ezt a felhasználók jól ismerik a fájl- és menürendszereket használva.

Fát építünk kétféleképpen

Adatbázisból, az Oracle HR sémából lekérdezünk két összetartozó nevet: részleg és alkalmazott. A lekérdezés során figyelünk a megfelelő sorrendre, ami a későbbi feldolgozást megkönnyíti. Adatainkat részlegnév szerint növekvő, azon belül alkalmazott neve szerint is növekvő – ábécé szerinti – sorrendbe rendezzük. A vezérlő rétegben két függvényt írunk, amely a modell rétegtől jut hozzá az adatokat tartalmazó generikus listához – átvett paraméterként –, és a visszaadott érték a nézet réteghez kerül.

A csoportváltás algoritmust használjuk, amely 5 blokkból épül fel. A külső ciklus előtti 1. blokk és utáni 5. blokk egyszer hajtódik végre, az előkészítő és lezáró tevékenységek tartoznak ide. A külső ciklus elején és végén található 2. és 4. blokk a belső cikluson kívül fut le, csoportonként, kategóriánként, részlegenként egyszer (most összesen 11-szer mindkettő). A 3. blokk a belső cikluson belül található, és alkalmazottanként egyszer hajtódik végre (most összesen 106-szor).

Háromszintű fát építünk: a gyökérbe (0. szint) fix, beégetett szövegként kerül a cég neve és a teljes létszám. Az 1. szinten jelennek meg a részlegek nevei és a hozzájuk tartozó létszámok. A 2. szint az alkalmazottak neveiből áll.

1. megoldás

A megoldás faKeszit1() függvénye szöveges adatot eredményez. Ez jól használható teszteléshez: megvan-e az összes adat, megfelelő-e a részlegek sorrendje azon belül az alkalmazottak sorrendje, működik-e a csoportosítás, rendben van-e a megszámolás?

A faKeszit1() függvény egy sok lépésben összefűzött (konkatenált) szöveget ad vissza. Az 1. blokkban előkészítjük a fa gyökerét, ami StringBuilder típusú, hiszen sokszor manipuláljuk és inicializáljuk a lista indexelésére használt i ciklusváltozót. A 2. blokkban megjegyezzük az aktuális részleget és előkészítjük az ehhez tartozó alkalmazottak nevét tároló generikus listát ( faReszlegAlkalmazott). Az aktReszleg-hez tartozó alkalmazottak neveit összegyűjtjük a 3. blokkban. Egy részleg feldolgozását a 4. blokkban fejezzük be a fa aktuális 1. és 2. szinten lévő elemeinek szövegbe való beszúrásával. A belső ciklushoz kötődően megszámolást nem kell alkalmaznunk, hiszen az adott részlegben dolgozó alkalmazottak száma a generikus listától elkérhető ( size()). Építünk arra, hogy a külső ciklusból nézve az egymás után végrehajtódó 2. és 4. blokkban az aktReszleg nem változik meg. A 2. blokkban még nem tudjuk a fa aktuális 1. szintjét hozzáfűzni a szöveghez, hiszen a létszám csak a belső ciklusban felépülő kollekciótól kérhető el utólag. Szükséges némi késleltetés, hiszen a szöveg összefűzése és lényegesen egyszerűbb (mint utólag manipulálni megfelelő helyeken). Az 5. blokkban a csoportváltás algoritmushoz kötődő tevékenységünk nincs.

Az 1. megoldás eredménye

2. megoldás

A faKeszit2() függvénynél alkalmazkodunk ahhoz, hogy a JTree vizuális komponenshez DefaultTreeModel observable típusú modell szükséges, így ezzel térünk vissza ( faModell). A fa csomópontjai DefaultMutableTreeNode osztályú objektumok lesznek, amelyeknek a userObject tulajdonsága szükség esetén manipulálható. Az 1 blokkban beszúrjuk a fa gyökerét ( faGyoker), amihez a későbbiekben csatlakozik a fa többi eleme. A 2. blokkban megjegyezzük az aktuális részleget és előkészítjük – megjelenítendő szöveg nélkül – a faReszleg csomópontot. A 3. blokkban fabeli csomópontként a fa 1. szintjén megjelenő részleghez névtelenül hozzáadjuk a fa 2. szintjére kerülő – aktuális részleghez tartozó – alkalmazottak nevét. A 4. blokkban utólag módosítjuk a faReszleg csomópont megjelenítendő szövegét. Az aktuális részleg létszámát itt sem kell külön megszámolni, mert a faReszleg-től elkérhető ( getChildCount()). Az 5. blokkban itt sincs különösebb teendőnk. 

A 2. megoldás eredménye

Fát építünk, képernyőkép

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

Attól függően, hogyan jutunk hozzá a megjelenítéshez szükséges adatokhoz, több tanfolyamunkhoz is kapcsolódik a feladat és a modell rétegben mindig másképpen tervezünk és implementálunk:

  • A Java SE szoftverfejlesztő tanfolyam 45-48. óra: Adatbázis-kezelés JDBC alapon, 1. rész alkalmán hagyományos SQL lekérdező utasítást készítünk JDBC környezetben.
  • A Java EE szoftverfejlesztő tanfolyam 25-32. óra: Adatbázis-kezelés JPA alapon alkalommal a perzisztencia szolgáltatásait vetjük be.
  • A Java adatbázis-kezelő tanfolyam 13-16. óra: Konzolos kliensalkalmazás fejlesztése JDBC alapon, 1. rész, 33-36. óra: Grafikus kliensalkalmazás fejlesztése JDBC alapon, 2. rész alkalmain hierarchikus lekérdezéseket használunk.