Náš blog

V tejto kategórii nájdete komplexný prehľad článkov z rôznych oblastí, vrátane IT kurzov a tém zameraných na inovačné vzdelávanie. Články pokrývajú širokú škálu tém, ktoré vám pomôžu získať nové znalosti a zručnosti. Ak chcete byť v obraze a zlepšovať sa v oblasti vzdelávania či technológií, táto sekcia je pre vás.

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.
Testovanie Java aplikácií s JUnit
Vzdelávanie
28.11.2019
Skillmea

Testovanie Java aplikácií s JUnit

JUnit framework úvodPredstav si úplne jednoduchú metódu, ktorá má za úlohu spočítať dva vstupné parametre metódy. public static int sum(int number1, int number2){ return number1 + number2; }Ako by si otestoval túto metódu? Zavolal by si danú metódu, a následne by si výsledok porovnal s očakávanou hodnotou. Ak by metóda nevrátila očakávanú hodnotu, tak by si napísal hlášku, že test neprešiel, ak by vrátil očakávanú hodnotu, tak by si napísal, že test prešiel. int sumNumber = sum(1, 4); if(sumNumber!=5){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Čo som spravil, je to, že náš kód som porovnal s jedným možným prípadom výsledku. Po anglicky sa stretneš s názvom test case. Teda som zatiaľ spravil jeden test case.  Ty by si mal overiť niekoľko test casov. Svoj kód musíš vystaviť „stresu“. Teda si napíšeš niekoľko ďalších test casov. Napríklad, ako to bude pracovať s nulou: int sumNumber = sum(1, 0); if(sumNumber!=1){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Alebo ako to bude pracovať s negatívnym číslom: int sumNumber = sum(1, -10); if(sumNumber!=-9){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Toto boli takzvané pozitívne testy. Test si pokladal za passed – za úspešný – vtedy ak bola splnená podmienka. Ty vieš ale napísať aj takzvané negatívne testy. Kde test prešiel ak nebude splnená podmienka. Napríklad test prejde ak sum 2 a 2 nie je 5 a podobne. int sumNumber = sum(2, 2); if(sumNumber!=5){ System.out.println("Test passed."); }else{ System.err.println("Test failed."); }Náš kód sme vystavili rôznym test casom. Ak testy prejdú, tak metóda je ošetrená určite viac – je viac spoľahlivá ako keby sme nenapísali, žiaden test case.  Čo sme spravili? Pripravili sme si testy. Poskytli sme vstupné parametre testom – rôzne čísla na spočítanie. Spustili sme testy a poskytli sme aj očakávané výsledky. Následne sme vypísali hlášky, či testy prešli alebo nie.  Ak by sme mali ďalšie metódy, ktoré by sme museli otestovať, tak by sme napísali ďalšie testy. Spravili by sme vlastne tie isté kroky ako pri testovaní prvej metódy.  Čo majú prvé testy odlišné od druhých testov? Voláme iné metódy, máme iné parametre testov a máme iné požadované výsledky.  Čo majú prvé testy spoločné s druhými testami? Testy sme spustili – na spustení testov nie je nič odlišné. Verifikovali sme výsledky – verifikovanie prebehlo aj v prvom aj v druhom prípade a následne sa v oboch prípadoch napísali hlášky na konzolu.  JUnit framework nám uľahčí spôsob, akým budeme spúšťať testy a aj spôsob akým sa používateľovi oznámia výsledky testov. Spustenie, verifikovanie a vypísanie hlášok bude riadiť JUnit framework. My povieme JUnitu – tu máš môj test kód a ty ho teraz spusti a postaraj sa o to. JUnitu povieme, tento výsledok očakávam, tieto údaje vkladám – prever to. JUnit to preverí a nám oznámi v peknej čitateľnej forme, či testy prešli a ak neprešli, tak nám povie presne, ktoré testy neprešli.[Image] JUnit bol mnoho rokov vo verzii 4. Verzia 5 nie je priamo kompatibilná s verziou 4, ale tvorcovia JUnit 5 pripravili api, cez ktorú vieme komunikovať aj so starými testami – tá sa volá Vintage. Ďalej nové api sa volá Jupiter. Tieto api potom spoliehajú na core frameworku – teda zdroj – kód, ktorý sa stará o všetko ostatné. Spúšťanie testov a podobne. Plus máš možnosť napísať si svoje vlastné api, ktoré potom bude tiež využívať core frameworku.  Ak budeš používať Jupiter plus core, tak si do projektu musíš stiahnuť tieto závislosti. My budeme používať maven pre tieto účely.  Vývojové prostredia ako IntelliJ IDEA alebo Eclipse majú zabudovanú integráciu s JUnit 5 frameworkom a tak môžeme testy spúšťať pomocou týchto vývojových prostredí. Ak ťa táto téma zaujíma viac, sleduj online kurz JUnit a TDD pre programátorov.
Lektor Michal Žák: "Nerob škaredé veci, potom sa len tak poflakujú po svete."
Rozhovory
15.11.2019
Skillmea

Lektor Michal Žák: "Nerob škaredé veci, potom sa len tak poflakujú po svete."

Vyspovedali sme lektora Michala Žáka, ktorý pre teba na Learn2Code pripravil kurz Adobe Illustrator Advanced  a finišuje ďalší online kurz zameraný na komunikáciu s klientom - Client management. Michal sa venuje predovšetkým grafike, rozbehnutých má však viacero projektov. Jeho kariéra začala v 15-tich, kedy objavil Photoshop, k srdcu mu však prirástol Illustrator. Jeho motto? "Nerob škaredé veci, ony sa potom len tak poflakujú po svete." Prečo by mal byť práve Illustrator tým vyvoleným softvérom pre grafika a čo pripravuje v ďalšom kurze sa dozvieš v rozhovore.[Image] Na akých projektoch momentálne pracuješ?Momentálne mi väčšinu času zaberá práca pre AR Visual. Je to malá snaživá firma. Nastúpil som na marketingovú pozíciu, momentálne robím na product developmente - programovanie, práca s klientom, demo videá. A nemenil by som. Grafike sa síce venujem pomenej, ale vždy sa viem vyblázniť na externých projektoch - ako napríklad tvorba kurzu pre Learn2Code. Nie je to také ľahké, ako keď si kreslím podvedome.  Primárne sa venujem hlavne online grafike, UI designu a printu, neprimárne fotím a kódim weby. Nepohrdnem však ničím, kým to nie sú zvrhlé požiadavky typu „daj mi do loga prekrížené pištole“ alebo „dajme tam slogan 2x, aby pochopili o čo ide“. True story.  A významný projekt? Napríklad som nedávno nakódil .js appku, vďaka ktorej nám klient odklepol megadrahý projekt na niekoľko rokov. A ešte som raz robil takú tabuľu pre kebab, čo visela jedno leto na Nitrianskom kúpalisku.[Image] Na pozícii v Bistro.sk Michal pochopil, že ilustrácie mu moc nejdú Pri takom množstve aktivít, čo ti v živote pomáha udržiavať balans?Mám tú najperfektnejšiu a najtolerantnejšiu ženu, ktorá pozná rozdiel medzi helveticou a arialom a pozná ma do bodky. Keď je človek freelancer, tak je dôležité, aby mu partner bol oporou.  Častokrát sedím nad projektom do štvrtej rána alebo mi vyjde business trip na dcérine narodky. Proste shit happens. Mať však pri sebe niekoho, kto to vie pochopiť, je na nezaplatenie. Takže balans medzi 24/7 prácou a rodinou. To je významný projekt. Okrem toho máme doma čoskoro už 10-ročnú slečnu, ktorej sa popri práci nestíham venovať tak, ako by som chcel. Na Vianoce mimochodom dostane grafický tablet. Tak uvidíme. Ja som koniec koncov začínal s ilustráciami na starom Geniuse na intráku v Nitre. Prečo si sa rozhodol stať sa lektorom v Learn2Code?Toto by ani nemala byť otázka 😀 Boli ste sa pozrieť von? Veď to je strašné - neskernované nápisy, písma typu papyrus a calibri, farebne ani nehovorím.  A weby? 😀 Mordor. Ľudia sa musia učiť robiť veci dobre. Musia sa naučiť, že typografia je dôležitá a rozdiely medzi RGB a CMYK nie sú len v kalibrácii monitora. Nie každý, kto si stiahne Photoshop a naučí sa v ňom behať myškou, je aj grafik. Čo sa ľudia naučia v tvojom kurze Adobe Illustrator Advanced?V prvom rade sa zoznámia s Adobe Illustrator. Zistia, že to nie je program len pre ilustrátorov alebo že sa tam robia ikony. Podľa mňa v 95% prípadov Illustrator spokojne nahradí InDesign a Photoshop. Okrem toho hovorím o tom, ako si urobiť poriadok vo väčších projektoch, čo je to Grid a prečo používať pravítka, niečo o typografii, klávesové skratky, tabuľky, štetce, scripty a nejaké špeciálne efekty :D  Napokon sa budeme venovať UI-čku a tomu, ako nenahnevať človeka, ktorý to bude po nás kódovať :)  Na čo sa zameriavaš v pripravovanom kurze?Kurz bude zameraný na komunikáciu s klientom a s ľuďmi všeobecne. Ako presedlať z full time práce na freelancera, ako si naceniť svoje služby (najmä tie kreatívne), kde a ako získať nových klientov, zostaviť si portfólio a podobne. Proste ako to nepokašlať s klientom, je to jedno, či ste od grafiky, od webu alebo whataver-ingu. Pokiaľ chce byť kreatívec v dnešnej dobe úspešný, minimálne 70% jeho energie a času musí byť venovaných práci s klientom. Prejdeme si teda aj konfrontačné situácie, ktoré môžu pri komunikácii nastať.  Sám som si tým všetkým prešiel a prial by som si, aby taký návod niekto vypustil do sveta už skôr. A čo ďalšie plány do budúcnosti?Chcel by som sa pustiť do tutoriálu zameraného na kódenie pre grafikov. Ako si teda zostrojiť vlastný web bez toho, aby sme ťahali Wordpress, WiX a podobné bolehlavy.  Navyše ten, kto pracuje v oblasti UI/UX by mal vedieť, ako web development vlastne funguje. Dokončiť by som chcel aj e-book o Typografii a jej používaní na webe, v printe a podobne. Ale nič zložité. Jednoduché pravidlá, vysvetlenie hierarchie, kontrastu, párovania a podobne. Proste čo nerobiť, prečo to nerobiť a ak robiť, ako to robiť správne. Čo odkazuješ ľuďom, ktorí sa chcú uplatniť v grafickom designe?V odbore grafiky? Choďte do toho! Špecializácia nevedie nikam. Na Slovensku určite nie a obzvlášť nie v korporátnych štruktúrach. Teda s výnimkou tých, ktorým stačí práca za 700-800 v čistom pre nejakú pseudo-digitálku z hornej dolnej a napĺňa ich logotvorba pre lokálne vegan bistrá so životnosťou 4 mesiace. Pokiaľ chcete ísť do toho, učte sa a zbierajte toľko informácií, koľko sa len dá. Napríklad, ako funguje veľkoformátový print, špecifiká mobilných typefaceov, ako zanimovať logo-reveal v After Effects, čo je to inverse-square-law pri fotografii, akú uzávierku zvoliť pri 30fps, aké sú formáty pre google bannery, ako napísať blog, na ktorí ľudia reagujú, ako nakódovať online 3D product viewer atď atď...  A to všetko minimálne preto, aby ste mali prehľad. Nehovorím že máte byť profík v každej disciplíne. A určite všetky tie vedomosti a skúsenosti budete vedieť raz dobre využiť. :) Páčil sa ti rozhovor? Venuj mu 👍  Ak máš na Michala nejakú otázku, napíš ju dole do komentára 👇  
Lambda výrazy v Jave - časť IV.
Tipy a triky
30.10.2019
Skillmea

Lambda výrazy v Jave - časť IV.

Funkcionálne rozhraniaAk chcem používať lambda výraz, tak potrebujem na to rozhranie s jednou abstraktnou metódou. Daná metóda musí odpovedať popisu nášho lambda výrazu.  Ak sa nad tým zamyslíš, tak v skutočnosti sa dané rozhranie môže volať hocijako. Na názve nezáleží. A aj metóda v tom rozhraní môže mať hocijaký názov, pre logiku lambda výrazu to nemá žiaden zmysel. Jediné, čo je dôležité je, aby metóda sedela s lamba výrazom v tom, čo vracia a to, čo je na vstupe metódy ako parameter.  Bolo by úplne super, keby sme nemuseli vždy pri písaní lambda výrazu riešiť vytvorenie nového rozhrania, ktoré nám bude slúžiť ako typ daného lambda výrazu. Čo povieš?  Povedali sme, si, že java nevytvorila nový typ pre lambdy. Pri písaní, sme si mohli všimnúť, že metódy sú často podobné. Vraciam nejaký typ alebo vraciam void a mám tam názov metódy tam sú alebo nie sú parametre. Sú tu nejaké paterny, nejaké vzorce, ktoré sa opakujú častejšie.  Java nám ponúka niekoľko takých rozhraní, ktoré môžeme kľudne použiť. Tieto rozhrania sú v balíčku java.util.function. V tomto balíku je mnoho pred pripravených rozhraní, ktoré môžeš používať. Tieto rozhrania používajú generiká, tak si tam vieš dosadiť objekty aké potrebuješ.  Napríklad Predicate je presne stvorený na to, ak potrebujeme zobrať na vstupe objekt a vrátiť boolean ako návratovú hodnotu. Takto môžeme použiť toto rozhranie namiesto toho rozhrania, čo sme si sami napísali, keď sme riešili predchádzajúcu úlohu.  Ako ošetriť výnimky Spravme si príklad, ktorý bude obsahovať zoznam osôb, ktoré budem spracovávať – vypíšeme ich mená a dáme ich na veľké písmená. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby); } private static void processOsoby(ArrayList<Osoba> osoby) { for (Osoba osoba : osoby){ System.out.println(osoba.getMeno().toUpperCase()); } } } Prepíšeme si to na lambda výraz. Náš kód, ktorý chceme metóde predať ako argument je System.out.println(osoba.getMeno().toUpperCase()). Pracujem teda len s objektom osoba. Výsledok napíšem na konzolu. Tým pádom mám jeden argument a tento kus kódu nevracia žiadnu hodnotu. Budeme na to potrebovať funkcionálne rozhranie, ktoré má metódu s jedným parametrom a nevracia nič. Takým je Consumer s jeho metódou accept. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } } Teraz si náš zoznam osôb zmením tak, že namiesto mien dám do zoznamu null. Pri spracúvaní lamba výrazu nám program spadne na NullPointerException. osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28));Musíme si ošetriť túto výnimku. Ako na to? Jedným zo spôsobov je obaliť volanie consumer.accept do try catch bloku. private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ try { consumer.accept(osoba); }catch (NullPointerException e){ //... } } }Ale to je škaredé riešenie. To čo príde do consumer môže byť všeličo možné a nemusí to dať NullPointerException, možno to bude iná výnimka. Náš kód chceme mať jednoduchší. Druhou možnosťou je, aby bola výnimka spracovaná priamo v lamba výraze. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, osoba -> { try { System.out.println(osoba.getMeno().toUpperCase()); }catch (NullPointerException e){ e.printStackTrace(); } }); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } }Dosiahol som to, že metóda processOsoby je krajšia, ale náš lambda výraz je teraz viacriadkový a nie pekný - jednoriadkový.  Na jednej strane chceme mať pekné jednoduché lambda výrazy, na druhej strane chceme, aby bolo postarané o výnimky.  V našom kóde sa vráťme k riešeniu, ktoré nepoužíva try catch blok. Na odchytenie výnimky použijeme wrapper metódu. Try catch blok si vyvedieme do osobitnej metódy a potom obalíme náš lambda výraz, ďalším lambda výrazom, ktorý má try catch blok. Urobme to, čo som teraz napísal. Vytvoríme si novú metódu, ktorá bude akceptovať lambda výraz. V našom prípade sme na to použili Consumer rozhranie. A keďže je to wrapper, tak to čo mi príde na vstup tak dám aj na výstup. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; }V metóde processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); zavolám namiesto lambda výrazu, wrapper metódu, ktorej argument bude lambda výraz. Urobí to to isté, ale použil som wrapper metódu. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, wrapperLambda(osoba -> System.out.println(osoba.getMeno().toUpperCase()))); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; } }Tu môžem spraviť nasledujúcu vec. Namiesto toho aby som lambdu prehnal cez wrapper metódu, tak ju ani nepoužijem, ale použjime len jej vstupný parameter, čo je osoba. Môžem spraviť niečo takéto:  private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> System.out.println(osoba.getPriezvisko()); }Namiesto toho, aby som využil vstupnú lambdu, ktorá mi prišla cez parameter consumer, som na ňu zabudol a len som využil vstupný parameter danej lambdy a vytvoril som novú lambdu.  Pri volaní consumer.accept(osoba); v metóde processOsoby sa vykoná lambda výraz z wrapper metódy. Toto nie je skutočný wrapper. Skutočný wrapper, zoberie vstupnú lambdu a vykoná čo požaduje. Teraz máme istotu, že sa zavolá presne náš požadovaný lambda výraz a zároveň môžeme pridávať kód okolo. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> consumer.accept(osoba); }Tu prichádza narad try catch blok v wrapper metóde. Upravíme si kód, aby nám hádzal výnimku. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, wrapperLambda(osoba -> System.out.println(osoba.getMeno().toUpperCase()))); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> { try{ consumer.accept(osoba); }catch (NullPointerException e){ System.out.println("Null pointer exception in wrapper lambda"); } }; } }Ak sa zastavuješ pri myšlienke, že sme nič nezjednodušili, len sme presunuli kód na iné miesto, tak máš pravdu, ale! Ak si danú metódu spravíš generickú, tak si do tejto metódy môžeš zabaliť hocijakú lambdu, ktorej typ je Consumer rozhranie. Škoda, že tvorcovia javy nespravili takéto wrapper metódy pre všetky funkcionálne rozhrania z balíku java.util.function. private static<T> Consumer<T> wrapperLambda(Consumer<T> consumer){ return osoba -> { try{ consumer.accept(osoba); }catch (NullPointerException e){ System.out.println("Null pointer exception in wrapper lambda"); } }; } Pokračovať s Lambda výrazmi budeme opäť v ďalšom článku. Moje meno je Jaro Beňo a naučím ťa programovať v Jave. Ahoj.
Ako zistiť, či je číslo zadané zo vstupu prvočíslom?
Tipy a triky
16.10.2019
Skillmea

Ako zistiť, či je číslo zadané zo vstupu prvočíslom?

V 15. kapitole online kurzu vyššieho programovacieho jazyka C++ úrovne Elementary II nájdete medzi zadaniami praktických príkladov na domáce precvičenie aj úlohu, v ktorej máte nájsť najväčší spoločný deliteľ dvoch čísel a taktiež úlohu, v ktorej máte nájsť najmenší spoločný násobok dvoch čísel alebo ich najväčší spoločný deliteľ. Ak siahnete do osnov matematiky druhého stupňa základnej školy niekde do 6. alebo 7. ročníka, zistíte, že kľúčom k vyriešeniu týchto dvoch úloh je rozklad obidvoch čísel na súčin prvočísel. Úlohy patria z hľadiska logiky a analytického myslenia medzi začiatočnícke. Napriek tomu viem, že sú náročnejšie. Práve preto som sa rozhodol napísať tento blog.  V tomto blogu nechcem riešiť túto úlohu za vás, ale aspoň by som vám rád podal návod, ako zistiť, či je načítané číslo zo vstupu prvočíslom. Táto úloha je jedna z čiastkových úloh, ktoré je potrebné riešiť pri dvoch spomenutých príkladoch, ktorých riešenie ste dostali za úlohu nájsť.  Tí, ktorí zabudli, čo je prvočíslo, ozrejmím aj tento pojem. Prvočíslo je celé kladné číslo, ktoré je deliteľné len jednotkou a svojou vlastnou hodnotou. Budeme sa teda pohybovať iba v množine kladných celých čísel. Príkladom prvočísla môže byť napr. číslo 5, pretože je deliteľné len číslom 1 a 5. ďalšími príkladmi sú 2, 3, 7, 11, 13, 17 atď. Samotné číslo 1 sa za prvočíslo nepovažuje. Povedzme, že máme číslo 60, jeho rozklad na súčin prvočísel je 2 x 2 x 3 x 5. Už z rozkladu je zrejmé, že ho môžeme vynásobiť číslom 1, nič by to totiž nezmenilo na výsledku, stále by ste dostali číslo 60. Vidíte, a práve preto sa matematici dohodli, že 1 prvočíslom nebude, nemá totiž už žiadny vplyv v súčine prvočísel, ktorého výsledkom je nejaké číslo. Takže bez zbytočných ďalších prázdnych fráz prejdem rovno k veci. Nasleduje teda zdrojový kód v jazyku C++, ktorý rieši titulok tohto blogu: 01: #include <iostream> 02: using namespace std; 03: 04: int main() 05: { 06: int iNumb; 07: 08: cout << "Zadaj lubovolne cele kladne cislo: "; 09: cin >> iNumb; 10: cout << endl; 11: 12: bool flag = true; 13: 14: if (iNumb == 1) 15: { 16: flag = false; 17: } 18: else 19: { 20: for (int i = 2; i <= iNumb / 2; i++) 21: { 22: if (iNumb % i == 0) 23: { 24: flag = false; 25: break; 26: } 27: } 28: } 29: 30: if (flag) 31: { 32: cout << "Cislo " << iNumb << " je prvocislo !" << endl; 33: } 34: else 35: { 36: cout << "Cislo " << iNumb << " nie je prvocislo !" << endl; 37: } 38: 39: cout << endl; 40: 41: cin.get(); 42: cin.get(); 43: 44: return 0; 45: } Na riadku 01 je uvedená direktíva preprocesora #include, ktorej parametrom je štandardná knižnica iostream. Potrebujeme ju z dôvodu používania objektov cout, cin a manipulátora endl. Na riadku 02 uvádzame do platnosti menný priestor std pre celý zdrojový súbor .cpp. Spomenuté objekty cout, cin a manipulátor endl je zároveň súčasťou tohto priestoru. Na riadku 04 je uvedená funkcia main aj so svojim návratovým typom, ktorým je int (integer). Túto funkciu volá operačný systém. Na riadku 05 je uvedená ľavá programová zátvorka, ktorou sa začína telo funkcie main. Na riadku 06 je deklarovaná premenná iNumb na údajový typ int. Táto premenná reprezentuje hodnotu celého kladného čísla, o ktorom chceme zistiť, či patrí medzi prvočísla. Na riadku 08 je pomocou objektu cout zapísaný na výstup konzolovej aplikácie textový reťazec, ktorý vyzve používateľa na zadanie hodnoty kladného celého čísla, ktorého vlastnosť prvočísla testujeme. Na riadku 09 je prostredníctvom objektu cin načítaná táto hodnota do premennej iNumb. Na riadku 10 je prostredníctvom objektu cout a manipulátora endl presunutý kurzor konzolovej aplikácie na ďalší riadok. Na riadku 12 je deklarovaná premenná flag a zároveň inicializovaná na hodnotu true. Táto premenná nám bude po otestovaní načítaného čísla ukladať informáciu, či je číslo prvočíslom alebo nie. Z hľadiska logiky algoritmu je nutné premennú flag inicializovať pred testovaním na hodnotu true. Algoritmom budeme totiž testovať, či načítané číslo medzi prvočísla nepatrí. Používa sa tu teda postup vylučovací. Na riadku 14 je testovaná podmienka, či v premennej iNumb nie je hodnota 1. Ak áno, program pokračuje kladnou vetvou a do premennej flag sa na riadku 16 zapíše hodnota false, ktorá reprezentuje stav, kedy načítané číslo prvočíslom nie je. Na riadku 13 a 15 sú len uvedené programové zátvorky, ktoré uzatvárajú blok kódu uvedený v kladnej vetve. Ak spomínaná podmienka splnená nie je, pokračuje sa zápornou vetvou. Blok kódu v zápornej vetve uzatvorený programovými zátvorkami na riadkoch 19 a 29. Na riadku 20 až 27 je uvedené jadro algoritmu, ktorý testuje vlastnosť prvočísla u čísel väčších ako 1.  A v čom spočíva idea jadra algoritmu ? V každej iterácii cyklu zisťujeme, či je číslo deliteľné hodnotou v premennej i. Najmenšie číslo, ktorým môže byť načítané testované deliteľné, je číslo 2 (viď. riadok 20 – for slučka) a preto iterujeme od tejto hodnoty. Premennú i postupne inkrementujeme (viď. riadok 20 – for slučka) a testujeme, či je hodnota premennej iNumb deliteľná bez zvyšku pomocou operácie modulo na riadku 22, ktorá je umiestnená v príkaze if. Ak je číslo deliteľné hodnotou v premennej i bez zvyšku, tak sa na riadku 24 uloží do premennej flag hodnota false, čo reprezentuje stav, kedy načítané číslo nie je prvočíslom. Premenná i sa inkrementuje po iNumb / 2 (viď. riadok 20 – for slučka). Dôvodom je fakt, že žiadne celé kladné číslo nemôže byť predsa deliteľné bez zvyšku číslom väčším ako je jeho polovica.  Ak sa teda nenájde číslo, ktorým je načítaná hodnota testovaného čísla deliteľná bez zvyšku, neuloží sa do premennej flag hodnota false, čiže po ukončení v nej bude uložená hodnota true, čo reprezentuje stav, kedy je načítané testované číslo prvočíslom. Na riadku 25 je uvedené kľúčové slovo break a to z toho dôvodu, že v prípade nájdenia jedného čísla, ktoré delí načítané testované číslo bez zvyšku, nie je nutné hľadať ďalšie delitele. Testované číslo už prvočíslo totiž byť nemôže a preto násilne ukončíme slučku for, urýchlime program, ktorý následne prejde až na riadok 30. Tu sa už len testuje hodnota v premennej flag. Ak je v tejto premennej uložená hodnota true, tak sa zapíše na výstup konzolovej aplikácie pomocou objektu cout informácia o tom, že je načítané testované číslo prvočíslom (viď. riadok 32), ak false tak informácia, že prvočíslom nie je.  Na riadku 41 a 42 je už len načítavaný vstup z konzolovej aplikácie pomocou objektu cin, čo slúži na to, aby sa hneď program neukončil a bol zobrazený výsledok v okne konzole, pokým používateľ nezatlačí ľubovoľná kláves. Na riadku 44 vracia funkcia main operačnému systému hodnotu 0, ktorá indikuje stav správneho ukončenia aplikácie. Na riadku 45 je ukončené telo programu pravou programovou zátvorkou. Algoritmus, ktorý som navrhol a implementoval v jazyku C++ nie je ešte optimálny. Je však pre účely kurzu úrovne začiatočník postačujúci. Medzi prvočíslami sa dajú ešte sledovať určité vlastnosti, nebudem ich však tomto bloku spomínať, aby som príliš poslucháča úrovne začiatočník zbytočne nadmerne nezaťažil. Optimálny algoritmus však budem ešte publikovať a rozoberať v ďalšom bloku a v kurze, ktorý bude zameraný aj na matematiku. Autorom blogu je Marek Šurka, lektor online kurzov jazyka C++ na Learn2Code
EU Code Week:  Európsky týždeň programovania
Podujatia
06.10.2019
Skillmea

EU Code Week: Európsky týždeň programovania

V dňoch 5. – 20. októbra 2019 vrcholí siedmy ročník Európskeho týždňa programovania, tzv. EU Code Week. Dobrovoľníci z radov učiteľov, inštitúcií a nadšencov z viac ako 70 krajín sa budú snažiť prostredníctvom aktivít predstaviť nové vzdelávacie možnosti a materiály, aby tak zvýšili záujem o programovanie a zatraktívnili jeho výučbu.  Prečo sa zapájame aj my?Hodiny informatiky na základných a stredných školách sú nie vždy vedené zábavnou a pútavou formou. Len si spomeň na tie svoje. Digitálna gramotnosť sa však pre uplatnenie na trhu práce stáva kľúčovou a o tom, akú úlohu by mala zohrávať vo vzdelávaní nie je potrebné viesť diskusie. Niečo o tom vieme aj v Learn2Code, kde sa sa nás denne obracajú ľudia s otázkou, kde s programovaním začať. Preto sme sa aj my s podporou spoločnosti Google opäť stali súčasťou iniciatívy EU Code Week, aby sme podporili digitálne vzdelávanie na školách a pomohli deťom rozvíjať znalosti a zručnosti, ktoré im pomôžu realizovať nápady a uľahčia orientáciu v digitálnom svete. Ak sa v ňom totiž budú správne orientovať už teraz, budú lepšie pripravení využívať jeho prínosy a čeliť jeho nástrahám.[Image] Tento rok sa s Learn2Code vydávame na východ Slovenska do Košíc a okolia, kde sa prostredníctvom workshopov budú môcť deti na viacerých základných školách zoznámiť s programovaním v prostredí Scratch, ktorý sa vďaka svojej jednoduchosti výborne hodí na výučbu programovania, vytváranie interaktívnych hier a animácií. Okrem Scratchu máme pre deti pripravené aj zážitkové hodiny s robotmi Ozobotmi a programovanie hier v jazyku JavaScript pre pokročilejších. Tento rok sme spojili sily aj s leadership programom Teach for Slovakia a niektoré ukážkové hodiny zorganizujeme na školách zapojených do TfS. Ak chceš vedieť, ako to na takom našom workshope vyzerá, môžeš si pozrieť tento zostrih z roku 2016. Ako sa môžeš zapojiť?Európsky týždeň programovania je nezávislá iniciatíva dobrovoľníkov s podporou Európskej komisie, do ktorej sa môže zapojiť ktokoľvek, teda aj ty. Môžeš byť učiteľ, viesť programátorský krúžok alebo sa skrátka dobrovoľne angažovať v digitálnom vzdelávaní. Stačí, ak usporiadaš programátorskú aktivitu #CodeWeek a pridáš ju na mapu na stránke codeweek.eu. Na stránke navyše nájdeš návod a propagačné materiály, ktoré ti s realizáciou pomôžu. Ak si na niečo podobné netrúfaš, môžeš túto akciu podporiť aj použitím hashtagu #codeweek. 
Lambda výrazy v Jave - časť III.
Tipy a triky
03.10.2019
Skillmea

Lambda výrazy v Jave - časť III.

Lambda a vnútorné anonymné triedyVeľmi sa nám žiada povedať, že lambda výrazy sú len skratky ako napísať vnútorné anonymné triedy. Ale pamätaj si, nie je to tak. Vyzerá to podobne ale lambda nie je implementácia rozhrania. Lambda je sama osobe nezávislá iná vec.   Pozrime sa na príklad. Namiesto toho aby sme použili implementačnú triedu nášho rozhrania IHelloWord, vytvoríme si vnútornú anonymnú triedu. IHelloWord helloWord3 = new IHelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } };Všetky 3 možnosti, ktoré majú ako návratovú hodnotu rozhranie IHelloWord môžeme podsunúť do metody printHelloWord(IHelloWord helloWord). helloWord.printHelloWord(helloWord1); helloWord.printHelloWord(helloWord2); helloWord.printHelloWord(helloWord3); Ako to, ako to? Ako java vie, aký má použiť typ pre lamba výraz? Aby sme tomu porozumeli, vytvoríme si novú triedu, kde budeme pracovať s lambda výrazom. Vytvorme si rozhranie, ktoré bude mať jednu metódu, ktorá bude vracať int a na vstupe bude tiež int. interface Nasob{ int nasob(int a); } Ako by vyerala implementácia tohto rozhrania? class NasobPiatimi implements Nasob{ public int nasob(int a){ return a*5; } }Teraz si navrhnime lambda výraz, ktorý zodpovedá danej metóde. Nepotrebujeme návratovú hodnotu int, lebo java vie na ňu prísť sama a nepotrebujeme ani názov metódy a ani modifikátor prístupu public. Náš lambda výraz bude vyzerať takto: (int a) -> a*5;Teraz použime tento lambda výraz: public static void main(String[] args) { Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10)); }Na výstupe bude 50. V tomto príklade sa lambda tvári ako instancia rozhrania Nasob. V predchádzajúcich príkladoch, keď sme používali HelloWord sme takúto premennú vkladali ako parameter metódy printHelloWord (HelloWord3 v IDEi). Namiesto toho sme mohli túto lambdu vložiť priamo do metódy. helloWord.printHelloWord(() -> System.out.println("HelloWord impls lambda");); Java kompilátor vezme tento lambda výraz a pozrie sa kam ide. Ide to metódy printHelloWord a pozrie sa, čo akceptuje na vstupe. Akceptuje rozhranie HelloWord. Ak lambda sedí s požiadavkou, že dané rozhranie obsahuje len jednu metódu a tá vracia void a na vstupe nemá žiaden parameter, tak java povie, že daná lambda je typu HelloWord. Toto sa volá Type inference. Java si sama zistí typ. Teraz, keď vieš ako java dokáže zistiť typy, vrátime sa ku príkladu, ktorý sme začali písať v tejto kapitole. V našom príklade vieme ešte viacej skrátiť zápis nášho lambda výrazu. Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10));Keďže naša lamba ide do metódy rozhrania, ktorú poznáme interface Nasob{ int nasob(int a); } Tak vieme presne povedať aký typ má vstupný paramter metódy. Je to int. interface Nasob{ int nasob(int a); }Keď to vieme, tak nemusíme pri písaní lambda výrazu znovu špecifikovať typ vstupného parametru. Nasob nasobPiatimi = (a) -> a*5; A keďže máme len jeden parameter, nemusíme písať ani zátvorky. Nasob nasobPiatimi = a -> a*5; Už nebudeme nič mazať, lebo by nám už nič neostalo 😃 Teraz môžeme napísať metódu, ktorá bude na vstupe očakávať rozhranie Nasob a keď ju použijeme, tak do nej vložíme na vstup náš lambda výraz. public static void printNasob(Nasob nasob){ System.out.println(nasob.nasob(10)); } public static void main(String[] args) { printNasob(a -> a*5); }V jave mohli kľudne vytvoriť nový typ pre tieto lambda výrazy. Ale nespravili to a jedným z dôvodov je aj spätná kompatibilita so starším kódom. Ako už vieme, tak lambda výrazy môžeme použiť všade tam, kde máme vyhovujúce rozhranie. Vo vnútorných anonymných triedach, v metódach kde je na vstupe interface a podobne. Príklad: HelloWord helloWord3 = new HelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } }; HelloWord helloWord3 = () -> System.out.println("HelloWord impls inner anonymous class"); Pri tomto musíme pamätať, aby rozhrania boli jedno metódové alebo aby ostatné metódy rozhrania boli default. A dané metódy v rozhraniach, aby sa zhodovali s lambda výrazom. Takéto rozhranie s jednou abstraktnou metódou (metóda, ktorá poskytuje opis nie implemntáciu) sa nazýva Functional interface. Predstav si, že používaš rozhranie, ktorý má len jednu metódu a používaš ho pre lambda výrazy. Teraz by niekto cudzí prišiel a do tohto rozhrania by pridal ďalšiu abstraktnú metódu, presnejšie jej opis bez implementácie. Takéto rozhranie by už viac nebolo functional interface a preto by sa nemohlo použiť pre lambda výraz a nastala by chyba – napriek tomu, že rozhranie by bolo v poriadku. Treba na to myslieť a ak chceme niečo pridať do functional interfac, tak len ako default metódy. Aby sme upozornili kohokoľvek, kto by chcel niečo pridať do nášho rozhrania, tak máme možnosť pridať anotáciu @FunctionalInterface. K anotáciam sa ešte dostaneme, tak sa nebojte. Teraz je dôležité vedieť, že je to pomôcka – táto pomôcka nám spraví to, že hneď ako napíšeme ďalšiu metódu do nášho rozhrania, tak nastane chyba. Danú anotáciu nemusíme písať, ale je to super. @FunctionalInterface public interface HelloWord { void sayHello(); }Príklady na vyskúšanie: 1. vytvor si zoznam miest  2. zotrieď zoznam  3. napíš metódu, ktorá vypíše všetko zo zoznamu miest  4. urob si metódu, ktorá vypíše len tie mestá, ktoré sa skladajú z jedného slova nepoužívaj pri tom lambda výrazy Pokračovanie nabudúce 👋 Články a online kurzy o Jave pre teba pripravuje Jaro Beňo.
ReactiveConf 2019: piaty ročník konferencie mieri opäť do Prahy
Podujatia
24.09.2019
Katarína Kučáková

ReactiveConf 2019: piaty ročník konferencie mieri opäť do Prahy

Piaty ročník konferencie ReactiveConf 2019 mieri do Prahy,aby opäť priniesla prehľad najnovších technológií z prostredia programovania a software developmentu. Chceš odkryť tajomstvo spoločností ako sú Zeit, Google, Brave, Cypress a ďalšie? Čo pre teba tento rok organizátori pripravujú?  Čakajú ťa 3 nabité dni prednášok, workshopov, panelových diskusií, ktoré zaklincuje záverečná párty. Tentokrát sa organizátori snažili presiahnuť rámec React, Angular or Vue a rozšíriť diskusiu na ďalšie prvky ekosystému ako sú ReasonML, Elm, Clojure or Nuxt.js. Dva dni konferencie + festivalový deňReactiveConf sa koná od 30.októbra do 1.novembra 2019 v priestoroch Forum Karlin v centre Prahy. Prvé dva dni sú konferenčné, na 4 stagoch budú prebiehať prednášky, panelové diskusie a tzv. lightnings talks (krátke niekoľkominútové prednášky a prezentácie). Zo 60 speakerov spomeňme namakaného softwarového inžiniera Davida Nolena, Briana Holta z Microsoftu so svojou prednáškou o základoch futuristického kódu a podobne. Tretí, festivalový deň, je venovaný predovšetkým workshopom - čaká ich na teba viac než 15, program bude doplnený o prednášky a na záver odštartuje afterparty, ktorá sa prehupne  až do ďalšieho dňa. Pre koho je konferencia určená?Je určená pre teba, ak programuješ alebo sa zaujímaš o nové technológie. Vypočuješ si novinky zo sveta front- a back-endu, mobilných aplikácií, medzitým môžeš pri káve a občerstvení networkovať. Tento rok sa očakáva viac než 1300 účastníkov. Kde zohnať lístky?Lístky zoženieš priamo na stránke ReactiveConf až do 29.10. 2019. Ak navyše pri platbe zadáš kód "Learn2code", získať 20% zľavu na individuálny lístok.[Image]
4 nové online kurzy
Novinky
03.09.2019
Skillmea

4 nové online kurzy

Tento týždeň ti na Learn2Code prinášame 4 nové kurzy, v ktorých sme dali priestor niekoľkým novým témam. Sú to online kurzy zamerané predovšetkým na soft skills, spestrením je určite šachový kurz so slovenskou jednotkou Jánom Markošom. Zaujalo? Prečítaj si krátke predstavenie kurzov v článku. Prezentačné zručnosti - základyAk aj ty mávaš roztrasené kolená vždy, keď máš vystúpiť na pódium alebo prezentovať svoj nápad pred skupinou ľudí, mal by si zamerať pozornosť na tento kurz.  Nikto ako rečník z neba nespadol, aj ty sa máš možnosť osvojiť si a zdokonaliť svoje prezentačné zručnosti tak, aby si pri vystupovaní pôsobil/a sebavedome.  Čo máš robiť pri vystupovaní s rukami, kam sa pozerať a ako pracovať s publikom ti vysvetlí Andrej Mažáry – líder Slovenských Toastmasters (globálna organizácia venujúca sa rečníctvu) a stredoeurópsky šampión v rečníckych improvizáciách.    Ako rozmýšľať pri fotografovaníV ponuke máme mnoho kurzov zameraných na technickú stránku fotografie. Vytvoriť dobrú fotku však nie je len vecou kompozície a techniky, fotka by mala byť nositeľom príbehu, emócie, ktorú chce fotograf zachytiť.  Učiť sa budeš od troch úspešných a oceňovaných fotografov, ktorí sa venujú predovšetkým dokumentárnej a reportážnej fotografii. Každý z nich ti poskytne vlastný pohľad na postupy a techniky, ktoré pri fotení používajú, ako pracujú s objektom,s rôznymi zdrojmi svetla, prezradia ti kompozičné tipy a nápady. Kurz je určený tebe, ak už máš zvládnuté základy práce s fotoaparátom, možno uvažuješ nad fotením ako svojím živobytím a hlavne chceš tvoriť fotky, ktoré budú výnimočné.  Kurz podnikania - ako začaťKurzom ťa bude sprevádzať osem zakladateľov a CEO úspešných slovenských firiem. Tým myslíme značky ako Tuli, CURAPROX, daren & curtis, VISIBILITY, Be Cool a ďalšie. V tutoriáloch sa s tebou podelia o svoje skúsenosti, Know-how a zodpovedajú dôležité otázky, nad ktorými možno uvažuješ aj ty. Ako myšlienku premeniť na realitu, nápad na fungujúci biznis? Ako vieš odhadnúť jeho úspech? Akú rolu hrajú brand, firemná kultúra či hodnoty firmy? Vysvetlia ti aj plusy a mínusy partnerstva v podnikaní, ako a kedy prijímať nových zamestnancov a čo robiť, ak by to celé nevyšlo. Šach (Coming soon)Dlhoročná šachová jednotka na Slovensku Ján Markoš odhaľuje svoje šachové majstrovstvo. Uč sa od neho o šachových stratégiách, taktikách či sile jednotlivých figúr. Objavíš strategické a taktické postupy, o ktorých si možno doteraz nevedel. Kurz je určený mierne a stredne pokročilým šachistom. Či už rozohrávaš šachové partie online alebo zoči-voči, tento kurz ťa dostane na vyššiu úroveň. Našiel si kurz, ktorý ťa zaujal a bude pre teba prínosným? Ak máš prípadne návrh na ďalšie témy kurzov, ktoré by si v Learn2Code uvítal, napíš do komentára.
Lambda výrazy v Jave - časť II.
Tipy a triky
23.08.2019
Skillmea

Lambda výrazy v Jave - časť II.

Typy lambda výrazovTento článok je pokračovaním prvej časti tutoriálu o Lambda výrazoch. Vráťme sa k nášmu príkladu na začiatku, kde sme do metódy vložili implementáciu rozhrania a zavolali sme metódu. Toto si teraz skúsime spolu prerobiť, tak aby sme použili lamba výraz.  HelloWord2.  Prepíšme metódu implementácie na lambda výraz. public void sayHello() { System.out.println("HelloWord impls"); } () -> System.out.println("HelloWord impls"); Znovu tá istá otázka, aký typ má lamba výraz ak ho chcem priradiť do premennej?  lambdaFunkcia = () -> System.out.println("HelloWord impls");Počkať! V Jave predsa máme možnosť ako deklarovať, vymenúvať metódy a tú použijeme. Tou možnosťou je použiť rozhrania.  1. vytvorenie rozhrania s jednou deklaráciou metódy  2. vytvorenie metódy, ktorá odpovedá našemu lambda výrazu  1. v našom prípade nemá žiadne argumenty a návratová hodnota je void  Ak by sme vytvorili rozhranie, kde budeme uvádzať viacero metód, tak to bude chyba. Jedine ak budú default – teda implementované. Viď sekciu o rozhraniach.  ILambda lambdaFunkcia = () -> System.out.println("HelloWord impls"); … public interface ILambda { void metoda(); // void metoda2(String s); // bude error } Použime lambda výraz s bezpečným delením. Napíšme si k tomu interface a premennú: bezpecneDelenieFunkcia = (int a, int b) -> { if(b==0) { return 0 ; } return a/b; }; public static void main(String[] args) { Hocijako hocijako = (int a, int b) -> { if(b==0){ return 0; } return a/b; }; double d = hocijako.hocico(10, 2); System.out.println(d); } interface Hocijako{ double hocico(int x, int y); }Tu si môžeme povedať, že názov rozhrania a názov metódy v rozhraní nie je dôležitý. Dôležité je, aby sedeli vlastnosti. Teda rozhranie má len jednu metódu (mimo default metód) a metóde sedí typ návratovej hodnoty a parametre metódy. Implemetačnú triedu už teda nepotrebujeme, lebo akoby implementáciou je lambda výraz. Môžem si to nechať, ak to potrebujem takto používať, ale v našom prípade nepotrebujem implementačnú triedu.  Lambda výraz sa správa ako implemtnácia rozhrania. Ale nie je to implementácia. Tento príklad bude fungovať:  HelloWord3 helloWord = new HelloWord3(); IHelloWord helloWord1 = new HelloWordImpl(); IHelloWord helloWord2 = () -> System.out.println("HelloWord impls lambda"); helloWord1.sayHello(); helloWord2.sayHello();Na výstupe bude:  HelloWord impls  HelloWord impls lambda Pokračovanie nabudúce 😗 Mrkni zatiaľ moje kurzy o Java programovaní alebo videá, ktoré máme na Youtube o Lambda výrazoch: https://www.youtube.com/watch?v=tzSFOgnDZZo&list=PL5dKLQR6-HyU7jyoTuZGFmPLAEFpIumi4
Tipy, triky a chyby v jazyku C++ pre začiatočníkov
Tipy a triky
04.08.2019
Skillmea

Tipy, triky a chyby v jazyku C++ pre začiatočníkov

Týmto článkom by som vám chcel predstaviť zaujímavé tipy a triky v jazyku C++, ktoré by ste mohli použiť vo vašom kóde. Sú veľmi jednoduché, pretože sú určené pre začiatočníkov. Navyše by som vás chcel upozorniť na niektoré často sa opakujúce chyby, ktoré sa vo vašom kóde môžu na začiatku vyskytovať. Nejedná sa o chybu v pravom zmysle slova, teda nie takú, po ktorej by bol váš kód nepreložiteľný, skôr sa jedná o obrúsenie vášho programátorského štýlu, či vytvorenie takého kódu, ktorý bude rýchlo vykonávaný. Poslednú spomínanú vlastnosť dosiahnete s C++ ľahko, pretože kódy, ktoré navrhnete v C++ sa vykonajú oveľa rýchlejšie ako tie, ktoré navrhnete v iných jazykoch. Viem programovať vo viacerých jazykoch a preto to mám skutočne odskúšané. Pamätajte, že C++ to však nevykoná za vás, pretože aj tam sa dá vytvoriť veľmi špatný kód. Zámerne so použil termín špatný, hoci nie je odborný. Myslím tým kód, v ktorom zlým štýlom a technikou nedosiahnete požiadavky, ktoré sa na kód kladú. Príkladom môže byť práve rýchlosť vykonávania spustiteľného kódu, jeho prehľadnosť, či ľahká udržiavateľnosť. V nasledujúcich riadkoch vám to na pár príkladoch ozrejmím. Príklady tipov, trikov a chýbUrčite ste sa už v programovaní pokúšali naprogramovať jednoduché matematické operácie. Majme teda nasledovný kód: #include <iostream> int main() { int a; int b = -1; int c; int d = 4; int e = 2; int f = 3; int g; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Najprv by som sa vás chcel spýtať, či sa vám takto napísaný kód na prvý pohľad páči. Myslím tým po koncepčnej stránke. Prvou chybou je, že začínajúci programátori neodsadzujú bloky kódu. Tak napríklad tento kód by sa dal pekne odsadiť pomocou nasledujúcich pravidiel. Oddeľte direktívy preprocesora od hlavičky funkcii main(). Oddeľte deklarácie a definície premenných od zvyšku kódu. Niekedy, keď budete používať veľa premenných, môžete aj jednotlivé deklarácie premenných usporiadať do logických celkov. Môžete vytvoriť bloky kódu podľa typu premennej. Navyše, jazyk C++ vám umožňuje deklarovať a inicializovať premennú namieste, kde to skutočne potrebujete, čiže predtým, ako ju použijete. Ďalej, v tomto kóde oddeľte nosnú časť kódu a to vytvorte blok kódu, kde sa vykonávajú jednotlivé matematické operácie. Nakoniec, oddeľte zápis na obrazovku a tiež načítanie zo vstupu klávesnice. Potom už len oddelíte kľúčové slovo return s jeho návratovou hodnotou. Po spomenutých úpravách vám vznikne čitateľný kód, ktorý vyzerá nasledovne: #include <iostream> int main() { int a; int b = -1; int c; int d = 4; int e = 2; int f = 3; int g; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Keď sa ďalej pozrieme na kód, môžeme niektoré deklarácie umiestniť na jeden riadok. Konkrétne prevedenie nechám na vás, ale ja by som odporúčal deklarovať na jednom riadku premenné, ktoré sa neinicializujú hneď na začiatku súčasne s deklaráciou. Na druhý riadok by som umiestnil premenné, ktoré sa inicializujú súčasne s deklaráciou. Takto získate ešte väčší prehľad v kóde a ušetríte 4 riadky kódu. Kód bude vyzerať nasledovne: #include <iostream> int main() { int a, c, g; int b = -1, d = 4, e = 2, f = 3; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Teraz prejdeme k spomínanej rýchlosti. Je mi jasné, že pri tak krátkom kóde ušetríme relatívne málo času, ale keby sa nosná časť kódu, čiže tri matematické operácie s priraďovaním, vykonávali v cykle napr. 1 000 000 krát, videli by ste zaručene rozdiel. V uvedenom príklade nie je nutné použiť 7 premenných a výsledok vyhodnocovať na trikrát. Výsledky  b + c a  e - f  sa vynásobia a priradia do ďalšej premennej. Tak, ako to je naprogramované, je to zbytočné. Skúste všetko vyhodnotiť ako jeden výraz a priradiť na jednom riadku. Vznikne nám kód, ktorý bude mať o dva riadky menej a bude vykonávať to isté. A v čom je vlastne problém. No v operátore priradenia. Táto operácia je príliš časovo náročná. V podstate sa musí presunúť hodnota premennej uložená na jednom pamäťovom mieste do pamäťového miesta, ktoré je určené pre inú premennú. A po kurze už viete, že počítač pozná len 0 a 1. Organizačne existuje najmenej jeden bajt. Nespomínal som síce, čo je zásobník, ale keď sa pohybujeme v jeho pamäti, trvá to ešte dlhšie. Vráťme sa ale späť, po úprave bude kód vyzerať nasledovne: #include <iostream> int main() { int g; int b = -1, d = 4, e = 2, f = 3; g = (b + c) * (e - f); std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; } A poďme ešte ďalej. Na čo vôbec v tomto kóde používame premenné, keď ich nenačítavame s vstupu. Výsledok kombinácie matematických operácií môžeme predsa zapísať rovno na obrazovku, bez toho, aby sme hodnoty priraďovali do premenných. Odstránime tým aj deklarácie. Po konečnej úprave, bude kód vyzerať nasledovne: #include <iostream> int main() { std::cout << "res = " << (-1 + 4) * (2 - 3) << std::endl; std::cin.get(); std::cin.get(); return 0; }Záverom by som teda znovu chcel zdôrazniť, aké sú programátorský štýl a technika dôležité. Vidíte, že z 18 riadkového kódu, ktorý sme získali odsadením pôvodného kódu, nám po niekoľkých úpravách zostal kód, ktorý má 8 riadkov.  A tento kód, hoci je malý, je laicky povedané, pekný. To znamená, že sa jeho spustiteľný kód vykoná rýchlo, je prehľadný a ľahko udržiavateľný. Autorom blogu je Marek Šurka, ktorý má na Learn2Code online kurz C++ pre začiatočníkov.
7 otázok na nového lektora Mareka Šurku
Rozhovory
25.07.2019
Skillmea

7 otázok na nového lektora Mareka Šurku

Dnes ti predstavíme človeka, vďaka ktorému môžeš na Learn2Code najnovšie študovať aj programovací jazyk C++. Náš nový lektor Marek Šurka alias Kamas sa jazyku C++ venuje už od svojich 20 rokov a v kurze ťa prevedie od jeho úplných základov až k zložitejším technikám. Prečo sa rozhodol vytvoriť kurz programovania a ako sa k jazyku C++ vôbec dostal? Dozvieš sa v rozhovore!👇[Image] Prečo si sa rozhodol pre vytvorenie kurzu v spolupráci s Learn2Code?V podstate som už dlho hľadal spôsob, ako odovzdávať svoje skúsenosti s programovaním ďalej.  V Learn2Code som našiel ideálne riešenie. Hovorím práve o online kurzoch, ktoré môžete absolvovať pohodlne kdekoľvek, v akomkoľvek čase a v dávkach, ktoré si sami určíte. Ja sa tak tiež ako lektor nemusím obmedzovať na konkrétny čas a miesto. Čo sa ľudia naučia v tvojom online kurze?V  kurze ľudia získajú prvé skúsenosti s jazykom C++. Nie je to však rýchlokurz, v priebehu ktorého sa človek naučí všetko o C++. Výstupné znalosti sú na úrovni začiatočníka, keďže som sa snažil ísť viac do hĺbky.  Nájdete tam informácie z programovania a matematiky. Plánujem postupne doplniť túto tému, pretože programovanie v jazyku C++ nie je totiž téma na jeden, dva kurzy. [Image] Kde a na akej pozícii v súčasnosti pracuješ?Pracujem ako programátor-analytik v spoločnosti, ktorá sa venuje automatizácii a diagnostike.  Dlhodobo pracujem na projekte, kde sa venujem robotike a programovaniu priemyselných zváracích robotov. Vyvíjam Frontend aj Backend. A baví ma to :)  Ako si sa k programovaniu a jazyku C++ dostal?Už na strednej škole som sa stretol s jazykom Turbo Pascal, v rámci jedného predmetu sme dokonca programovali mikroprocesory v jazyku Assembler.  Musím sa priznať, na začiatku mi to veľmi nešlo. Nakopol ma až programovací krúžok a najviac mi dala vysoká škola, kde som totálne drvil jazyk C++ a SQL. [Image] Čo ťa baví na tvojej práci?Aj keď možno nebudú všetci súhlasiť, programovanie je aj tvorivá činnosť, sám sa neustále vzdelávam a učím a len taká práca má pre mňa zmysel.  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ť?Aby sa nevzdávali a boli draví. Nikto nie je na začiatku expert.Ani Jazyk C++ sa nedá teoreticky naučiť na úroveň expert, to chce prax. Hlavne odporúčam, aby boli ľudia sami hladní po vedomostiach.  Najlepšie sa niečo naučíte, keď vás to baví. Sú ľudia, ktorí sú výnimočne talentovaní, no nebaví ich programovať. Ďaleko viac dosiahne menej nadaný človek, ktorého programovanie zaujíma. Potom sa učí s ľahkosťou. Jednoducho programujte, čítajte, pozerajte kurzy, diskutujte na fórach, porovnávajte. Učíte sa pre seba. [Image] A čomu sa venuješ vo voľnom čase?Venujem sa manželke a dcére, chodíme na výlety. Je to nevyhnutné, keď človek každý deň pracuje s počítačom. Okrem toho rád čítam, najviac odbornú literatúru. Rád sa učím. A snažím sa športovať. Najradšej mám plávanie a hokej, ktorému sa amatérsky venujem. Marek, ďakujeme za rozhovor. Páčil sa ti rozhovor? Venuj mu 👍  Ak máš na Mareka nejakú otázku, napíš ju dole do komentára 👇   Ak chceš zistiť viac o Marekovom kurze C++ elementary, pozri si intro do online kurzu!