Náš blog

Kolekcie v Jave
Vzdelávanie
06.03.2020
Skillmea

Kolekcie v Jave

V tomto úvodnom článku do série pokročilá java sa pozrieme na zúbok kolekciám (collections in java). Kolekcie sú akoby kontajnery, ktoré v sebe držia ďalšie objekty. Inak môžeme kolekcie chápať aj ako zoznamy. Zoznam telefónnych čísel. Zoznam osôb. Zoznam áut. Zoznam súborov. Zoznam čísiel .... Pri kolekciách budeme hovoriť o Rozhraní, Implementácii a Algoritmoch.  Java collection framework – Java sama o sebe poskytuje niekoľko kolekcií. Poskytuje nám ich implementácie a aj algoritmy na vyhľadávanie, vkladanie, triedenie a podobne. Rozhrania kolekcií v tomto frameworku sú generické. Teda umožňujú do nich vkladať rôzne typy objektov. Pamätajte, že Java je striktne typový jazyk a do premennej typu String proste int nedáš, musí tam ísť iba String. Ku generikám sa ešte dostaneme v neskoršom článku. [Image] Zoznam rozhraní Java collection frameworkuCollection – top v hierarchii, používa sa na presun kolekcii, manipuláciu kde sa požaduje aby tam prišla akákoľvek kolekcia. Do Collection môžeš vložiť akýkoľvek typ kolekcie, ktorý rozširuje túto kolekciu.  Set – nemôže obsahovať duplicity  List – zoznam, môže obsahovať duplicity, poradie elementov je zachované pomocou indexov  Queue – FIFO – first in first out, čo príde prvé do tejto kolekcie tak z nej aj prvé odíde, niektoré implementácie majú výnimky  Deque – FIFO aj LIFO (last in first out) - elementy môžu byť vkladané aj vyberané z oboch koncov  Map – object ktorý mapuje objekty k ich kľúčom, nemôže obsahovať totožné kľúče  SortedSet a SortedMap – sú vlastne zoradené Map a Set Implementácie (najpoužívanejšie sú zvýraznené boldom): SetEnumSet, HashSet, LinkedHashSet, TreeSetListArrayList, LinkedList, Stack, VectorMapEnumMap, HashMap, LinkedHashMap, TreeMapSortedSet NavigableSetTreeSetSortedMap NavigableMapTreeMapQueueLinkedList, PriorityQueue  SetNeobsahuje duplicitné elementy – lepšie povedané nemôže obsahovať duplicitné elementy.  HashSet – neuchováva poradie v akom boli elementy vložené ale pracuje najrýchlejšie  LinkedHashSet – uchováva poradie elementov v akom boli vložené  TreeSet – poradie elementov je zoradené podľa ich hodnôt, je pomalší   Majme kolekciu, ktorá obsahuje elementy, ktoré sú duplicitné. Ako z nej najrýchlejšie získame kolekciu, ktorá nemá duplicity? Collection<Type> noDups = new HashSet<Type>(c);  Funguje to tak, že z kolekcie sa vytvorí Set. A Set už z definície nemôže obsahovať duplicity. Pridanie elementov do Setu: Set<String> set1 = new HashSet<>(); String s = "e"; set1.add("element1"); set1.add("element2"); set1.add("element3"); set1.add("element4"); set1.add(s);Je element v kolekcii?  System.out.println(set1.contains("e")); //true     Odstránenie elementu z kolekcie: set1.remove(s);Prechádzanie cez Set:  Iterator i = set1.iterator(); while (i.hasNext()){ System.out.println(i.next()); }for(String s : set1) { System.out.println(s); }Spýtam sa, či všetky elementy zo set1 sú aj v set2 set1.containsAll(set2)); Odstránim z set1 všetky zhodné elementy so set2 set1.removeAll(set2);Všetko zo set2 pridám do set1 set1.addAll(set2);ListUchováva poradie elementov. Elementy sú prístupné aj pomocou indexov. Je možné do už vytvoreného Listu pridať nové elementy aj na indexy ktoré sú obsadené – elementy sa posunú. Môžeme v nich vyhľadávať indexOf a lastIndexOf. Pri Listoch si musíme dávať veľký pozor na to, aby sme nezhodili program kvôli prístupu k neexistujúcim elementom – respektíve k neexistujúcim indexom v Liste. Napríklad, máš List so 4 elementami a chceš pristúpiť k 6-temu elementu.  Základné pomocné algoritmy, špecifické ku List:  • sort — zotriedi elementy v Liste  • shuffle — náhodne pomieša elementy v Liste.  • reverse — otočí poradie elementov v Liste  • rotate — otočí poradie všetkých elementov od špecifického indexu  • swap — prehodí elementy z Listu na špecifikovaných indexoch  • replaceAll — nahradí všetky výskyty špecifikovanej hodnoty za druhú špecifikovanú hodnotu  • fill — prepíše všetky elementy v Liste za špecifikovanú hodnotu  ArrayList – prispôsobuje svoju veľkosť, základné polia museli mať špecifikovanú dĺžku pri vytvorení, nemohli rásť alebo sa zmenšovať  LinkedList – iná implementácia, rozdielu sú v časových záťažiach s rôznymi operáciami nad Listami  Pridanie elementov do Listu: List<String> list = new ArrayList<>();          list.add("list1");          list.add("list2");          list.add("list3");          list.add("list4");          list.add("list5");  Výber elementu z listu na indexy 1:         list.get(1);  Je prázdny?         list.isEmpty();  Pridaj na pozíciu 2:         list.add(2,"list2b");  Odstráň element:         list.remove("list1");           list.remove(4);  Rôzne manipulácie:         Collections.sort(list);          Collections.shuffle(list);          Collections.reverse(list);          Collections.rotate(list,2);          Collections.swap(list, 0, 1);          Collections.replaceAll(list, "list4", "new list4");          Collections.fill(list,"Jaro");  MapMapa obsahuje hodnoty viazané na kľúč. Takže to máme po anglicky key – value hodnoty. Kľúče musia byť unikátne.  HashMap – nedrží si poradie, náhodné usporiadanie  LinkedHashMap – drží poradie  Vloženie do Mapy: Map<Integer,String> map = new HashMap<>();          map.put(10,"jaro");          map.put(1,"fero");          map.put(3,"duro");          map.put(4000,"karol");          map.put(4000,"peter"); // prepise predchádzajúci element  Získame a vypíšeme hodnotu elementu s kľúčom 1:         System.out.println(map.get(1));  Prechod cez elementy Mapy:         for(Map.Entry m : map.entrySet()){              System.out.printf("key %d, value %s %n",m.getKey(),m.getValue());          }          for(Integer k : map.keySet()){              map.get(k);                  }
Čo má spoločné Picasso a WordCamp Košice 2020?
Podujatia
26.02.2020
Skillmea

Čo má spoločné Picasso a WordCamp Košice 2020?

WordCamp je nezisková konferencia, ktorá sa organizuje v 75-tich mestách po celom svete. Je určená najmä fanúšikom redakčného systému WordPress, zároveň však má značný presah do marketingu, podnikania i osobného života. Rozvíja vedomosti a zručnosti, ktoré sú v dnešnej IT dobe veľmi žiadané.  Pablo Picasso bol významný umelec 20. storočia, ktorý mal mnoho talentov. Možno o nich zo začiatku ani nevedel, no postupným tvorením a rozvíjaním sa z neho stal maestro. Tak ako Picasso, aj ty máš v sebe rôzne talenty, no musíš ich objaviť a rozvíjať.[Image]   Vďaka konferencii WordCamp Košice 2020 máš možnosť získať vedomosti a zručnosti o používaní a škálovaní systému WordPress, spoznať príbehy ľudí z WordPress komunity, môžeš sa stať súčasťou tejto komunity - objav a rozviň svoj #wordpresstalent.  „Tretí ročník WordCampu v Košiciach so sebou opäť prináša nové zmeny, ktorými sa snažíme zvyšovať úroveň konferencie. Jednou z tých väčších sú nové priestory – Kasárne/Kulturpark. Tie sa nachádzajú v centre mesta, iba pár minút chôdze od Hlavnej ulice.“, uviedli organizátori konferencie.  Už 16.mája ťa v priestoroch Kasární/Kulturpark čakajú zaujímavé prednášky i workshopy z rôznych oblastí tvorby, používania či propagácie webu. Tematické okruhy prednášok a workshopov sa budú striedať, takže ak si napr. hardcore dev, budeš mať program vystaraný na celý deň.  Learn2Code má rado WordPress a preto sme hrdým partnerom tejto konferencie. Ahoj a vidíme sa 16.5.2020 v Košiciach na WordCampe.
Rozhovor s lektorom kurzu o 3D modelovaní
Rozhovory
10.02.2020
Skillmea

Rozhovor s lektorom kurzu o 3D modelovaní

Nedávno sme na našej stránke spustili prvý online kurz zameraný na 3D modelovanie s použitím Autodesk Fusion 360. Ako freelancer, tvorca a spolu-tvorca sa lektor kurzu Agi Gonda od roku 2015 venuje ručnej výrobe drevených dekoratívnych predmetov. Keďže ho vždy zaujímali nové technológie a ich možnosti využitia vo výrobe, začal sa v roku 2018 intenzívne venovať oblasti konštrukčného modelovania s prepojením na 3D tlač a iné možnosti výstupov. Od júna 2018 som členom komunity e-NABLE, a zakladateľom jej slovenskej pobočky, ktorej dobrovoľníci z celého sveta využívajú svoje 3D tlačiarne na vytváranie „open source“ tlačených dlaní a rúk pre deti a dospelých, ktorí náhradu týchto častí rúk potrebujú. Prečítaj si celý rozhovor s lektorom Agim 👇 Na začiatok najskôr začnime tvojou prácou. Čo presne robíš? Na túto otázku nedokážem odpovedať presne :-) Keď zhrniem svoj okruh záujmov a pomenujem to, čo ešte stále voláme “práca”, posledných niekoľko rokov sa ako tvorca a spolutvorca venujem ručnej výrobe drevených dekoratívnych predmetov, čo je ešte aj dnes veľkou časťou môjho fungovania. Sám v sebe však cítim potrebu posunúť sa aj za pomoci súčasných technológií od čisto ručnej výroby k výrobe, ktorá je do istej miery uľahčená aj nástrojmi riadenými počítačom - či už je to CNC fréza alebo 3D tlačiareň, ktorú pri práci s drevom využívam hlavne na výrobu rôznych šablón a prípravkov. Keďže sa snažím všetky moje činnosti čo najefektívnejšie prepájať, venujem sa aj zákazkovému 3D modelovaniu, či poskytovaniu konzultácií, ktoré súvisia s učením sa základov konštrukčného 3D modelovania. Tak vzniklo aj prepojenie s Learn2Code a video kurz o získaní zručnosti a prehľadu pri používaní programu Autodesk Fusion 360.[Image] Na akých projektoch si pracoval? Aké sú tvoje pracovné aktivity? V poslednom období je pre mňa veľmi významné zapojenie sa do projektu celosvetovej komunity e-NABLE, ktorej dobrovoľní členovia využívajú svoje 3D tlačiarne a pre deti a dospelých pripravujú náhrady prstov, dlaní či celých rúk pre tých, ktorí ich potrebujú a majú o ne záujem. Táto komunita funguje už deviaty rok a je do nej po celom svete zapojených viac ako 20000 členov s viac ako 10000 vytvorenými a odovzdanými náhradami. V septembri 2018 sa mi podarilo vytvoriť pobočku tejto komunity aj na Slovensku, pod názvom e-NABLE Slovakia ju môžeš nájsť na internete aj sociálnych sieťach. Naviac energie momentálne venujem do prípravy a rozbehnutia môjho nového projektu - GeoDome.sk, ktorý je opäť prepojený s drevom. Ide o prípravu a výrobu drevených konštrukcií kupol - geodómov, ktoré je možné veľkostne ľubovoľne prispôsobiť a použiť na množstvo pripravovaných realizácií - vyhotovenie v prevedení fóliovníka, výletu - výbehu pre zvieratá, prekrytia bazéna a s ďalšími úpravami ich je možné využiť aj ako rekreačný domček určený pre oddych a relax. A znovu ako doteraz je opäť všetko prepojené a na prípravu týchto konštrukcií vo veľkej miere využívam 3D modelovanie a tlačenie šablón na 3D tlačiarni.[Image] A ako si sa k 3D modelovaniu vôbec dostal?Prvé pokusy naučiť sa modelovať som mal ešte niekedy na strednej škole. Keď som sa však do učenia pustil, veľmi rýchlo som s ním skončil s výsledkom a prehlásením, že také niečo nezvládam :-) Potom však prišiel môj záujem o 3D tlač a s dostupnosťou veľmi jednoduchých modelovacích programov, ktoré sú vo vynikajúcej funkčnosti prístupné vo free verziách aj cez webový prehliadač, som dokázal a chcel vstúpiť aj do tohto nového priestoru. Boli to hodiny a hodiny pozerania zahraničných inštruktážnych videí, z ktorých som si vybral tie spôsoby a postupy, ktoré sú pre mňa najjednoduchšie, najrýchlejšie a najefektívnejšie. Tieto informácie sa mi hneď podarilo vyskúšať v praxi pri spolupráci na modelovaní a tlačení zmenšených modelov športových trenažérov. Prečo si sa rozhodol spolupracovať s Learn2Code?Myšlienka spolupráce sa mi objavila ako ponuka spolupracovať s Learn2Code ako lektor. Bola to pre mňa jednoznačne výzva ísť do novej skúsenosti a zužitkovať získané informácie a znalosti.  Čo všetko sa človek naučí v tvojom online kurze Autodesk Fusion 360?Kurz a jeho obsah som skladal s myšlienkou, aby sa za tých niekoľko desiatok minút stretnúť s 3D modelovaním prakticky ktokoľvek - aj keď s ním doteraz nemal žiadnu skúsenosť. Záujemca sa dokáže zoznámiť so základnými možnosťami a funkciami tohto programu a s malou dávkou predstavivosti si po jeho ukončení vymodelovať požadovaný objekt a od úplných základov zistiť ako funguje vytvorenie priestorového objektu pridaním tretej dimenzie. Program Fusion 360 som zvolil pre jeho dostupnosť a vysokú variabilitu v neskoršom - nazvem ho pokročilejšom modelovaní.  V kurze spoločne prejdeme od stiahnutia a inštalácie programu, cez jeho základné funkcie a nastavenia. Možno nebude na začiatku dávať zmysel, že začneme s kreslením a priraďovaním vzťahov objektov v 2D priestore a až neskôr prejdeme na pridanie ich tretieho rozmeru. Je to však v tomto prípade najjednoduchší spôsob a postup a po narysovaní kruhu a štvorca sa prakticky jednou dodatočnou funkciou dostaneme z kreslenia pločných objektov k tvoreniu tých priestorových. Je v tejto oblasti potrebné sledovať aktuálne trendy a inovácie? Ako si na tom ty?3D modelovanie je oblasť nekonečných možností. Len za obdobie tvorenia kurzu vývojári programu Fusion 360 niekoľkokrát zmenili a zjednodušili pracovné prostredie a pridali mu ďalšie užitočné funkcie. Jednou z nich bolo vylepšenie zisťovania pevnosti a statiky objektov či modelovenie PCB dosiek s celým portfóliom doplnenia elektroniky vo forme pluginu. Niekedy je pre mňa nie veľmi ľahké držať so všetkými novinkami krok a naučiť sa ich používať. Robím to však tak, že nové možnosti programu zaregistrujem a naučím sa ich a začnem používať až vo chvíli, keď ich naozaj potrebujem. Myslím, že pri dnešnom množstve informácií a zmien to takýmto spôsobom robí väčšina z nás :-) Veľmi rád však sledujem inovácie v oblasti 3D tlače a novinky, ktoré pomôžu tento proces výroby zdokonaliť a zrýchliť. Rýchlosť procesu výroby je momentálne jednou z veľkých výziev pre všetkých výrobcov týchto zariadení.  Čo ťa najviac baví na tvojej práci? Na všetkom do čoho sa pustím ma najviac baví obrovská dávka kreativity a do veľkej miery aj voľnosti pri tvorení. Bavia ma nové nápady, stretnutia s rovnako naladenými ľuďmi, no mám rád aj dobre a efektívne nastavený výrobný stereotyp, ktorým si energiu neuberám - naopak ma takáto činnosť dokáže veľmi povzbudiť. Absolútne všetko vidím v nastavení jednoduchosti procesov a nezaťažovaním sa záležitosťami, ktoré nie sú práve v tejto chvíli podstatné. Aké máš plány do budúcnosti?Aj keď mám predstavy o ďalšom smerovaní, príliš túto otázku neriešim. Oveľa viac sa zameriavam na to, čo môžem urobiť lepšie a inak ako doteraz v túto konkrétnu chvíľu. Ako môžem zmeniť zaužívaný postoj, ktorým som sa už niekoľkokrát neviedol k žiadnemu citeľnému posunu a začať robiť veci novým - otvorenejším spôsobom a viac dôverovať prichádzajúcim okolnostiam. Hej, to je môj plán do budúcnosti :-) Krátky odkaz všetkým čitateľom na záverMôj odkaz zhrniem do pár slov... Za akýchkoľvek okolností - aj tých ľahkých a aj nie až takých ľahkých, neprestávaj tvoriť. Čokoľvek! Rukami, nohami, celým telom, nástrojom, prístrojom, obrazom v mysli či najhlbším pocitom.Tak, aby to úmyselne neublížilo nikomu druhému, no aby ťa to posunulo v každú novú chvíľu o krok vpred. A hlavne vlož do každého tvorenia čo najviac svojej energie a srdca, aby si si s každým pozretím do zrkadla či každým večerným zaspávaním mohol a mohla povedať - dnes som urobil a urobila najviac, čo bolo v mojich silách. Aj pre všetkých naokolo, no v prvom rade pre seba.   Ak máš na Agiho nejaké otázky, neváhaj ich napísať do komentárov 👇 Kurz o 3D modelovaní v Autodesk Fusion 360 nájdeš na našej stránke. 
Známe weby, ktoré používajú WordPress
Ostatné
19.01.2020
Martina Baumann

Známe weby, ktoré používajú WordPress

WordPress je najznámejší a najrozšírenejší redakčný systém CMS (Content Management System) na tvorbu webstránok, ktorý stále využíva väčšina užívateľov.  Vznikol v roku 2003 a odvtedy si už medzi sebou našiel milióny používateľov a fanúšikov. Jeho veľkou výhodou je dostupnosť, zrozumiteľnosť a možnosť inštalovať veľa pluginov a widgetov, vďaka ktorým napríklad zmeriate návštevnosť, doplníte si svoj web rôznymi aplikáciami alebo si ho prepojíte so sociálnymi sieťami. Tento článok pôvodne vznikol v lete 2017, upravili sme ho o a doplnili o ďalšie weby. Čítaj ďalej. A na čo WordPress slúži?Taký WordPress sa používa na klasické webstránky, klasický e-shop a samozrejme obľúbené blogy. Jeho veľkou výhodou je, že nepotrebujete licencie. Tento publikačný softvér je totiž vyvíjaný pod licenciou GNU GPL (licencia pre slobodný softvér). Používajú ho aj veľké firmy, organizácie, redakcie na Slovensku a tiež v zahraničí. Ak aj ty rozmýšľaš nad tým, že by si si chcel urobiť webku a nie si zrovna dobrý v programovaní, môže ti pomôcť tento blog na malú inšpiráciu. Existujú rôzne možnosti, ako si urobiť webku jednoducho a rýchlo vo WordPresse a to od systémov, ktoré sú zdarma až po tie platené. V tomto prípade však určite platí, pokiaľ chcete rozbehnúť svoj biznis vo veľkom štýle, investujte do platenej verzie - pôsobí to totiž oveľa profesionálnejšie a potencionálni klienti určite ocenia aj to, že máte vlastný názov web stránky. WordPress.orgPonúka vlastný názov webky a taktiež emailovú adresu -  okrem toho, že je to (ako som už spomínala vyššie) profesionálne, tak je to ľahšie zapamätateľné. Ďalej môžete používať pluginy a tiež veľa možností, ako môže váš web vyzerať. V neposlednom rade ponúka kvalitné SEO. Aby ste však nepovedali, tu je kratučký prehľad šablón, ktoré sú k použitiu zdarma: Sydney, Interface, Flash, Zerif Lite, Everal, Astrid, Hestia, ionMag, Writee a mnohé ďalšie (naozaj je ich na internete celá kopa, stačí len trošku pogúgliť). WordPress.org je vhodná pre ľudí, ktorí chcú mať serióznu profesionálne vyzerajúcu webstránku alebo eshop. Ak s WordPressom len začínate, určite si pozrite náš online kurz pre začiatočníkov o WordPresse a o tom, ako rozbehať a spustiť vlastnú webstránku. Možno ste sa niekedy stretli aj s platformou WordPress.com. WP.com je vhodná skôr pre netechnických ľudí, ktorí nemajú kapacitu na rôzne nastavovania vo "klasickom" WordPresse.  Známe WordPress webyPoďme sa teraz pozrieť na známe webstránky, ktoré sú založené na WordPresse. Ktoré sú to? Nemusíte so mnou súhlasiť, môžete mi pod článok napísať aj svoje vlastné tipy. Objektívny názor v tomto prípade jednoznačne neexistuje 😊 A hádať sa s vami nebudem... Denník N Začnime najskôr od populárneho slovenského denníka, ktoré sa venuje prevažne spravodajstvu a investigatívnej žurnalistike. Má svoju internetovú stránku, ktorá funguje tiež na WordPresse. Má veľkú čitateľskú základňu, denne produkuje desiatky článkov a rôznych príspevkov. [Image] Startitup Kto by nepoznal na Slovensku tento portál? Populárny web, ktorý je zameraný na úspešné startupy a prináša veľmi veľa pútavých príbehov nejedného úspešného Slováka. Všetky tieto príspevky na obľúbenej webke Slovákov čítate práve vďaka WordPressu.[Image] Dušan Plichta Blog Veľmi populárny je aj tento blog, ktorý okrem iného získal tento rok špeciálnu cenu Najlepší WordPress blog 2017. Súčasťou webky je aj e-shop.[Image] ADMA Asociácia digitálnych marketingových agentúr (ADMA) je známa ako združenie profesionálnych agentúr, ktoré pôsobia v oblasti digitálneho marketingu. A jej hlavnou úlohou je zvyšovanie úrovne digitálneho marketingu na Slovensku.[Image] Visibility Agentúra sa na začiatku zamerala na SEO, neskôr sa však začala venovať online marketingu vo veľkom a dnes má významných klientov. Webka je spojených kvalitného obsahu a pekného dizajnu.[Image] PizzaSEO Ďalšia špičková agentúra, ktorá používa WordPress a je dôkazom, že to robí dobre. Aj významné digitálne agentúry používajú WordPress.[Image] Bloger roka A tak určite musím spomenúť aj túto webku - pýta si to.[Image] V zahraničí používajú WordPress naozaj veľké mená, spomeniem napríklad tieto: FORBES Snáď najdôveryhodnejší magazín, poznáme ho aj vďaka populárnym rebríčkom najbohatších ľudí na planéte, ktorý pravidelne uverejňuje.[Image] TECH CRUNCH Spravodajský web o starupoch, technológiách, ventur kapitáli a Silicon Valley.[Image] REUTERS Spravodajská a tlačová agentúra, ktorá používa WordPress.[Image] THE WALL STREET JOURNAL Známy americký denník sa venuje najmä financiám a podnikaniu.[Image] ebay ebay nemusím ani predstavovať? Určite si si tu už niečo kúpil aj ty. [Image] A mne sa páčia ešte aj: Star Wars Blog Oficiálny blog o Star Wars - nájdeš tu všetky aktuálne info, videá, recenzie, komunitnú sekciu a mnoho ďalšieho.[Image] Baťa Prečo by sme nespomenuli aj niečo pre dámy - obuvnícka firma, ktorú založili súrodenci Anna, Antonín a Tomáš Baťoví v Zlíne v septembri 1894.  [Image] NFL A aby neboli ukrátení aj muži - tak spomínam aj túto webku. National Football League je najväčšia a najprestížnejšia liga amerického futbalu na svete. [Image] The New Yorker Týždenník, ktorý prináša komentáre a správy o politike, ekonomike, medzinárodných záležitostiach, kultúre,umení a vede. A samozrejme používa WordPress.[Image] Vypichli sme len niekľko webov, ktoré používajú WordPress, je ich určite oveľa viac. Keďže na WordPresse dnes beží približne 20% všetkých webov na svete. Ak sme na nejaký významný web zabudli, spomeň ho v komentári. Páčil sa ti tento článok? Venuj mu 👍  Ak máš nejaké rady a tipy aj ty a rád by si sa s nimi podelil s ostatnými, napíš nám dole do komentára 👇  
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]