Výsledky vyhľadávania

pre ”java” sme našli 200 výsledkov

Články (16)

Všetky články
Java 8
Tipy a triky
19.09.2018
Skillmea

Java 8

Java 8 je veľký balíček novej funkcionality oproti Java 9 a java 10. Tie sú menšie a odzrkadľujú taktiku tvorcov javy vydávať nové verzie častejšie s menším balíkom novej funkcionality. V tomto článku si povieme najvýraznejšie zmeny z Java 8. Funkcionálne rozhraniaRozhranie, ktoré má len jednu abstraktnú metódu je považované za funkcionálne rozhranie. Pre lepšie načrtnutie v kóde môžeme a je odporúčané pridať anotáciu @FunctionalInterface.  import java.lang.FunctionalInterface;   @FunctionalInterface public interface FunctionalInterfaceExample {     void print(); }  Lambda výrazyOk, chceme pridať do javy možnosť definovať funkcionalitu bez toho aby patrila špecificky pod nejakú triedu. Tieto funkcie chceme vkladať do metód ako parametre. Čo spravíme? Tvorcovia javy sa asi takto nezamýšľali, ale my sme sa takto zamysleli a odpoveď je – použijeme lambda výrazy.  Každá lambda má ako typ funkcionálne rozhranie s jej odpovedajúcou metódou. V príklade vyššie máme rozhranie s metódou print. Táto metóda nevracia nič a neprijíma žiadne parametre. Musíme vytvoriť aj taký lambda výraz – teda nebude obsahovať return a nebudeme mať žiadne návratové hodnoty.  () -> System.out.println("Hello Word")Takto vložíš lambda výraz do metódy:  printHelloWord(() -> System.out.println("Hello Word"));Samotná metóda prijíma na vstupe práve dané funkcionálne rozhranie:  public void printHelloWord2(FunctionalInterfaceExample printHello)Viac o lambda výrazoch sa dozvieš z môjho online kurzu Java pre pokročilých, videá o lambda výrazoch sú zadarmo. StreamsStreamy poskytujú zjednodušenú prácu s dátovými kolekciami. Poskytujú viacero užitočných metód ako sú napríklad filter, sorted, map a iné. Ak stream préjde cez všetky elementy v kolekcii, tak bude prázdny. Teda ak chcem znovu použiť ten istý stream, tak zbytočne, lebo tam už nebudú dáta. Musíš si vytvoriť nový stream.  Nový stream vytvoríš napríklad pomocou stream metódy nad kolekciami.  List<Osoba> osoby = Arrays.asList( null, new Osoba("Jaro", "Beno", 30), new Osoba("Peter", "Kridlo", 55), new Osoba("Karol", "Otko", 18), new Osoba("Karol", "Beno", 18), new Osoba("Peter", "Otko", 20), new Osoba("Fedor", "Ronald", 84) ); osoby.stream();Máš zoznam osôb a chceš z daného zoznamu získať všetky veky osôb starších ako 50 rokov a majú byť zoradené podľa veku. Čo spravíš? Použiješ stream a jeho metódy – tieto metódy akceptujú funkcionálne rozhrania, teda tam dáš lambda výrazy.  List<Integer> veky = osoby.stream() .filter(osoba -> osoba.getVek() < 50) .sorted(Comparator.comparing(Osoba::getVek)) .map(Osoba::getVek) .collect(Collectors.toList());Kolekcie, ktoré sú iterovateľné, majú metódu forEach – ktorá získa stream a prejde všetky elementy.  veky.forEach(System.out::println);   Method referencePo slovensky referencia na metódu. Všimni si príklad z hora: Osoba::getVek. Znamená to, že z triedy Osoba použi metódu getVek. To isté sa dá zapísať aj pomocou lambda výrazu takto osoba -> osoba.getVek(). Ale pomocou referencie si to zjednodušíme lebo java vie, aký je vstupný parameter – je to osoba a vie, že voláš getVek. Tak stačí napísať Osoba::getVek. Metódu voláš bez zátvoriek.  Ďalší článok o Jave už čoskor. Prihlás sa k odberu noviniek a nezmeškaj žiadný nový blog.   
Java Files, Path, čítanie zo súboru
Vzdelávanie
17.09.2020
Skillmea

Java Files, Path, čítanie zo súboru

File I/O (Featuring NIO.2)Vo verzii 7 prišiel nový balík java.nio, v ktorom je nanovo urobené to, čo bolo v java.io. Chceš vedieť, ako čítať súbory (java read file)? Tak musíš vedieť, čo je to Path a Files. Môžeš používať obidva balíky. Musíš si ale dávať pozor na to, že ak pracuješ na projekte, kde sa používa java 6 a prípadne nižšie, tak ti nepôjdu tieto nové veci. Ale uvažujme, že na takýchto starých projektoch nepracujeme a budeme si vysvetľovať veci s použitím tohto nového balíka.  Budeme si hovoriť o základných triedach Path a Files, budeme manipulovať so súbormi a priečinkami a tak podobne. Tu je zaujímavý link porovnania funkcionality spomenutých balíkov a aké chyby mala java.io: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping PathJednoducho povedané je to linka na súbor alebo na priečinok v danom operačnom systéme. Súbory sú hierarchicky uložené. Vo windowse je na vrchu označenie disku napríklad C:\home\skuska. V linuxových systémoch je root začínajúci lomítkom / napríklad /home/skuska. Tu môžeme vidieť, že vo windowse a v linuxe sa používajú úplne iné oddeľovače. Na to treba pamätať. Relatívna a absolútna cestaAbsolútnu cestu môžeme chápať ako úplnú celkovú adresu alebo cestu na súbor alebo priečinok.  C:\home\skuska je absolútna cesta, ktorá vždy obsahuje root, teda v tomto prípade označenie disku C:. Ak by som ale napísal len home\skuska\text.txt – tak vidím, že sa snažím pristúpiť na súbor text.txt, ktorý je umiestnení v priečinku home a skuska. Ale kde sa nachádza priecinok home? Bez ďalších informácii to neviem a to je relatívna cesta.  Trieda PathZákladná trieda v tomto balíku – používa sa aby uchovávala informácie o názve súboru, priečinkoch ktoré sú použité na skonštruovanie cesty aby bolo možné lokalizovať dané dokumenty alebo priečinky. Path na windowse je bude odlišná od Path na unixe.  Ak hovoríme o triede Path, tak môžeme v jednoduchosti povedať, že môžeme manipulovať s cestou, ktorá vedie k priečinkom alebo súborom.  Trieda FilesTáto trieda slúži na manipuláciu s priečinkami a súbormi. Používa triedu Path.  Keď pristupujeme k súborom alebo celkovo ku zdrojom na disku – tak sú „otvorené“. Potom s nimi pracujeme a keď už s nimi nepracujeme tak musíme zavolať „uzatvorenie“ práce s týmito zdrojmi aby ich mohol používať niekto iný.  Na automatické uzatvorenie môžeme použiť try-with-resources.  Práca so súbormiMáš Path inštanciu, ktorá reprezentuje súbor alebo priečinok. Teraz ale ešte stále nevieš, či reálne tento súbor alebo priečinok existuje, či sa dá z neho čítať, či sa dá do neho zapisovať a podobne. Existuje subor alebo neexistuje, môžem k nemu pristúpiť? Path path = Paths.get("C:\\work\\tools\\Apache Software Foundation\\Tomcat6\\logs\\service-install.log");  System.out.println(Files.exists(path));  System.out.println(Files.notExists(path));  isReadable(Path)  isWritable(Path) isExecutable(Path) Sú to rovnaké súbory? isSameFile(Path, Path)  mazanie súboru Files.delete(path);  Vyhodí to výnimku prečo sa to nepodarilo ak sa to nepodarilo. Metoda deleteIfExists(Path) tiež zmaže súbor ale ak súbor neexistuje tak sa nevyhodí výnimka.     kopírovanie súboru Files.copy(source, target, REPLACE_EXISTING);Do metody sa dajú dať varargs options. StandardCopyOption a LinkOption enums sú podporované. Všimni si, že ak dáš ctrl a click na copy metodu, tak je tam CopyOption... options. Potom klikni ctrl na copy option a zistíš že je to len interface ale v popise máš napísane, že vieš použiť StandartCopyOption čo implementuje CopyOption.[Image] Tu si môžeš pozrieť implementácie CopyOption rozhrania.  Ak kopíruješ súbor na miesto kde sa takýto súbor už nachádza, tak sa súbor neprepíše ak nezadáš option REPLACE_EXISTING.  Priečinky sa dajú tiež kopírovať ale skopírujú sa prázdne  aj keď v nich bol nejaký súbor.  Čítanie sú súboru (read from file)Konečne sme prišli na kus kódu, vďaka ktorému môžeš čítať zo súboru (read from file):  Path path = Paths.get("C:\\work\\tools\\Apache Software Foundation\\Tomcat6\\logs\\service-install.log"); List<String> lines = Files.readAllLines(path);
JavaScript developer Adam odporúča študovať online
Success stories
20.04.2017
Martina Baumann

JavaScript developer Adam odporúča študovať online

Stretli sme sa na našom prvom meetupe. Adam Ilčišák síce nie je veľký fanúšik networkingových akcií, ale pokecať s nami si prišiel rád. A my sme sa s ním porozprávali, vymenili si skúsenosti a niečo z toho teraz prinášame aj vám. Čítajte v nasledujúcich riadkoch. Na začiatok začnime tvojou prácou. Čo presne robíš, aká je tvoja pozícia?   Som junior JavaScript developer v spoločnosti Accenture. Som tam ešte len tri mesiace, čiže zatiaľ som toho veľa nestihol, ale som na internom projekte, kde vyvíjame aplikáciu vo frameworku Angular 2. A ako si k tomuto vôbec dostal? Čo ťa k tomu viedlo?  Tak, vyštudoval som politológiu. Vždy som mal ale v hlave nejaké svoje business projekty a vždy k tomu bolo treba nejakú appku alebo aspoň web. Tak som sa zháňal po nejakých programátoroch, ale zistil som, že také služby sú dosť drahé. Povedal som si teda, že sa naučím spraviť si web sám. A tak som popri inej práci intenzívne študoval a kódil. Nevytvoril som síce ešte nič, čo by bolo reálne použité, ale chytilo ma to tak, že som si povedal, že kým sa mi nepodarí rozbehnúť niečo svoje, tak toto chcem robiť. Máš nejaký vzor, ktorý ťa inšpiruje? Osobu, ktorá je pre teba motivátorom?  Nemám konkrétnu osobu, ktorá by má inšpirovala, ale mám rád príbehy úspešných ľudí. Myslím, že z každého si môže človek niečo vziať. Kde berieš inšpiráciu pre svoju prácu? Máš nejaké tipy, ktoré zaručene fungujú?  V korporácií tej motivácie zas toľko nepotrebujem. Kódim, čo mi povedia že mám nakódiť :) V tejto oblasti je potrebné sledovať aktuálne trendy, inovácie. Ako si na tom ty? Stíhaš to všetko popri práci?  Ani neviem, či sa to všetko dá reálne stíhať. Som veľmi rád, že dnes sa už programovaniu venujem na full-time a je určite ľahšie sledovať trendy, pretože s tým robím na dennej báze. Popri bývalej práci som to ale vôbec nestíhal a aj teraz mám pocit, že sa to všetko mení veľmi rýchlo. Mám taký hrubý prehľad, ale detailne sa zameriavam iba na to, s čím aktuálne robím - momentálne teda na frontend a Angular. Čo ťa najviac baví na tvojej práci? Máš nejaký obľúbený task, ktorý robíš najradšej?  Najviac sa mi páči, že sa učím veľa praktických veci, ktoré sa dajú reálne použiť aj na vlastné projekty. Zároveň ma práca ako taká veľmi baví, pretože jej výsledkom je reálny produkt. Dnes je obrovský dopyt po programátoroch. Čo by si poradil všetkým, ktorí nemajú žiadne skúsenosti, ale chceli by nejako začať?  Poradil by som, aby sa vykašľali na knihy. Ja knihy milujem a je to taký starý zvyk, či model, že keď sa chce človek niečo naučiť, tak potrebuje mať knihy a v nich niečo študovať. Pri programovaní to však podľa mňa neplatí. Ja som začal s knižkou a trápil som sa s notepadom a prepisovaním kódu. Knižka bola stará dva roky, ale pri programovaní sa za dva roky zmení dosť veľa vecí. Online je obrovská komunita ľudí, ktorí radi pomôžu, online nájde človek vždy najnovšie informácie a diskusie k rôznym problémom, tiež množstvo študijných materiálov a videí. IT je všeobecne vnímané ako veľmi špecifická oblasť. Aký je tvoj názor?  Nemyslím si, že je to zase tak špecifická oblasť - v súčasnosti si skôr myslím, že je to už niečo úplne bežné. Mal si niekedy pocit, že to nezvládneš? Bolo obdobie, kedy si chcel skončiť a robiť niečo úplne iné?  Zatiaľ nie. Občas mám pocit, že sa toho musím ešte strašne veľa naučiť a že je predo mnou dlhá cesta, kým budem patriť medzi špičku, ale som pripravený na sebe makať.    Cítiš na Slovensku silnú konkurenciu v tom, čo robíš konkrétne ty? Musíš mať „ostré lakte“?  Zatiaľ nemôžem povedať, že by som cítil silnú konkurenciu. Som začiatočník a s veľmi obmedzenými schopnosťami a vedomosťami som si našiel prácu v tomto odvetví. Takže skôr by som povedal, že cítim dopyt po pracovnej sile.  Aké sú tvoje plány do budúcnosti?  To je tajné.[Image] Vďaka za rozhovor Adam. Páčil sa ti rozhovor? Venuj mu 👍  Ak máš na Adama nejakú otázku, napíš ju dole do komentára 👇  
Java persistence – JPA, Hibernate, ORM
Tipy a triky
05.02.2019
Skillmea

Java persistence – JPA, Hibernate, ORM

JPA je java persistence api špecifikácia. Na to, aby si mohol používať JPA v skutočnej aplikácii, potrebuješ implementáciu JPA. Buď použiješ servery, ktoré už ponúkajú implementáciu JPA, ako napríklad GlassFish, alebo použiješ implementáciu, ktorú ti poskytuje framework Hibernate alebo EclipseLink. Ak používame JPA štandardy, tak je v budúcnosti úplne jedno, akú implementáciu JPA budeme používať. Pri programovaní budeme používať JPA anotácie, ktoré pochádzajú z balíka javax.persistence. V budúcnosti môžeš nasadiť aplikáciu na GlassFish, ktorý pozná javax.persistence a vie s tým pracovať alebo na Tomcat s použitím Hibernate, ktorý tiež pozná javax.persistence a vie s tým pracovať.  Čo je Persistence?Ak vytvoríš hocijaký jednoduchý objekt, čo sa stane? Napríklad objekt Adresa? Vytvorí sa v halde – v pamäti. Objekt môže mať nasetované nejaké dáta – informácie. Ak sa ale stratí referencia v javovskom kóde na tento objekt v halde – tak sa zmaže.  Ak si chceme uchovať tieto informácie, tak ich môžeme uložiť do databázy a najlepšie, aby po vytiahnutí z databázy mali tieto dáta tú istú formu – teda formu objektu Adresa.  Tomuto sa hovorí, že persistujeme (uchováme stálosť) objekt do databázy. Akoby tento objekt existoval aj mimo java programu. Tento objekt sa uchová v úložisku a znovu sa vytvorí, ak bude treba.  Čo je ORM?Klasické databázy ako Oracle, MySql a podobne sú relačné databázy, ktoré majú dáta uložené vo forme tabuliek. V jave ukladáme dáta vo forme objektov, v databáze vo forme tabuliek. Ale čo majú podobné? V relačnej databáze máme stĺpce, ktoré majú názvy a v riadkoch máme hodnoty. Niečo ako klúč hodnota – to isté platí aj pre objekty v jave – tam máme názov premennej a hodnotu v nej uloženú.  Tu prichádza pod ruku ORM – teda object relational mapping. Je to niečo ako objektovo relačné mapovanie. My naše java objekty namapujeme na tabuľky relačnej databázy. Aby sme vedeli, že tento field v javovskom objekte patrí do tohto stĺpca.   Objekty v jave sú medzi sebou prepojené pomocou uloženia referencie na daný objekt. Napríklad človek má field Adresa, kde je uložená referencia na objekt Adresa.  Relačné tabuľky majú medzi sebou tiež väzby. Buď máme v tabuľke pre človeka stĺpec adresa, kde bude uložený identifikátor adresy a na základe tohto identifikátora nájdeme danú adresu. Alebo existuje špeciálna tabuľka, kde budú dva stĺpce jeden pre identifikátor adresy a druhý pre identifikátor človeka. My potom vieme nájsť, aké adresy má človek nastavené, alebo pre akého človeka je nastavená daná adresa.[Image] Problém s JDBC prístupom – výhoda ORMV kurze Java pre pokročilých, ak si tento kurz videl, sme si ukazovali prístup k databáze cez JDBC. Čo sme spravili? Otvorili sme konekciu na databázu, napísali sme sql príkaz, ktorý sme následne poslali do databázy na vykonanie. Databáza nám vrátila výsledok vo forme result setu.  Predstav si, že máš len 5 až 10 tabuliek. Nad každou tabuľkou máš napríklad 4 rôzne sql príkazy – to máme približne 20 – 40 sql príkazov. Ak sa ti stane, že musíš zmeniť databázu – napríklad zmeníš názov stĺpca v tabuľke? Čo musíš spraviť? Musíš prepísať názov tohto stĺpcu na xy miestach – na 20 až 40 miestach – a to sme len v malej aplikácii – čo ak by to bolo na 100 miestach?.  Bol by v tom neporiadok a mohli by nastať problémy.  Ak ale použijeme ORM, tak v jave pracujeme s naším kódom, tak ako bežne. Vytvoríme si objekty typu Clovek, nastavíme mu nejaké hodnoty. Ďalej si vytvoríme kolekciu Adries pre daného človeka. Nakoniec v ORM frameworku povieme len persistni mi tento objekt. ORM sa potom postará o všetko uloženie týchto objektov do databázy na základe mapovania, ktoré mu poskytneme.  Clovek clovek = new Clovek(); clovek.setMeno("Jaro"); clovek.setPriezvisko("Beno"); Adresa adresa1 = new Adresa(); adresa1.setUlica("Nejaka 5"); adresa1.setPSC("94404"); Adresa adresa2 = new Adresa(); adresa2 = new Adresa(); adresa2.setUlica("Nejaka 5"); adresa2.setPSC("94404"); List<Adresa> adresaList = Arrays.asList(adresa1, adresa2); clovek.setAdresaList(adresaList); orm.persist(clovek); Ak by sme nepoužili ORM, sami by sme museli napísať metódu, ktorá nám otvorí konekciu na databázu, museli by sme napísať INSERT SQL príkaz pre človeka a potom aj pre jeho adresy a museli by sme zabezpečiť, aby sme nastavili všade dáta tam kde majú byť a musíme sa postarať aj o prepojenia medzi týmito dvoma objektami.  Ak ale použijeme ORM, tak sa nemusíme starať o tento balast kódu, ale sústrediť sa najmä na to, čo predáva a to je business logika aplikácie.  Nevýhody JDBC prístupu sú teda, že máme príliš veľa SQL príkazov, veľmi veľa kópie kódu, ručne sa musíme postarať o nastavenie dát do správnych stĺpcov.  Výhodou ORM je, že nemusíme robiť tieto veci z predchádzajúcej vety. ORM nám umožní používať java objekty na reprezentáciu relačnej databázy. ORM sa nám postará aj o prepojenie závislostí. ORM spojí výhody relačnej databázy a objektového modelu v jave plus schová všetku komplexitu SQL príkazov.  Čo je Hibernate? Hibernate je ORM – object relational mapping framework, ktorý slúži na mapovanie java objektov na tabuľky relačných databáz.  Java programátori sú zvyknutí písať kód v objektoch, prečo teda potrebujú ďalší jazyk – sql – na získanie dát z databázy? Hibernate na pozadí sám vytvára sql príkazy nad databázou a preto nemusíme písať sql príkazy my.  Ak chceme uložiť mapu objektov, napríklad Cloveka, ktorý ma Adresu, alebo aj viac objektov typu Adries, tak nemusíme písať všetky sql príkazy. Stačí, ak zavoláme jednoduchú metódu na uloženie objektu do databázy a hibernate sa postará o zvyšok.  Hibernate je aj implementácia JPA. [Image] Čo je JPA?Skratka JPA je Java Persistence API. Čo to znamená? V jednoduchosti povedané – je to štandard. Trošku zložitejšie povedané – je to špecifikácia pre OR mapovanie a je súčasťou Java EE, ale môžeme ju používať aj v Java SE projektoch.  Niektoré servery poskytujú vlastnú implementáciu JPA a niektoré nie – v tom prípade použijeme napríklad Hibernate implementáciu.  Predstav si, že celý tvoj kód používa veci z JPA. Teraz je na tebe, kam nasadíš svoju aplikáciu. Ak ju nasadíš na Glassfish nemusíš prerábať svoj kód, ktorý používa JPA – Glassfish ho pozná. Ak svoju aplikáciu nasadíš na Tomcat, tak mu prihodíš Hibernate, ktorý tiež pozná JPA. Potom tvoj kód bude fungovať všade – lebo používa štandardy JPA.  Je možné aby sme používali len Hibernate – teda by sme nepoužívali nič zo štandardov. Žiadne anotácie z javax.persistence a podobne – to ale neodporúčam.  Pýtal som saNapadlo mi, že by nebolo od veci spýtať sa kolegov developerov, čo si myslia o JPA a Hibernate. Ak by si si chcel prečítať ich názory, nech sa páči – bez cenzúry, citujem:  Tak toto je náročná téma a navyše zložitá.  JPA resp. ORM všeobecne (a teda aj Hibernate) sú vždy zložitejšie, než si používatelia (t.j. vývojári) uvedomujú. Výsledkom sú často nenápadné chybičky, lazy load exceptions, ktoré vedú k anti-patternom ako je OSIV (open session in view) alebo k výkonovým problémom (n+1 problem).  Týchto problémov je typicky o to viacej, o čo zložitejšie je mapovanie – a pritom práve na riešenie zložitého mapovania bolo ORM vymyslené. Aby sme mohli namapovať doménu do DB. Na to, sa často používajú aj “mimojazykové” triky ako reflection na private polia, takže objekty sú implicitne zviazané s ORM riešením, aj keď napr. mapovanie je oddelené do XML namiesto anotácii, čo samo o sebe je tiež nepraktické.  Okrem toho majú obe hlavne implementácie dosť bugov na to, aby na ne človek narazil, aj keď postupuje v súlade so špecifikáciou – stačí len chcieť trosku viacej a na nejaký bug určite narazíte. Takže potom to je kľučkovanie medzi bugmi a často komplikovaná možnosť vymeniť ORM providera.  Čo sa mi na ORM páči je lepšie mapovanie typov, možnosť customizovať mapovanie a podobne. Preto používam JPA aj na jednoduché mapovačky namiesto JDBC.  Navyše s JPA používam rad Querydsl, ktoré je lepšie/intuitívnejšie, než JPA štandardné Criteria API.  Hibernate používam dlho ale pravdu povediac nikdy som sa veľmi nezamýšľal nad výhodami. Zatiaľ som nemal výraznejší problém, ktorý by som nevedel vyriešiť, prípadne nejako obísť.  Plusy:  - ľahko sa robí mapovanie do DB s anotáciami aj pre začiatočníka bez veľkých znalostí databázy, zároveň ale bez znalosti DB môže byť mapovanie neefektívne  - je open source, takže ak potrebujem, viem pozrieť zdrojáky ako funguje  Mínus:  - asociácia OneToOne fetch=lazy nefunguje  Na používaní Hibernate/JPA (celkovo ORM vrstve) sa mi páči:  A) Abstrakcia od fyzického dátového modelu. Vývoj nad doménovým/logickým (entitno-relačným dátovým modelom) - bližšie k biznis vrstve. Čiže zjednodušené práca s objektami namiesto tabuliek.  B) Možnosť využívať rôzne pokročilejšie techniky získavania dát (napr. Spring Data JPA, ale aj zjednodušujúce Hibernate Query by example)  C) Agnostické od konkrétnej databázovej technológie (Oracle, MySql, ...)  D) Cachovanie a optimalizácia (napr. lazy loading)     Nevýhody:  A) Niekedy náročný (až nemožný) performance tuning.  B) Pri niektorých technológiách pomalšia krivka učenia.  C) Aj napriek používaniu JPA/Hibernate, je takmer nevyhnutné, aby developer poznal aj (native) SQL jazyk a jeho použitie.  ZáverPodarilo sa ti nazrieť do problematiky objektovo relačného prístupu k databáze a pochopil si, čo to znamená. Ak sa však chceš dostať ešte o level ďalej, pripravili sme pre teba samostatný kurz Java persistence – JPA a Hibernate. Ak chceš ešte viac, tak klikaj:👍 Viac o mne: http://www.jaroslavbeno.sk/  👍 Kurzy (java, git, maven, bootstrap, Asp .Net,): Learn2Code moje kurzy 👍 Free kurzy: YouTube kanál JaroslavBeno
Java 10 a 11 – vybrané programátorské zmeny
Tipy a triky
22.05.2019
Skillmea

Java 10 a 11 – vybrané programátorské zmeny

Zaujíma ťa, aké zmeny sa udiali v Java 10 a 11? Čítaj článok a všetko podstatné sa dozvieš. Java 10Var Od verzie 10 je dostupná možnosť nešpecifikovať typy premenných pre lokálne premenné, ak ich vie kompilátor zistiť z pravej strany. Namiesto napísania typu stačí napísať nešpecifikovaný typ a to var. var list = new ArrayList<String>(); Kompilátor vie zistiť, akého typu je list a teda nie je možné pridávať čísla do listu, ale iba String. var list = new ArrayList<String>(); list.add("Jaro");Var sa neberie ako kľúčové slovo, ale ako nešpecifikovaný typ. Teda nemôžeme vytvoriť triedy s názvom var, ale je možné vytvoriť metódu s názvom var. //error String return(){ return ""; } //ok String var(){ return ""; }Nová metóda na kolekciách Pri kolekciách pribudla metóda copyOf, ktorá skopíruje jednu kolekciu do druhej. List<String> list = List.of("Jaro", "Fero", "Duro"); Set<String> set = Set.copyOf(list); List<String> listCopy = List.copyOf(set); Map<Integer,String> map = Map.of(1,"Jaro",2,"Fero"); Map<Integer,String> map2 = Map.copyOf(map);Java 11Var v lambda výrazoch Lambda výrazy podporujú type inferenciu, čo znamená, že ak používaš premennú v lambda výraze, tak java kompilátor vie zistiť, akého je typu a nemusíme typ zadefinovať. list.stream() .map(s -> s.toLowerCase()+".") .collect(Collectors.toList());V predchádzajúcich verziách javy sme nedokázali písať anotácie k premenným vo vnútri lambda výrazu, ktoré nemali zadefinovaný typ. Od verzie 11 je to možné, skoro – nemusíme zadefinovať špecifický typ, stačí ak napíšeme var. list = list.stream() .map((@Notnull var s) -> s.toLowerCase()+".") .collect(Collectors.toList());Jednoduchšie spustenie programuAk si napíšeš jednoduchý program a chceš ho spustiť v konzole, tak ho musíš najprv skompilovať cez príkaz javac a potom spustiť cez príkaz java.  Teraz stačí, keď rovno spustíš .java súbor pomocou java príkazu. Stane sa to, že sa automaticky súbor skompiluje a spustí.  java Main.java  java.lang.String metódyV triede String pribudli nové metódy.  isBlank() – vracia true, pokiaľ je reťazec prázdny alebo obsahuje len biele znaky  lines() – zo Stringu sa vráti stream riadkov – ak stream obsahuje oddeľovače riadkov  java.util.function.Predicate not Predstavme si takýto kód: lines.stream() .filter(s -> !s.isBlank())Pomocou Predicate.not vyzerá krajšie a čitateľnejšie: list.stream() .filter(Predicate.not(s -> s.isBlank()));S výhodou použitia method referencie:  list.stream() .filter(Predicate.not(String::isBlank));Ak použijeme statický import: list.stream() .filter(not(String::isBlank));Ak ťa zaujal článok a chcel by si sa dozvedieť viac, tak klikni na moju stránku a presuň sa na to, čo ťa zaujíma. Programovanie, kurzy, videá zdarma a iné záležitosti. Klikaj na www.jaroslavbeno.sk
Kotlin vs. Java - menej kódu
Vzdelávanie
06.01.2020
Skillmea

Kotlin vs. Java - menej kódu

Kotlin a Java sú kompatibilné programovacie jazyky. V tom zmysle, že ak skompilujeme Java kód, tak sa vytvorí bytecode v súbore .class. Ak skompilujem Kotlin kód, tak sa vytvorí bytecode v súbore .class. Teda, či pracuješ v Kotline alebo v Jave, tak nakoniec budeš mať kód, ktorý si bude rozumieť a ktorý dokáže bežať tam, kde dokáže bežať JVM – java virtual machine.  V tomto článku vám chcem ukázať to, prečo bol Kotlin vytvorený – aby nám čo najviac zjednodušil písanie kódu. Predstav si, že chceš napísať triedu Auto. Tá má fieldy názov a počet dverí. Tieto fieldy budú private a final – teda po prvom nastavení ich nemôžeš zmeniť. Prístup k týmto fieldom môžeš spraviť len cez public get metódu. Zároveň, vieš zostrojiť auto tak, že mu zadáš len názov. Ak bude zadaný len názov, tak počet dverí bude automaticky 4. Ak zadáš názov a počet dverí, tak sa fieldy nastavia tak, ako sme to zadali v konštruktore. Kód v JaveTakto bude vyzerať kód napísaný v Jave: public class Auto { private final String nazov; private final int pocetDveri; public Auto(String nazov) { this(nazov,4); } public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; } public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; } }Najprv máme dva privátne final fieldy: private final String nazov; private final int pocetDveri;Potom konštruktor, ak chcem vytvoriť objekt auto len pomocou názvu: public Auto2(String nazov) { this(nazov,4); } Konštruktor, ak chcem vytvoriť auto a nastaviť názov a počet dverí: public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; }A nakoniec get metódy, aby sme mali prístup k daným fieldom: public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; }Ako to spravím v Kotline?Potrebujem tento kód: class Auto (val nazov: String, val pocetDveri: Int = 4) { }To je všetko, tých 20 riadkov v Jave je jeden riadok kódu v Kotline. Za Auto sú zátvorky – to je primárny konštruktor, v ktorom sa nastavujú takzvané property.  Prvá property je nazov, ktorá je val – val znamená, že hodnota sa nemôže neskôr meniť. Druhá property má nastavené = 4, to znamená, že ak chcem vytvoriť auto len zadaním názvu, tak sa automaticky pocetDveri nastaví na 4. Takto vytvorím Auto zadaním oboch property a pod tým je prístup k property cez bodku: val skoda = Auto("Skoda", 5) skoda.nazov skoda.pocetDveriVytvorenie auta len s názvom: val auticko = Auto("Skoda")Záver Páči sa ti tento prístup? Chceš vedieť viac o programovacom jazyku Kotlin? Sleduj Learn2Code a verím, že nájdeš čo hľadáš. Pripravovaný kurz o Kotline zverejníme už čoskoro.
Novinky v Java 15
Vzdelávanie
14.04.2023
Skillmea

Novinky v Java 15

Najnovšia verzia Java je Java 20 alebo JDK 20 vydaná 21. marca 2023. JDK 17 je najnovšia LTS platformy Java SE. Postupne si budeme predstavovať zmeny v Jave od verzie 15 a v tomto článku si predstavíme hlavné programátorské zmeny vo verzii 15. Text BlocksO tejto funkcionalite sme už rozprávali. Teraz je však táto funkcia zaradená ako štandard a nie ako preview funkcionalita. Napriek tomu si to znovu vysvetlíme, ak si napríklad túto časť preskočil v minulosti hlavne kvôli preview statusu.  Funkcia Text Blocks umožňuje zápis viacriadkových reťazcov (texty) jednoducho. Týmto spôsobom je možné zapisovať ľahšie čitateľné reťazce, ktoré obsahujú viac riadkov alebo formátovaný text. Text Blocks začínajú a končia trojitými úvodzovkami ("""") a môžu obsahovať text, ktorý je rozdelený do viacerých riadkov bez potreby zadávať znak nového riadku /n. Java tu  zohľadňuje nové riadky a na pozadí automaticky odstraňuje nadbytočné biele znaky (medzery, tabulátory) na začiatku riadkov. Ako sa správa to automatické odstraňovanie? Pozrime sa na príklad: String html = """ <html> <body> <p>Hello, World!</p> </body> </html> """;Jednoduchý kúsok HTML. Ak si všimneš, tak tag <html> je od pravej ľavej strany odsadený. Je tam viacero bielych znakov. Keď tento text budeš používať ďalej, tak tieto biele znaky budú odstránené. Na ďalších príkladoch si všimni ako sa pohybuje zelená zvislá čiara. Podľa nej zistíš ako sa odstraňujú biele nadbytočné znaky.  [Ukážka kódu][Ukážka kódu][Ukážka kódu] Nakoniec si daj pozor, aby tvoj text nezačínal na riadku prvých trojitých úvodzoviek, lebo to by bol chybný zápis. Za prvými trojitými úvodzovkami musí byť nový riadok. [Ukážka kódu]Ďalšie príklady: String json = """ { "id": "1", "name": "Jaro", "age": "35" } """;  String sql = """ SELECT id, name, age FROM users WHERE age > 10 """;Formátovanie textu: String formattedText = """ Id: %d Name: %s Age: %d “”".formatted(“1”, “Jaro”, “35”);RecordsJava Records boli uvedené už v Jave 14 ako skorý preview. V Jave 15 boli nejaké zmeny a vylepšienia. Poďme si povedať, čo sú tie Java Records. V Jave 15 je táto funkcionalita stále v preview móde. Records je nový druh tried, ktoré slúžia na zjednodušenie práce s dátovými triedami. To sú triedy, ktoré majú slúžiť ako jednoduchý nositeľ informácie. Tieto triedy automaticky generujú konštruktory, metódy equals, hashCode a toString bez nášho zašpecifikovania. Príklady Vytvorenie record: public record User(int id, String name, int age) {} Použitie: User user = new User(1, "Jaro", 35);System.out.println(user.name()); // Výstup: Jaro Je to rozdiel oproti klasickej definícii triedy, kde si musel zašpecifikovať konštruktor a get metódy. Je to kratšie a prehľadnejšie. Ďalšie príklady: record Employee(String name, int id) {} Employee employee = new Employee("Janka", 534); String name = employee.name(); int id = employee.id();Máme možnosť zadefinovať vlastný konštruktor. Napríklad ak chceme urobiť nejaký test nad vstupnými dátami:  record Adult(int age, String Name) { public Adult { if (age < 18) { throw new IllegalArgumentException("Must be adult."); } } } Adult validAdult = new Adult(35, "Jaro"); Adult invalidRange = new Adult(10, "Fero"); // exceptionMôžeme pridávať metódy:  record Circle(Point center, double radius) { double area() { return Math.PI * radius * radius; } } Circle circle = new Circle(new Point(0, 0), 5); double area= circle.area(); Pattern Matching for instanceof je funkcia, ktorá bola zavedená v Jave 15 ako druhá fáza návrhu (preview feature). Táto funkcia zjednodušuje testovanie typu objektu a získavanie hodnoty z objektu.  Pattern MatchingPattern Matching je znovu predstavený v statuse preview. Umožňuje kombinovať overenie typu a pretypovanie do jedného kroku, čo zlepšuje čitateľnosť a zjednodušuje kód. Všimni si, že v podmienke sme predstavili premennú s typu String. Táto sa nazýva binding variable. Object obj = "Hello, World!"; if (obj instanceof String s) { System.out.println("Length: " + s.length()); } else { System.out.println("Not a string"); }V minulosti to vyzeralo takto:  Object obj = "Hello, World!"; if (obj instanceof String) { String text = (String) s; System.out.println("Length: " + s.length()); } else { System.out.println("Not a string"); } Ďalšie príklady: Object data = List.of("one", "two", "three"); if (data instanceof String s) { System.out.println("Length: " + s.length()); } else if (data instanceof List<?> list) { System.out.println("Size: " + list.size()); } Object obj = 3.14; if (obj instanceof Integer i || obj instanceof Double d) { System.out.println("Number: " + obj); } else { System.out.println("Not a number"); }Sealed ClassesSealed Classes je v Jave 15 ako preview. Sealed Classes umožňujú obmedziť rozsah dedenia tried. Týmto spôsobom môžeš kontrolovať, ktoré triedy môžu dediť od tejto triedy. Sealed Classes sú často používané v kombinácii s pattern matchingom. Majme sealed triedu: sealed class Shape permits Circle{}  Trieda, ktorej povoľuje dedenie musí byť final. final class Circle extends Shape { ...} final class Rectangle extends Shape { ...}   Teraz sme povedali, že od triedy Shape môže dediť len Circle. Pri iných triedach, ktoré by sa pokúsili dediť od triedy Shape bude chyba is not allowed in the sealed hierarchy. Tento princíp vieme využiť napríklad takto: double calculateArea(Shape shape) { return switch (shape) { case Circle c -> Math.PI * c.getRadius() * c.getRadius(); case Rectangle r -> r.getWidth() * r.getHeight(); }; } Na vstupe máme Shape a vieme, že od neho môže dediť len Circle a Rectangle. Hidden ClassesPre bežného používateľa nezaujímavé a pravdepodobne to nikdy nevyužije. V skratke ide o to, že je možné vytvárať triedy zabehu aplikácie a nie sú viditeľné ani použitím reflexie.
Ako sa stať front end developerom. Plán pre budúceho JavaScript programátora
Vzdelávanie
26.03.2021
Skillmea

Ako sa stať front end developerom. Plán pre budúceho JavaScript programátora

Ľudia sa nás často pýtajú, ako sa stať frontend developerom, aké technológie by mali ovládať, čo všetko vedieť, kde začať a aká je správna postupnosť jednotlivých online kurzov. Na základe našich skúseností, rád od lektorov ako Yablko a ďalších, sme v tomto článku dali dokopy študijnú cestu budúceho frontend developera. Kurzy cez úrad práce alebo špecializované IT online kurzy môžu byť vynikajúcim odrazovým mostíkom. Frontend developer vs backend developer vs fullstack developerFrontend developer je človek, ktorý je zodpovedný za časti webovej aplikácie alebo webstránky, ktoré používatelia vidia a interagujú s nimi. Backend developer rieši všetko na pozadí – infraštruktúru, dátový model, databázy. Potom je tu fullstack developer, ktorý zvláda frontend aj backend a pokrýva celý proces návrhu webovej aplikácie. Na lepšiu predstavu sa môžeme pozrieť na programátorské meme.[Programátorské meme] Dnes sa hranica medzi frontendom a backendom stále viac stiera, čo znamená, že veľa úloh spadajúcich do backendu môže preberať front end developer. Preto je dôležité vedieť nielen základy, ale mať širší pohľad na technológie a funkcie. Úlohy frontend developeraFrontend developer sa venuje najmä týmto oblastiam: • rozhoduje o dizajne a štruktúre webstránok, • vyvíja funkcie na dosiahnutie vynikajúcej používateľskej skúsenosti, • dbá na responzivitu webstránky, • optimalizuje web pre rýchle načítanie a škálovateľnosť, • volí kombinácie technológií pre dosiahnutie najlepšieho výsledku. Zručnosti front-end developeraDobrý front end developer musí mať komplexné znalosti v oblasti vývoja webu. Mal by ovládať technológie ako HTML, CSS, JavaScript a ďalšie nástroje (čítaj ďalej v článku). Grafické zručnosti, ako práca s Photoshopom, Sketchom alebo Illustratorom, sú veľkým plusom. Základné znalosti SEO sú užitočné pri optimalizácii webstránok, a tiež dobré komunikačné schopnosti, pretože vývojári často spolupracujú s grafikmi, backend developermi, projektovými manažérmi či klientmi. Ak sa chceš naučiť viac o jednotlivých technológiách, web developer kurz je skvelou príležitosťou, ako naštartovať kariéru. Mzda frontend developeraPodľa portálu platy.sk na Slovensku zarába JavaScript programátor (prečo je táto pozícia vyhľadávaná, sa dozvieš nižšie) od 1.300 Eur do 2.900 Eur v závislosti od skúseností a praxe. Dobrí JavaScript programátori sú na trhu stále žiadaní, čo znamená, že ak sa rozhodneš stať frontend developerom, práca ťa určite neminie.[Mzda Front-end developera.] JavaScript je nesmierne populárny. Podľa rebríčka RedMonk je JavaScript na GitHube a Stack Overflow technológia číslo jedna. Ak na Profesii vyhľadáš pozície pre JavaScript alebo frontend programátorov, nájdeš stovky možností. A ak na LinkedIn uvedieš, že zvládaš JavaScript spolu s niektorým JavaScript frameworkom, môžeš očakávať správy od IT recruiterov. Tak sa pusť do toho a zisti ako sa stať programátorom s pomocou našich rád a kurzov cez úrad práce alebo iných IT kurzov. Ako sa stať frontend developerom?Nenechaj sa odradiť a choď za svojim cieľom. V texte nižšie sme vypichli podľa nás tie najdôležitejšie technológie, ktoré by si ako dobrý frontenďák mal ovládať. Poďme na to. “TL;DR: HTML, CSS a JavaScript sú chrbtovou kosťou frontend developmentu. Frontend development kombinuje práve tieto tri technológie a k tomu JavaScriptové frameworky (alebo knižnice).” Krok číslo 1: HTML a CSSToto je úplne prvá téma, ktorej by si sa mal venovať, pokiaľ máš v pláne byť frontend developerom. Je to alfa a omega celého frontend developmentu. HTML a CSS používajú všetky weby, všetky webové aplikácie. HTML a CSS ťa zadarmo naučí kurz Webrebel 1: HTML, CSS a JavaScript. Všetky videá o HTML a CSS sú k dispozícii zadarmo, stačí sa prihlásiť do kurzu. V tomto kurze sa naučíš aj dôležité veci o tom, ako vôbec internet funguje, ako fungujú prehliadače, čo je HTTP a HTTPS, DNS, JSON, XML a kopec ďalších skratiek, ktorým teraz možno nerozumieš, ale v procese tvorby webstránok sú to dôležité znalosti. A keď budeš pri CSS, venuj mu poriadne veľa času. Môže sa zdať, že je ľahké pracovať s CSS, ale na jeho zvládnutie je potrebného veľa času. Skús sa opýtať backend developera, prečo nie je frontendistom? Šanca, že ti odpovie, "Lebo neznášam CSS" je dosť vysoká. Sledovať videá nestačí a preto si určite počas ich sledovania rob domáce úlohy, ktoré v kurze sú. Urob si svoje vlastné portfólio, ponúkni sa svojim známym, že im spravíš webstránku, rob maličké projektíky len tak pre svoje potešenie a takto sa budeš zdokonaľovať a chytíš písanie kódu za pačesy.Ukážka HTML, CSS, JavaScript |Zdroj: https://moz.com/blog/javascript-seo [Ukážka HTML, CSS, JavaScript |Zdroj: https://moz.com/blog/javascript-seo] Krok číslo 2: píš lepšie CSSLepšie CSS sa naučíš písať napríklad vďaka preprocesorom. Známymi preprocesormi sú Sass, Less alebo Stylus. Preprocesor je program, ktorý spracuje kód v jednom formáte (napr. Sass) a zmení ho na kód v druhom formáte (CSS). Vďaka Sass vieš písať menej kódu a bude prehľadnejší.  Keď budeš robiť na webových projektoch, je dobré ovládať aj nejaký ten CSS framework. Najväčšími frajermi na tomto poli sú pravdepodobne Bootstrap a Foundation. Bootstrap je iniciatíva Twitteru a zaslúži si veľkú pochvalu za zavedenie responzívneho dizajnu vo veľkom meradle. Bol to prvý framework, ktorý podporoval filozofiu 'mobile-first'. Pomocou Bootstrapu vieš relatívne rýchlo vytvárať responzívne weby.  Ak je pre teba Bootstrap zbytočne obmedzujúci v tom, ako tvoj dizajn bude vyzerať, vyskúšaj CSS framework Tailwind 2. Je pre ľudí, ktorí chcú mať flexibilitu a tvoriť vlastný dizajn. Tailwind je intuitívny a moderný CSS framework, ktorý sa dá rýchlo naučiť. Krok číslo 3: trošku prikúrime - JavaScriptJavaScript bude pre teba ako frontend developera bezpochyby najdôležitejšou zručnosťou. Ako sa naučiť JavaScript? Logická odpoveď: začni základmi. Nebuď povrchný, ale ani v úvode nechoď do úplných detailov. Learning by doing je naše odporúčanie, keď sa učíš JavaScript: 1. Nauč sa základy JavaScriptu, 2. Nauč sa React, Vue alebo Angular, 3. Pochopíš, že nemáš dobré základy JavaScriptu, 4. Vráť sa k bodu 1. a nauč sa poriadne JavaScript. JavaScript je už niekoľko rokov po sebe najpopulárnejším programovacím jazykom, pozície vyžadujúce JavaScript pribúdajú ako huby po daždi. Keď budeš vedieť JavaScript, o robotu máš postarané. Yablko pripravil parádny kurz o modernom JavaScipte. Tento kurz ťa naučí písať moderný JavaScript, budeš vedieť jeho syntax (ES6 a ES7), aby si nepísal spaghetti code a pravidlá jazyka. Okrem toho, zvládneš nástroje ako package managers (správa závislostí) npm a yarn, skrotíš DOM, budeš vedieť používať nástroje ako Webpack a tak ďalej. V kurze je takmer 23 hodín materiálu o modernom JavaScripte, bude to fuška, ale výsledok bude stáť za to. Krok číslo 4: vyber si svoj osud - Vue, React, AngularKeď si zvládol predchádzajúce tri kroky, si pripravný naučiť sa pracovať s mocnými nástrojmi v podobe JavaScript frameworkov alebo knižníc. Aktuálne v roku 2021 sú najviac v kurze Angular, React a Vue. Nemusíš vedieť všetky, radšej jeden a poriadne. Každá z týchto technológií má svoje pre a proti a sú určené na komplexný vývoj frontendových webových aplikácií. Tieto frameworky sú si podobné a pokiaľ sa naučíš jeden, prejsť na iný framework nie je až také náročné. Poďme si teraz veľmi stručne predstaviť spomínané tri frameworky. Angular je vývíjaný spoločnosťou Google, prvýkrát bol vydaný v roku 2010 a je postavený na TypeScripte. Otcom Angularu je Slovák Miško Hevery. V roku 2016 bol predstavený výrazný update tohto frameworku - Angular 2, v rámci ktorého došlo aj k vypusteniu "JS" z názvu. Okrem Googlu samotného používajú Angular weby ako PayPal, Upwork, Microsoft a ďalšie. React je vyvíjaný ďalším gigatnom - Facebookom, ktorý ho okrem iného používa v aplikáciách Instagram či WhatsApp, na Reacte fičia aj weby Netflixu či Uber. Prvý release bol v roku 2013 a ide o JS knižnicu pre vytváranie používateľských rozhraní (UI).  Vue je najmladším JS frameworkom v tomto výbere. Vue za sebou síce nemá žiadnu veľkú firmu, ale tiež je používaný veľkými firmami, napr. Alibaba, Behance alebo GitLab. S príchodom Vue 3 v septembri 2020 prešlo Vue na TypeScript.JavaScript frameworks Angular, React, Vue. [JavaScript frameworks Angular, React, Vue]BONUSGitGit sa používa vo väčšine vývojárskych firiem, čím skôr sa naučíš s Gitom pracovať, tým lepšie pre teba. Git je verziovací systém, vďaka ktorému sa môžeš kedykoľvek vrátiť k pôvodnej verzii svojho kódu, zdieľaš kód s kolegami spolupracovníkmi, pracuješ v tíme. Git ovládaš cez príkazový riadok alebo si nainštaluješ nejaké GUI pre Git. Git ti vlastne ukladá celú históriu tvojho projektu do repozitára. Svoje repozitáre ukladáš na akomsi hostingu - čo môže byť GitHub, GitLab či Bitbucket. TestovanieAk chceš byť úplný kráľ, svoj kód určite aj testuj. Vyhneš sa tak mnohým problémom pri vývoji. Pri JavaScripte sú najpoužívanejšie knižnice pre testovanie Jest, Mocha, Chai. ZáverNezabúdaj, nemusíš dokonale ovládať všetko z vyššie uvedeného. V tomto článku sme sa snažili priniesť ti prierez technológií, ktoré by si mal ovládať, pokiaľ sa chceš stať frontend programátorom. Mohlo by sa zdať, že ich je priveľa a bojíš sa, že to nezvládneš. Pre dodanie sebadôvery si prečítaj tieto príbehy absolventov našich kurzov, ktorí sa rozhodli zmeniť kariéru. Alebo si pozri zopár rozhovorov s absolventami na našom YouTube. Nikdy nie je neskoro začať s programovaním. Keď sa rozhodneš pre vzdelávanie formou online kurzov, najdôležitejšie je vydržať. Držíme ti palce. Kódovaniu zdar!