ASCII művészet Java-ban

ASCII Art 1Átte­kint­jük a ka­rak­ter­a­la­pú raj­zo­lás le­he­tő­sé­ge­it Java 2D gra­fi­ká­val, illetve a ka­rak­ter­fü­zé­rek kép­ként va­ló ke­ze­lé­sé­nek újabb le­he­tő­sé­ge­it is.

Az ASCII művészet jelentése és kezdete

Az ábécék betűiből/szövegeiből kialakított ábrák egyidősek lehetnek az írásbeliséggel. A technológiától függetlenül a karakterekből kialakított kép megjeleníthető: papír és penna vagy írógép, illetve számítógép és nyomtató vagy monitor segítségével.
Az ASCII művészet (ASCII art) tágabb értelemben a szövegalapú vizuális művészetre vonatkozik. Szűkebb értelemben véve a számítógépes grafika részterületének tekinthető. Az ASCII művészet számítógépet használ nyomtatható standard ASCII kompatibilis karakterekből álló képek készítéséhez és megjelenítéséhez. A képeken a képi elemek a nyomtatható karakterek, amelyek a pointilizmushoz hasonló optikai effektust mutatnak.
A művészeti ág indulása arra vezethető vissza, hogy a korai nyomtatókkal nem lehetett grafikát nyomtatni, a monitorokon nem lehetett grafikát megjeleníteni. Cégek, programok bannerjeinek, logóinak készítésére pedig akkor is volt igény. Ezek mellett például prezentációkhoz, kapcsolási rajzokhoz is használták az ASCII művészetet, valamint természetesen a korai e-mailekben is. A grafikus kártyák megjelenése előtti időkben pedig a videójátékok „grafikája” is ezzel a technikával készült.
Most nézzünk meg néhány lehetőséget saját programmal való képkészítésre.

ASCII képek rajzolása programozási alapismeretek tanulásakor

Saját programmal már az alapok tanulásakor készíthetők ASCII képek a vezérlő szerkezetek megismerése kapcsán. Az alábbi képek bemutatják a lehetőségeket.

ASCII Art 2

További sok-sok kép található az alábbi weboldalakon:

A 2D grafikával való szövegrajzoláshoz használható BufferedImage osztály

A BufferedImage osztály a java.awt.image csomag része. Az Image osztály utódja. Hozzáférhető képadat-puffert tartalmaz, colorModel-ből és képadatok raster-éből áll. A raster sampleModel-jében a sávok számának és típusainak illeszkedniük kell a színt és átlátszó (alpha) komponenseket megadó colorModel által megkívánt számhoz és típusokhoz. A BufferedImage típusú objektumnak van bal felső koordinátája (0, 0), ezért a létrehozásához használt raster-nek kell legyen minX=0 és minY=0 értéke. A BufferedImage osztály a raster fetch és set metódusaira, valamint a colorModel színmódosítási módszereire támaszkodik.

Szöveg képként megjelenítése karakterekkel a konzolon

A kép méretét beállítjuk. A Graphics2D osztály drawString() metódusával String-et képként jeleníthetünk meg. Bár elég „munkás”, de Java-ban gyakran BufferedImage példány létrehozásával oldjuk ezt meg, és a Graphics példányt attól kérjük el. A Graphics2D osztály karakterfüzérek rajzolásakor egyszerű mátrixszerű technikát használ. A String-et kirajzoló mátrixrészek nullától különböző értéket kapnak. A megjelenítendő terület értékét egyszerű adatként, például int-ként kell megadnunk, nem RGB színértékekkel. Ehhez a képtípust int-módba állítottuk: BufferedImage.TYPE_INT_RGB. Az ASCII képek alapötlete az, hogy a képmátrix nem nulla indexeihez hozzárendelt értékeket a kívánt művészi karakterrel helyettesítjük. A nulla értékű mátrixindexeknek szóközt adunk. A nulla integer-módban -16777216-tal egyenlő. Ezután a Java 2D grafika haladó renderelő beállításainak használatához kasztoljuk a Graphics objektumot Graphics2D példánnyá. Majd beállítjuk a kívánt renderelési paramétereket, végül meghívjuk a drawString() metódust egy karakterlánccal.

Íme az elkészült szöveg/képernyőkép:

ASCII Art 3

A karakterek cserélgetésével a pozitív képből könnyen kaphatunk inverz/negatív képet is. A generált/renderelt képet fájlban is tárolhatjuk, például a javax.imageio.ImageIO osztállyal és adott a lehetőség a kép méretének megadására, a rajta megjelenő szöveg betűtípusának beállítására, háttérszín és szövegszín alkalmazására is.

A Java BufferedImage osztály néhány lehetőségének áttekintése után jó szórakozást kívánunk az ASCII képek létrehozásához, a lehetőségek további tanulmányozásához. Aki nem programból szeretne karakterekből/szövegekből felépülő képeket készíteni, használhat online alkalmazásokat is, például az Image to HTML/ASCII-t.

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 21-24. óra: Objektumorientált programozás, 2. rész alkalmához kötődik.

Telefonos billentyűzettel kódolunk/dekódolunk

Telephone-keypadNem­rég egy be­tű­ket és szá­mo­kat tar­tal­ma­zó kó­dolt szö­ve­get kap­tam azzal a ké­rés­sel, hogy pró­bál­jam meg­fej­te­ni. A tit­ko­sí­tott szö­ve­get a kö­vet­ke­ző for­má­tum­ban kap­tam: 88.222.666.333.444.888.33.333. Azt is le­he­tett ró­la tud­ni, hogy a meg­fej­tés csak az an­gol á­bé­cé be­tű­it és szá­mo­kat tar­tal­maz­hat. Ilyen és ehhez ha­son­ló kó­dok meg­fej­té­se­it az Ingress ne­vű AR (augmented reality) já­ték­ban le­het fel­hasz­nál­ni (Android és iOS plat­for­mon is el­ér­he­tő), ahol a já­ték fej­lesz­tői min­dig va­la­mi­lyen egy­sze­rűbb kó­do­lás­sal juttat­ják el a já­té­ko­sok egy cso­port­ja szá­má­ra a kó­do­kat, ami­ért a já­ték­ban extra fel­sze­re­lés­hez le­het jut­ni. Az elő­ző for­du­lók­ban már ta­lál­koz­tam Base64 és Morse-kódolás­sal is, így gya­ní­tot­tam, hogy a mos­ta­ni felad­vány meg­fej­té­se sem le­het ne­héz fela­dat. Úgy gon­dol­tam, hogy a szá­mok kö­zötti pon­tok egy-egy ka­rak­ter el­vá­lasz­tá­sát je­lent­he­tik, míg a szám­je­gyek da­rab­szá­ma is hor­doz­hat hasz­nos in­for­má­ci­ót, nem csak az ér­té­kük. In­for­ma­ti­kus lé­vén rög­tön az ASCII táb­la ju­tott eszem­be, de bár­hogy pró­bál­tam va­la­mi­lyen le­ké­pe­ző függ­vényt al­kot­ni, nem si­ke­rült a szá­mo­kat le­szű­kí­te­ni a be­tűk és szá­mok tar­to­má­nyá­ra. A vég­ső megol­dást egy csa­pat­tár­sam se­gí­tett meg­ta­lál­ni, aki a jobb ol­da­lon lát­ha­tó ké­pet küld­te el ne­kem.

Például kódoljuk a SZOFTVERFEJLESZTES szöveget és ezt kapjuk: 7777.9999.666.333.8.888.33.777.333.33.5.555.33.7777.9999.8.33.7777, amit dekódolva természetesen visszakapjuk az eredeti szöveget. Hogyan működik mindez?

Tegyük fel, hogy a kódolás és dekódolás során csak az angol ábécé nagybetűit és a szóközt fogjuk használni. Hasznos néhány konstans deklarációja: a nyomógombok feliratai szövegként ( TABLE1) és tömbben ( TABLE2), szeparátorok nélküli ábécé ( TABLE3) a kódolás elvégzéséhez, valamint a dekódoláshoz szükséges szöveg ( TABLE4):

A kódolás (titkosítás) lépései

A kódolás elvégzését ellenőrzésnek kell megelőznie, hiszen a paraméterként átvett szöveg ( text) nem kódolható ha üres ( isEmpty()) vagy érvénytelen karaktert tartalmaz (olyat, ami nem szerepel a telefon nyomógombjain: ékezetes vagy írásjel). Bármilyen probléma esetén a kódoló metódus kivételt dob. A kódolás során a szöveget automatikusan nagybetűsként értelmezzük.
A kódolás során minden karakter (pl.: E) esetén ki kell választani, hogy a TABLE2 tömb melyik elemében szerepel (pl.: j=3, a nyomógomb felirata DEF) és a j-edik elemben tárolt szöveg hányadik pozícióján található (pl.: index=1). Tehát tudjuk, hogy a C karakter kódja 33, azaz ehhez a 3-as gombot kétszer ( index+1) kell lenyomni. A Java nyelvben tömbök indexelése és a szövegben lévő karakterek pozíciója is nulla bázisú sorszámmal történik. A karakterek 1-4 (változó) hosszú kódjai közé pont kerül ( coded).

A dekódolás (visszafejtés) lépései

A dekódolás elvégzését is ellenőrzésnek kell megelőznie, hiszen a paraméterként átvett szöveg ( text) nem dekódolható ha üres ( isEmpty()) vagy érvénytelen karaktert tartalmaz (olyat, ami nem feleltethető meg a telefon nyomógombjain található karakterek egyikének). Bármilyen probléma esetén a dekódoló metódus is kivételt dob.
A dekódolás során minden karakter kódja (pl.: 33) esetén szükség van annak hosszára ( length=2) és első karakterére számként ( index=3). Ezek alapján tudjuk, hogy a TABLE2 tömb index-edik ( DEF) elemének length-1-edik eleme a dekódolt karakter ( E). A dekódoló metódus nem tesz szeparátort a dekódolt karakterek ( decoded) összefűzése során. A változó hosszúságú kódolt szöveg elemeiből egykarakteres dekódolt szövegdarabok keletkeznek.

Az ellenőrzés lépései

A logikai értékkel visszatérő ellenőrző függvény ( isValidText()) feladata eldönteni, hogy a kódolás/dekódolás során használandó szöveg ( text) minden karaktere feldolgozható, azaz a folyamat során értelmezhető (másképpen: a validCharacters szöveg tartalmazza). Optimális esetben a text hossza megegyezik a benne lévő feldolgozható/értelmezhető karakterek számával (végighalad a ciklus a text-en), egyébként leáll a ciklus az első problémás karakternél.

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

Ez a feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 21-24. óra: Objektumorientált programozás, 2. rész alkalmához, valamint minden tanfolyamunk orientáló moduljának 1-4. óra: Programozási tételek alkalmához kapcsolódik.

Rólunk mondták, rólunk írták

VéleményekRendszeresen megkérdezzük hallgatóink véleményét tananyagunkról, tematikáról, módszertanról, oktatóinkról, szervezésünkről, helyszínről (és persze minden egyébről is). A visszajelzések fontosak számunkra, és figyelembe is vesszük ezeket munkafolyamataink és kommunikációnk során.

Előfordult, hogy továbbfejlesztettünk egy korábbi feladatot (adtunk újabb specifikációt és másik megoldást is), hivatkoztunk további tutorial-okra, a csoport kérésére változtattunk az időrenden, a Skype konzultációk és/vagy a tesztek időpontjain, tantermet cseréltünk…

Az alábbiakban idéztem néhány véleményt, visszajelzést: rólunk mondták, rólunk írták. Próbáltam csoportosítani, kategorizálni – amennyire lehetett:

  • „A képzés szakmai színvonalát megfelelőnek találom. A gyakorló feladatok és a házi feladatok között is van mindenféle, könnyebb és nehezebb is. Tág határok között mozognak a lehetőségek. Ha kérdeztem, mindig olyan választ kaptam, ami releváns volt és az adott feladat megoldásához hasznos volt.”
  • „Először nem értettem, hogy miért oldjuk meg többször is ugyanazt a feladatot. Aztán rájöttem, hogy valami mindig megváltozott: paraméter, konkrét és általános megoldás, módszer, adatszerkezet, feldolgozás módja, konvertálás. Szembesültem azzal is, hogy mennyire figyelmesen kell értelmezni a specifikációt.”
  • „A képzés könyve jól felépített és az alapoktól magyaráz. A legjobban az tetszett benne, hogy fokozatosan haladt és mindig csak az addigi fejezetekben lévő tudást feltételezve jöttek a gyakorló feladatok. Ha valamit nem értettem, mindig kiderült, hol és mi maradt ki. (Megjegyzés: az említett könyv a Java SE szoftverfejlesztő tanfolyam tankönyve: Programozás Java nyelven).”
  • „Látszik, hogy sok-sok korábbi visszajelzés (is) beépült a tanfolyamba. Ütemezés, helyszín, új ötletek, példák. Hasznos a karriermenedzsmentes és soft skill anyag is.”
  • „Hasznos, hogy a tananyag magyar és angol nyelvű dolgokat is tartalmaz, hivatkozik kezdő (áttekintő jellegű) anyagokra és haladó BSc/MSc tankönyvek idevágó fejezeteire, szabványokra, ajánlásokra, tutorialokra is.”

  • „Olyan újdonságról is beszéltünk a képzésen, ami 3 héttel korábban került bele a JDK-ba.”
  • „Aki összerakta az anyagot, képben van azzal, milyen tudással vesznek fel a cégek junior fejlesztőket.”
  • „Korszerű a tematika. Sok újdonság van benne az újabb Java verziókról is.”
  • „A Java EE tematika kulcsszavai visszaköszönnek az álláshirdetések elvárásainak listájában.”
  • „Az elmélet és gyakorlat aránya megfelelő. Nincsenek hosszú ppt-k (illetve vannak, de több körben adagolva) és sok-sok feladatmegoldás van, különböző szinten: szintaktika, elemzés, OO modellezés, eltérő algoritmusok és adatszerkezetek.”

  • „Hasznos, hogy a házikhoz van videós megoldás, mert meg tudom nézni, hol akadtam el. Olyan is volt, hogy a videóban elhangzott, hogy ezt-azt többféleképpen is meg lehet oldani: a, b, c. Ha az a-t választod, akkor két lépés múlva akadsz el. Ha a b-t, akkor atipikus megoldást csinálsz, de működni fog. Ha a c-t, akkor az Oracle ajánlása szerint dolgozol. Persze ösztönösen az a-t akartam csinálni, de ellenőriztem és így nem dolgoztam feleslegesen, hanem áttértem a c-re.”
  • „Volt a csoportban olyan, aki már tanult régebben Pascalt. Sándor elmondta, hogy előzetes tapasztalat esetén mindig csinál összehasonlításokat és ad kereszthivatkozásokat, ami mindenkinek hasznos. Akinek most új a téma, annak világos lesz, hogy másképp is lehet, aki már tanult ilyet, az egy kulcsszóból vagy félszavakból is megerősítést kap. Milyen jó lett volna így tanulni korábban is!”
  • „Mindig tudtuk, hogy mit, miért, hogyan és miért éppen úgy csinálunk.”
  • „Elkaptam a fonalat és már tudok úgy gondolkodni, ahogyan ehhez a szakmához kell. Nem volt könnyű, de úgy érzem sikerült.”
  • „Elmondtátok, hogy közös kódolás közben miért nem lineárisan írjátok a forráskódot. Értékes infó volt, mert addig önállóan nem jutottam el a felismerésig, hogy ez a módszer milyen praktikus.”
  • „A tananyag elemei úgy épülnek egymásra, hogy mindenből minden logikusan következik és lehet visszafelé is hivatkozni. Én is tanár vagyok – igaz fizika szakos –, így ráéreztem a módszertan elemeire a tematikában és ez a tudatosság a mintafeladatoknál és a gyakorló feladatoknál is jelen van. Sőt még a Pólya-féle modellre is ráismertem a problémamegoldás során.”

  • „Az oktatók nagyon tudatosak. Jól tudják, mit és hogyan akarnak elérni és mi lesz majd később hasznos az állásinterjún, ill. az életben.”
  • „Az oktatók (Sándor és Borisz) nagyon felkészültek, magabiztosak. Érződött a sok éves szakmai tapasztalat és a rutin.”
  • „Sokszor kérdeztünk az órákon és láttam, hogy Sándor szinte előre tudja, hogy mit fogunk kérdezni.”
  • „Én a 32. csoportban voltam, mégis türelmes hozzáállást tapasztaltam.”
  • „Minden alkalmat kérdésekkel kezdtünk. Ebből jól látszott, hogy ki hol tart és mire kell visszatérni. A vége felé már rá is játszottunk: vajon tudunk olyat kérdezni, amire Borisz vagy Sándor kapásból nem tudja a választ. Nem tudtunk.”
  • „Sándort idézve: „egy informatikus/szoftverfejlesztő sosem adja fel”. Olyan nincs. Legfeljebb holnap helyett holnaputánra készül el a szoftver, de elkészül és működik.”
  • „A legütősebb mondat egy összetettebb UML ábra elemzésénél hangzott el: „el kell igazodnunk az általunk teremtett világban”. Ekkor értettem meg, hogy mi döntjük el, hogy valamiről milyen adatokat tárolunk és azokkal mi fog történni.”
  • „Hihetetlen a lelkesedésük, pedig tizenéve csinálják.”

  • „Hosszú OKJ képzésre nincs időm, mert dolgozom. Mindenképpen munka mellett elvégezhető tanfolyamot kerestem, ezért választottalak benneteket.”
  • „Azért jelentkeztem a Java SE képzésre, mert kutató vagyok, és így sok-sok adatot kell elemeznem. Jönnek mindenfelől: mérek műszerekkel, letöltök referenciaadatokat, hasonlítom szabványokhoz és sokféle file-t fel kell dolgoznom. Megismertük az adatfeldolgozó algoritmusokat, a szöveges file-okat, XLS-t is. Írtam ezekhez értelmezőt, konvertálót és a csoportban másnak is jól jött.”
  • „Ausztriából ingáztam vissza Java-t tanulni, de úgy érzem megérte.”
  • „Jogászként dolgozom és írni szeretnék magamnak egy nyilvántartó szoftvert.”
  • „Közgazdászként karriert váltok és banki informatikai rendszer karbantartását, továbbfejlesztését szeretném végezni a jövőben szoftverfejlesztőként, projektmenedzserként.”
  • „Könyvelőként 15 év után kiégtem és karriert váltanék. Úgy érzem, a fejlesztés nekem való.”
  • „Elértem a célomat. 4 hónap alatt kaptam egy külföldön is használható, konvertálható tudást és így a nyáron költözünk is a párommal Kanadába. Tanítói végzettséggel ott nem tudnék érvényesülni. Mivel az angol jól megy, így bátran jelentkezem majd junior programozói pozícióba.”
  • „Szuper volt, de tőlem ez nagyon távol áll. Bele akartam látni egy kicsit, miről is szól a programozás. Inkább CMS alapú weblapok szerkesztésével fogok foglalkozni a jövőben. Most már érteni fogom, hogy miről beszél majd a fejlesztő, ha marketingesként feladatot adok neki.”
  • „Tetszett az SE tanfolyam, ezért jelentkeztem az EE-re is. Még nincs vége, de már érzem, hogy már mennyi mindent tudok és persze mennyi mindent még nem.”

  • „Rugalmasak voltatok a szervezésnél. Jópofa volt, hogy egyszer előre megkaptunk 3 pici feladatot, ami a vasárnapi harangozás időtartamára készült, mert éppen nem volt másik szabad terem. Jó volt, hogy mindig előre egyeztettük az órák, Skype, tesztek időpontjait és nem volt gond egy-egy ünnep vagy ledolgozós szombat.”
  • „Először úgy gondoltuk (meg is szavaztuk), hogy jó lesz a csoportnak a heti két alkalom, keddenként és szerdánként. A 3. hét után átszerveztük, mert többen is szóltak, hogy „nem kapnak levegőt”. Ki is hagytunk egy hetet. Jó volt ez a rugalmasság és nem volt kőbe vésve az órarend.”
  • „Jó, hogy tudtunk hétvégén délelőttre is Skype időpontokat tenni, mert én például nem tudtam volna már koncentrálni, ha hétköznapon munka után este lett volna.”
  • „A korábbi tanfolyamon Dropbox mappát használtatok. Az új tanfolyamon sokkal jobb az ILIAS.”
  • „Mindig minden úgy történik, ahogyan megbeszéljük.”
  • „Jó hangulatúak voltak az órák. Mintha nem is tanfolyamon, hanem egy munkahelyen dolgoztunk volna kis csoportban. Ötleteltünk, megbeszéltük, közösen terveztünk.”

  • „A helyszín jól megközelíthető, de parkolni izgalmas a környéken. Érdemes figyelni, mert valami útfelújítás, építkezés, lezárás, terelés állandóan van valahol „epszilon sugarú környezetben, ahol epszilon alig nagyobb 3,14 méternél”. :-)”
  • „Olyan rendesek voltak a tantermesek, hogy a szombati felvonulás közben (megjegyzés: a Váci utca igen zajos volt) az ebédszünetben adtak egy másik termet az épület belső, csendes részében.”
  • „Az SE tanfolyamon még a Piarista Gimnáziumban voltak az órák és ott macerás volt a WiFi. Az EE képzés már átkerült a Pannon Kincstárba, ami sokkal jobb hely.”

  • „A Java SE tanfolyam után az EE jóval nehezebb volt. Olyan, mintha az A jogsi után az összes többi kategóriát is megszereztük volna.”
  • „Örülök, hogy elindítottátok a blogon az interjúsorozatot IT karrier témában. Ránézek majd minden hónapban.”
  • „A weboldal, a blog, az ILIAS-os tananyag mind-mind igényes és profi munka.”
  • „Sokat kell az órákon kívül is foglalkozni az anyaggal. Sok időt vesz igénybe a felkészülés két alkalom között a tesztre, illetve megoldani a kódolási feladatokat. A sikerélmény csak sok gyakorlással jön el.”
  • „A mikroközösségemben én vagyok a kocka. Az Agymenőkben Leonard azt mondja: „Sheldon, nem is vagy annyira kocka, inkább téglatest”. A csoportban voltak még nálam is kockábbak. Nem is egy. :-)”
  • „Könnyebb annak a programozás, aki jobb volt matekból, de azért nekem is ment.”
  • „Ravasz ez az ILIAS. Ha kitöltök egy tesztet, utólag mindig megmutatja, mi volt a helyes (mit kellett volna), de ezt is időkorlátosan teszi.”
  • „Korábban azt gondoltam, hogy a programozás one-men-show. A SCRUM tréningen és a vizsgafeladat megoldásánál tapasztaltam meg, hogy a programozók mennyire csapatjátékosok.”
  • „Hasznos, hogy a FB csoportban értesítést küldtök IT-s rendezvényekről. Elkezdtem járni a HWSW eseményeire.”

 

(A blog bejegyzést frissítettem, kiegészítettem a következő időpontokban:
2019. március 9., június 4.)