Náš blog

Eratostenovo sito
Vzdelávanie
30.05.2020
Skillmea

Eratostenovo sito

V predchádzajúcom blogu sme sa zaoberali prvočíslami. Ukázali sme si ukážku programu, ktorý rozoznal, či zadané číslo je prvočíslom alebo nie. Dnes by som vám chcel na konkrétnom príklade ukázať, ako rieši podtitulok tohto blogu a teda, zistiť prvočísla na definovanom intervale prirodzených čísel, pričom hornú hranicu intervalu bude zadávať používateľ. Spodnou hranicou intervalu bude 0, ktorá samozrejme nie je prvočíslom a to z toho dôvodu, že prvočíslo je deliteľné číslom 1 a samým sebou. Z toho vyplýva, že 0, aj keď je deliteľná číslom 1, nie je deliteľná 0, pretože výraz 0/0 nie je definovaný. Hoci by si niekto myslel, že výsledok by mohol byť rovný číslu 1, nie je tomu tak. Nula proste nemôže deliť žiadny výraz. Poďme teraz trochu ďalej. Už v minulom blogu som vyvodil záver, že ani 1 nie je prvočíslo a to preto, že je deliteľné 1 a sebou samým, čo je opäť číslo 1. A 1 a 1, nie sú dva rôzne faktory. Podmienka, ktorá vylučuje, že 0 a 1 nie sú prvočísla, je samozrejme v mojom programe ošetrená. Čo ale ostatné čísla, ktoré sa nachádzajú na intervale, ktorého hornú hranicu zadal používateľ.  Na túto otázku nám dá priamo odpoveď jednoduchý algoritmus, ktorý nesie názov Eratostenove sito. Eratostenes z Kyrény bol okrem iného gréckym matematikom, ktorý pôsobil v dávnej Alexandrii približne 280 r. pred Kristom. Okrem toho, že vypočítal obvod zeme, definoval aj algoritmus, ktorý som pre vás implementoval vo vyššom programovacom jazyku C++. Predtým, ako si detailne rozoberieme program napísaný v jazyku C++, si algoritmus ukážeme na nasledovných prirodzených číslach: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19. Máme teda postupnosť, ktorá je na začiatku definovaná číslom 0 vrátane a na konci číslom 20, ktoré sa nachádza už mimo intervalu postupnosti. A to je práve tá horná hranica, ktorá bola vyššie spomenutá. Umiestnime túto postupnosť do jednoriadkovej tabuľky, ktorá v mojom programe bude reprezentovaná vektorom celých čísel (vektor typu int). Ako poznámku chcem dodať, že budeme teda používať triedu knižnice STL, ktorou je vektor. Vektor je entita, z ktorou sa lepšie manipuluje ako s poľom. Práve preto je tento článok určený tým čitateľom, ktorým je aspoň trochu známa problematika vektorov. Tým, ktorí nie sú oboznámení s problematikou vektorov, odporúčam najskôr preštudovať typ size_t, triedu vector a členskú metódu triedy vector push_back(). Potom sa s elánom môžu títo čitatelia pustiť do tohto blogu. Ale naspäť k nášmu definovanému problému. Majme teda spomínanú postupnosť:[Image] V tejto tabuľke vyznačme modrou farbou skutočnosť, že 0 a 1 nie sú prvočísla:[Image] K indexom, na ktorých sa nachádzajú čísla 0 a 1 sa už teda nebudeme vracať. Poďme sa pozrieť na číslo 2. O tomto čísle vieme, že je najmenšie prvočíslo na tomto intervale, čo je prvotnou podmienkou k tomu, aby sme vyriešili podtitulok tohto blogu. Ostatné prvky (čísla) postupnosti budeme testovať Eratostenovym sitom – to znamená, že budeme teraz odstraňovať násobky čísla 2. Keďže číslo 3 nie je násobkom čísla 2, prejde Eratostenovym sitom. Zaznačme teda do tabuľky násobky čísla 2 červenou farbou.[Image] Vidíme, že v jednom kroku odstránil algoritmus (Eratostenovo sito) čísla 4, 6, 8, 10, 12, 14, 16 a 18. Zároveň sa už nebudeme žiadnym spôsobom vracať k indexu čísla 2. S predchádzajúcej tabuľky je taktiež očividné, že číslo 3 je prvočíslom. Poďme teraz odstrániť z tabuľky jeho násobky a zaznačme túto skutočnosť zelenou farbou.[Image] V ďalšom kroku nám algoritmus odstránil číslo 6, 9, 12, 15, 18, ktoré prvočíslami nie sú. Áno, zelenou farbou sme označili aj niektoré čísla, ktoré boli v predchádzajúcom kroku odstránené násobkom čísla 2. To však nemení nič na skutočnosti, že tento krok nám odstránil z postupnosti ďalšie čísla, ktorými sú čísla: 9 a 15. Po vykonaní spomínaného kroku vidíme, že číslo 5 ostalo vyznačené žltou farbou. Číslo 5 je teda prvočíslo, pretože prešlo Eratostenovym sitom. Keď by sme v nasledujúcom kroku odstránili násobky čísla 5. zistíme, že už boli čísla 10 a 15 odstránené násobkom iného čísla. Kedy sa teda algoritmus skončí ? Bude to vtedy, pokým sa skutočne nedostaneme k číslu 19. Číslo 19 už nemá za úlohu odstraňovať žiadny násobok, pretože sa za nim v našej tabuľke nič nenachádza. Dosiahnutie jeho indexu určitou interačnou premennou je podmienkou na skončenie algoritmu, hoci sa už v stave prvočísel alebo odstránených čísel nič nemení. Vyberme teraz všetky čísla označené žltou farbou z našej tabuľky:[Image] Ostanú nám čísla, ktoré sú zaiste prvočíslami. A tak sme sa dostali k výsledku nášho algoritmu, ktorými sú čísla 2, 3, 5, 7, 11, 13, 17 a 19. Pre kontrolu si môžete porovnať tieto čísla s prvočíslami uvedenými v iných zdrojoch, ale určite dostanete ten istý výsledok. Poďme teraz do detailu rozobrať nasledujúci zdrojový kód napísaný v jazyku C++, ktorý je implementáciou verbálneho vysvetlenia algoritmu uvedeného vyššie. Jazyk C++ nám ponúka ďalšie možnosti, ako zefektívniť výpočet. Sú to napr. skoky v programe, ktoré môžeme vykonať pomocou kľúčových slov break a continue. Ale k tomu neskôr. Poďme pekne poporiadku od prvého riadku. Na riadku 1 máme direktívou preprocesora pridaný hlavičkový súbor iostream.h. To znamená, že na tento riadok sa vloží obsah súboru iostream.h. Podobne máme na riadku 2 a 3 vložené tou istou direktívou hlavičkové súbory vector.h a string.h. Na riadku 4 je deklarované, že budeme v celom zdrojovom kóde, ktorý tvorí jeden súbor používať menný priestor std a teda ho nemusíme explicitne vo funkcii main volať, keď budeme z neho potrebovať nejakú triedu alebo objekt. Príkladom môžu byť objekt cin alebo cout. Na riadku 6 definujeme funkciu main a následne na riadku 7 začína jej telo. Na riadku 8 deklarujeme premennú integrálneho typu a to konkrétne char s identifikátorom premennej c_end. Táto premenná reprezentuje jeden znak, ktorý rozhodne o tom, či sa vonkajšia slučka po vykonaní vlastného algoritmu Eratostenovho sita ukončí alebo nie. Práve preto je na riadku 89 vyzvaný používateľ, aby stlačil kláves a alebo n. Ak potlačí n, program pokračuje ďalším cyklom while slučky. Ak potlačí iný kláves program sa skončí. Na riadku 9 je definovaná nová inštancia triedy string s identifikátorom sz, ktorá je inicializovaná na prázdnu hodnotu. Za touto inicializáciou je na riadku 10 uvedená deklarácia premennej iSZ na typ int bez ďalšej inicializácie. Na riadku 11 deklarujeme premennú typu bool, ktorá bude v programe uchovávať informáciu, či používateľ na výzvu programu odpovedal zadaním validnej hodnoty (teda hodnoty integer), ktorá sa bude uchovávať v premennej iSZ. Ak používateľ zadá platnú vstupnú informáciu z okna konzolovej aplikácie, premenná is_size_t sa nastaví na true, v opačnom prípade (ak teda používateľ nezadá platnú hodnotu z rozsahu integer) premenná is_size_t sa nastaví na hodnotu false. Premenná is_size_t je na riadku prvotne inicializovaná na hodnotu false. To reprezentuje stav, že premenná iSZ nebola ešte inicializovaná a to je v skutočnosti pravda. Na riadku 13 je uvedené kľúčové slovo do. To znamená, že sa začína telo slučky do while, v ktorej je ako podmienka uvedená komparácia obsahu premennej c_end so znakom n (viď. riadok 95). Keď program prejde ďalej, dostane sa na riadok 14, ktoré otvára telo spomínanej slučky do while, za ktorou na riadku 15 začína slučka while, čo znamená slučka s podmienkou na začiatku každého cyklu. Práve tu sa program pýta (porovnáva), či je v premennej uložená hodnota false. Ak áno, program pokračuje kladnou vetvou a vyzve na riadku 17, aby používateľ zadal hornú hranicu Eratostenovho sita. Táto hodnota sa nebude brať do úvahy pri testovaní čísla na prvočíslo. Na riadku 18 sa vstup zadaný používateľom načíta do premennej (objektu) sz, ktorá je novou inštanciou triedy string. Načítanie prebehne pomocou metódy getline(), ktorá má dva parametre a to objekt cin a objekt sz. Na riadku 20 nasleduje blog kódu try a catch, ktoré slúžia na rozpoznanie validity hodnoty zadanej používateľom do objektu sz. Vo vetve try sa program pokúša konvertovať hodnotu v objekte sz na hodnotu celého čísla, ktoré reprezentuje dĺžku intervalu, na ktorom hľadáme Eratostenovym sitom všetky prvočísla. Na túto konverziu sa použije funkcia stoi, čo v skratke znamená string to integer (v slovenskom jazyku string na integer). Po konverzii sa na riadku 24 ešte testuje, či používateľ nezadal na vstupe číslo 0. Ak áno program nastaví premennú is_size_t na hodnotu false a skočí pomocou príkazu continue na opätovné vyhodnotene podmienky ďalšieho cyklu slučky while. Keďže v premennej is_size_t je opäť false program pokračuje v slučke while, kedy na riadku 17 je používateľ znova vyzvaný na zadanie hornej hranice intervalu Eratostenovho sita. Takto môže byť program zacyklený dovtedy, pokým používateľ nezadá platnú hodnotu na vstupe konzolovej aplikácie.  Poďme sa pozrieť teraz na to, keď používateľ nezadá hodnotu z rozsahu integrálneho typu (napr. neplatnú hodnotu “hsfu“). Už asi tušíte, že sa nejedná o hodnotu integrálneho typu, ale o nezmyselné znaky, ktoré síce môže používateľ zadať, pretože tieto hodnoty je možné priradiť typu string, ale konverzia tejto hodnoty na hodnotu typu integer sa nepodarí. Práve preto je v našom programe umiestnený na riadku 34 blok catch, ktorí túto výnimku zachytí. A čo sa vlastne stane ďalej ? No to isté, čo v prípade zadania 0, to znamená, že sa nastaví hodnota false do premennej is_size_t a program skočí pomocou príkazu continue na začiatok slučky while, kde sa opätovne v podmienke vyhodnotí, či má pokračovať výzvou používateľa na zadanie validnej hodnoty hornej hranice Eratostenovho sita, a keďže je negácia hodnoty v premennej is_size_t true, program aj tak urobí. A takto bude program dookola vyzývať používateľa na zadanie platnej hodnoty. V prípade, že používateľ zadá platnú hodnotu, program skočí do vetvy try, kde potom skočí do zápornej vetvy príkazu if (klauzula else na riadku 29), kde sa už hodnota is_size_t nastaví na true. Tým pádom program v tomto cykle vyskočí so slučky while, pretože už nespĺňa podmienku na ďalšie vykonanie cyklu. Keď používateľ zadal platnú hornú hranicu Eratostenovho sita, môže sa táto informácia použiť na alokáciu vektora o dĺžky iSZ (alokácia vektora s identifikátorom vNumberVektor), čo je implementované na riadku 41. Na riadku 42 je alokovaný vektor o dĺžke 0 (vektor s identifikátorom vPrimeVektor). Do tohto vektora budeme ukladať prvočísla, ktoré prejdú Eratostenovym sitom. Dĺžku 0 má vektor preto, že je možné do neho pridávať prvočíslo po prvočísle, až keď časť algoritmu učiní rozhodnutie, či číslo, ktoré sa vyberá z vektora vNumberVektor je prvočíslom alebo nie. Na riadku 44 začína for slučka, ktorá je vo svojich jednotlivých cykloch riadená iteračnou premennou i, ktorá sa v každom cykle inkrementuje, až pokým nedosiahne hodnotu iSZ. Táto for slučka vo svojom tele napĺňa vektor vNumberVektor číslami od 0 po 19 (pretože horná hranica, ktorú sme vymedzili v ukážke je 20). Vlastný algoritmus Eratostenovho sita začína na riadku 49, kde je iteračná premenná na začiatku cyklu inicializovaná na hodnotu 2. Prečo je tomu tak ? Pretože na prvých dvoch indexoch vektora (index 0 a 1) sú uložené čísla 0 a 1 a tie nepatria do množiny prvočísel. Toto je základná idioma, ktorú je potrebné si uvedomiť. Keby sme totiž delili nulou, program by vyhlásil chybu. Keby sme delili jednotkou, nedostali by sme nič iné ako pôvodné číslo. Práve preto sa testujú iba čísla od hodnoty 3. Prečo od 3, keď iterujeme od 2 ? Jedná sa o prvotnú podmienku, ktorú som spomínal. Ak teda číslo na indexe 2 sa bude rovnať 2, pridáme toto číslo do vektora vPrimeVektor, pretože o ňom vieme, že je najmenšie prvočíslo. Ostatné čísla už budeme testovať, to znamená, že ak bude index väčší alebo rovný 3, program testuje konkrétne číslo tak, že delí toto číslo číslami uloženými vo vektore vPrimeVektor (čo sú prvočísla) so zvyškom. To znamená, že berie do úvahy zvyšok po delení čísla prvočíslom. Ak je tento zvyšok po delení rôzny od nuly, našli sme ďalšie prvočíslo a to uložíme za vnútorným cyklom riadeným iteračnou premennou j (k tomu nám poslúži premenná typu bool, do ktorej pri nájdení prvočísla uložíme hodnotu true, ktorá indikuje tento stav), do vektora vPrimeVektor, ktorý reprezentuje hľadané prvočísla. Uložíme ho na posledný index pomocou metódy push_back, čo nám zároveň zaručuje usporiadanie hľadaných prvočísel od najmenšieho po najväčšie. Ak by bol zvyšok po delení rovný nule, testované číslo nie je prvočíslom a to znamená, že nastavíme premennú flag na false, skočíme pomocou kľúčového slova break na koniec for slučky (iteračná premenná j). Do vektora vPrimeVektor sa v tomto prípade nič neuloží, pretože v premennej flag je uložené hodnota false. vonkajšia slučka for sa ukončí, keď sú otestované všetky čísla uložené vo vektore vNumberVektor. Posledným testovaným číslom je teda číslo 19.  Po otestovaní všetkých čísel nasleduje zápis prvočísel do okna konzolovej aplikácie (viď. riadok 78 až 83), na čo využijeme objekt cout a slučku for. K zápisu samozrejme patrí aj prechod kurzora na nový riadok na riadku 85.  Potom sa do okna konzolovej aplikácie zapíše výzva, ktorou sa program používateľa pýta, či chce program ukončiť alebo nie. Ak používateľ stlačí kláves n, program pokračuje a používateľ je vyzvaný na opätovné zadanie hornej hranice Eratostenovho sita s tým, že do premennej is_size_t sa opäť uloží hodnota false. Ak by používateľ potlačil inú klávesu (čo znamená ukončenie programu), program skočí za vonkajšiu slučku while na riadok 97, funkcia main vráti operačnému systému 0 a celý program sa končí. Pripomínam, že na riadku 98 je pravá programová zátvorka, ktorá uzatvára telo funkcie main. Výpis programu main.cpp 1: #include <iostream> 2: #include <vector> 3: #include <string> 4: using namespace std; 5: 6: int main() 7: { 8: char c_end; 9: string sz = ""; 10: int iSZ; 11: bool is_size_t = false; 12: 13: do 14: { 15: while (!is_size_t) 16: { 17: cout << "Nacitaj hornu hranicu Eratostenovho sita: "; 18: getline(cin, sz); 19: 20: try 21: { 22: iSZ = stoi(sz); 23: 24: if (iSZ == 0) 25: { 26: is_size_t = false; 27: continue; 28: } 29: else 30: { 31: is_size_t = true; 32: } 33: } 34: catch (const std::exception&) 35: { 36: is_size_t = false; 37: continue; 38: } 39: } 40: 41: vector<int> vNumberVector(iSZ); 42: vector<int> vPrimeVector(0); 43: 44: for (int i = 0; i < (int)vNumberVector.size(); i++) 45: { 46: vNumberVector.at(i) = i; 47: } 48: 49: for (int i = 2; i < (int)vNumberVector.size(); i++) 50: { 51: if (i == 2) 52: { 53: vPrimeVector.push_back(vNumberVector.at(i)); 54: } 55: else 56: { 57: bool flag = false; 58: for (int j = 0; j < (int)vPrimeVector.size(); j++) 59: { 60: if (vNumberVector.at(i) % vPrimeVector.at(j) != 0) 61: { 62: flag = true; 63: } 64: else 65: { 66: flag = false; 67: break; 68: } 69: } 70: 71: if (flag) 72: { 73: vPrimeVector.push_back(vNumberVector.at(i)); 74: } 75: } 76: } 77: 78: cout << "Vypis prvocisel:" << endl; 79: cout << "----------------" << endl; 80: for (int i = 0; i < (int)vPrimeVector.size(); i++) 81: { 82: cout << vPrimeVector.at(i) << " "; 83: } 84: 85: cout << endl; 86: 87: cout << "Chces skoncit [a/n]: "; 88: 89: cin >> c_end; 90: cout << endl << endl; 91: 92: cin.ignore(); 93: is_size_t = false; 94: 95: } while (c_end == 'n'); 96: 97: return 0; 98: }Okno konzolovej aplikácie pri hornej hranici Eratostenovho sita 20[Image] Na obrázku možno vidieť, že výsledné prvočísla sa stotožňujú s prvočíslami, ktoré sme vypočítali analytickým spôsobom (viď. posledná tabuľka v texte). Dúfam, že vás príklad a program s Eratostenovym sitom zaujal, stačí už len, aby ste si to implementovali na svojom počítači. Tento blog napísaI lektor C++ kurzov Marek ŠURKA. Ak máš nejaké otázky, napíš ich do komentárov.
Ako sa tvorí JavaScript
Vzdelávanie
02.05.2020
Lubo Herkoo

Ako sa tvorí JavaScript

Tento rok nám frajeri z TC-39 (ak nevieš čo TC-39 je, čítaj ďalej) naservírujú novú verziu ECMAScript špecifikácie - novinky, ktoré môžeme ako vývojári používať pri programovaní v JavaScript-e. BigInt, optional chaining, Promise.allSettled, String.matchAll, globalThis a iné. O tom, aké problémy riešia tieto nové funkcionality si povieme v ďalšom blogu. Tento text je venovaný špecifikácii ECMAScript a okrem iného sa dočítaš: • prečo potrebujeme špecifikáciu na to, ako implementovať JavaScript Engine v prehliadači • prečo sa špecifikácia nevolá JavaScript, ale ECMAScript a čo je to vlastne tá ECMA • ako dlho trvá, kým sa nápad novej funkcionality jazyka JavaScript stane jeho súčasťou ECMAScript?V roku 1995 vyhrával oscary Tom Hanks s filmom Forest Gump, v rádiách fičal Gansta's Paradise od Coolia a web BBC vyzeral takto:[Image] 80% používateľov internetu surfovalo v prehliadači Netscape Navigator a Microsoft ešte len končil vývoj Internet Explorer-a. Ak ho vôbec niekedy dokončili. Nie všetci boli spokojní s tým, ako web vtedy fungoval: statický obsah, zdieľanie dokumentov a žiadny pohyb. Softvérový inžinier z Netscape - Mark Andreessen - chcel vytvoriť jazyk, ktorý by s ľahkosťou používali nielen vývojári, ale aj dizajnéri a do webov priniesli štipku interaktivity. Buttony a tak. Brendan Eich (meno si treba zapamätať - je to frajer) je človek, ktorý tento programovací jazyk začal tvoriť. Prvým pokusom bola implementácia jazyka SCHEME do prehliadača Netscape. Mimochodom - javisti v SUN Microsystems premýšľali nad spôsobom, ako spúšťať Java kód v prehliadači, čím tiež priniesli interaktivitu do webových stránok. Táto implementácia však nebola jednoduchá na používanie, a preto ostala voľbou korporátnych mastičov. Mocha (takto sa volala prvá verzia dnešného JavaScriptu) bola vytvorená ako alternatíva pre dizajnérov a vývojárov. Mocha » LiveScript » JavaScript vs JScriptVytvorenie prvej verzie Mocha trvalo len 10 dní. Neskôr bol tento jazyk premenovaný na LiveScript a potom na finálny JavaScript. Fun fact: slovo "Java" sa tam nedostalo náhodou - bol to však len marketingový spôsob, ako sa zviesť na popularite jazyka Java. Internet Explorer chcel tiež držať krok s dobou, a preto začali aj v MS pracovať na implementácii čohosi, čo bolo veľmi podobné JavaScriptu. Finálny jazyk sa volal JScript. Implementácia však bola natoľko odlišná od JavaScript-u, že tieto implementácie neboli navzájom kompatibilné! Výsledkom bola skutočnosť, že nebolo možné vytvoriť jeden web, ktorý by fungoval v oboch prehliadačoch. Tak vznikli vtedy slávne nálepky do footerov: "Best viewed in Internet Explorer" a "Best viewed in Netscape Navigator".[Image] Tvoriť weby v tej dobe nebola žiadna sranda, vývojári volali po štandarde, ktorý zjednotí implementácie JavaScriptu a JScriptu. Preto bol vytvorený štandard ECMAScript, ktorý zastrešila organizácia ECMA International. Tá fungovala už dávno predtým a jej úlohou bolo práve vytvárať štandardy pre informačné a komunikačné systémy. Od novembra 1996 existuje teda štandard ECMAScript, ktorý popisuje, ako má byť implementovaný JavaScript Engine. Fun fact: štandard nemôže niesť ikonický názov JavaScript, pretože na toto slovo až do dnešného dňa vlastní copyright firma Oracle. ECMA-262 a TC-39 - whaaat?ECMA International zastrešuje veľa štandardov, ten, ktorý sa týka implementácii JavaScriptu dostal číslo 262. ECMA-262 je teda názov štandardu, ktorý opisuje implementáciu JavaScriptu. Nie je to žiadne príjemné čítanie, aha. Komisia (rozumej: živé bytosti, ľudia), ktorá rozhoduje o tom, aké nové funkcie bude nová verzia JavaScriptu obsahovať, dostala zase názov TC-39. Členom tejto komisie nie je hocikto. Sú to frajeri - vybraní ľudia, ktorí zastupujú veľké firmy pôsobiace na online trhu (Facebook, PayPal, Google, Amazon, Mozilla...)[Image] Nová funkcionalita v JS - schvaľovací procesČlenovia TC-39 organizujú meetingy (väčšinou online) každé dva mesiace. Cieľom týchto meetingov je dopodrobna rozkecať a zanalyzovať, ktoré funkcie bude obsahovať nová verzia ECMAScript, alebo aké opravy budú v tejto verzii vykonané. Zaujímavé je, že táto komisia funguje na princípe zhody - takmer všetci členovia komisie musia súhlasiť s návrhom, aby sa ním čo i len začali zaoberať. Celkom zaujímavé je napríklad sledovať, ako sa dostala do JavaScript-u podpora pre BigInt - brutálne veľké čísla. Lebo v JavaScripte sme doteraz mohli používať len strašne veľké čísla. Stage 0Každý návrh začína na takzvanej nultej úrovni - Stage 0. Niektorý z členov TC-39 vytvorí dokument, ktorý popisuje danú funkcionalitu a aký problém rieši. Na meetingu členov TC-39 tento problém prednesie a členovia rozhodli, že napr. BigInt je super vec a posunuli ho do ďalšieho Stage-u. Stage 1Stage 1 je parádny úspech a zároveň to znamená, že niekedy v budúcnosti bude pravdepodobne daná funkcionalita súčasťou JavaScriptu. Všetkým (alebo takmer všetkým) členom TC-39 sa tento nápad páči a súhlasia s ním. Môže to však trvať roky. BigInt funkcionalita musí byť ešte podrobnejšie popísaná, musí obsahovať príklady, ako sa bude používať a analýzu, či to neprinesie aj nejaké problémy. Stage 2Takzvaný Draft. V tejto fáze je viac menej isté, že funkcionalita bude súčasťou JavaScript-u a preto musí byť ešte podrobnejšie popísaná. Toto je tiež stage, kedy sa premýšľa nad vhodnou syntaxou a rôznymi detailami používania novej funkcionality. V prípade BigInt funkcionality napr. členovia rozhodli, že bude vhodné, ak BigInt číslo bude obsahovať na konci znak n - aby prehliadač (engine) vedel, že pracuje s brutálne veľkým číslom, a nie len strašne veľkým číslom. const bigIntCislo = 12345n; const obycajneCislo = 12345; Stage 3Funkcionalita je takmer hotová a potrebuje feedback od vývojárov a vonkajšieho sveta. Všetci testujú BigInt vo svojich programoch. Tvorcovia internetových prehliadačov sa predbiehajú, kto z nich bude podporovať BigInt ako prvý - pretože implementovať BigInt už má zmysel. Stage 4Všetko je otestované a BigInt je súčasťou špecifikácie ECMAScript. Hotovo. ZáverCelý proces napr. v prípade BigInt trval 2 roky. Viem si predstaviť, že schvaľovanie niektorých ešte komplexnejších funkcionalít môže trvať ešte dlhšie. Frajerom z TC-39 ale môžeme ďakovať za to, že do JavaScriptu sa dostávajú naozaj len veci, ktoré dávajú zmysel.
Amazon a Skillmea prinášajú bezplatné webináre a online kurzy pre deti
Vzdelávanie
21.04.2020
Skillmea

Amazon a Skillmea prinášajú bezplatné webináre a online kurzy pre deti

Kým sú školy zatvorené, prežívajú neľahký čas rodičia, učitelia i deti. Ale vďaka jednoduchým nástrojom sa domáce vzdelávanie môže stať zaujímavým a kreatívnym zážitkom. Túto myšlienku si osvojili aj v spoločnosti Amazon a rozhodli sa ponúkať bezplatné online webináre pre deti. Amazon nadviazal partnerstvo so združením Learn2Code, ktoré pre širokú verejnosť poskytuje kurzy tvorby webstránok, programovania webových a mobilných aplikácií a ďalšie témy. Ich cieľom je sprístupniť mladej generácii digitálne vzdelávanie, učia ich rozumieť marketingu, pracovať s grafikou a videom. V rámci partnerstva spoločnosť Amazon zastrešuje sériu webinárov Code Jungle Slovensko pod taktovkou skúsených odborníkov z praxe z Learn2Code. Všetky webináre, ktoré sa budú konať 2-krát do týždňa, vždy v pondelok a štvrtok budú pre všetkých účastníkov vďaka spolupráci s Amazonom úplne zadarmo až do konca júna 2020. Webináre sú určené pre deti približne od 10 rokov. Počas webinárov sa zoznámia s programovaním v jazyku Scratch a vytvoria si niekoľko atraktívnych hier. Prvý sa bude konať vo štvrtok 23. 4. 2020, od 15:00. Každý z webinárov bude trvať 75 minút a dajú sa absolvovať aj jednotlivo. Záznam všetkých webinárov bude dostupný na Learn2Code YouTube kanáli. „Prostredníctvom týchto bezplatných online webinárov, chceme osloviť deti, ktoré zostávajú doma, a podeliť sa s nimi o vedomosti a zručnosti budúcnosti kreatívnym a pútavým spôsobom,“ povedala Blanka Fijołek, CEE PR & komunitná manažérka spoločnosti Amazon. Druhou časťou tejto spolupráce je poskytnutie všetkých online kurzov pre deti od Learn2Code účastníkom od teraz až do konca júna 2020 bezplatne. Ide o 15 online kurzov, ktoré pozostávajú z 30 vyučovacích hodín a účastníci dostávajú aj domáce úlohy na precvičenie preberanej látky. Kurzy slúžia aj ako podklad pre učiteľov informatiky. „Sme veľmi radi, že vďaka spolupráci s Amazonom môžeme poskytnúť všetky prebiehajúce online kurzy pre deti až do konca júna zadarmo“, povedal Marián Kristeľ marketing & operations z Learn2Code a dodal: „žijeme v mimoriadnej situácii a takto chceme pomôcť rodičom a tiež naučiť zábavným spôsobom deti niečo nové a užitočné“.  Kompletný zoznam kurzov a prihlasovanie nájdete tu. O webinároch Code Jungle Slovensko:Webináre budú prebiehať 2x týždenne online, cez nástroj na webináre ZOOM. Zamerané sú na programovanie hier v prostredí Scratch. Rozsah vyučovacej jednotky je 60 minút plus 15 minút priestor vyhradený na otázky. Počas webinárov sa budú programovať veľké hry ako napr. Flappy Bird, Pacman, Super Mario a ďalšie. Vek účastníkov sa odporúča minimálne 10 rokov. Potrebný je vlastný laptop alebo počítač. Do konca júna 2020 zorganizujeme takmer 20 webinárov. Jednotlivé webináre budú zverejnené na YouTube a budú dostupné pre všetkých zdarma. Kompletný zoznam webinárov a všetky informácie nájdete tu. Ako sa môžete zúčastniť webinárov?UPDATE: Webináre Code Jungle boli ukončené. 
Úvod do Data Science a Machine Learning
Vzdelávanie
18.04.2020
Miroslav Beka

Úvod do Data Science a Machine Learning

Na začiatku, keď človek vstupuje do Data Science je veľmi dôležité pochopiť, čo sa skrýva za rôznymi označeniami. Ľudia si vedia niektoré pojmy mýliť a preto by som v tomto článku rád veľmi zrýchlene prešiel cez niektoré základné súčasti. Data Science je procesZa týmto výrazom sa skrýva celá postupnosť úloh, ktoré musí datascience inžinier vykonať. Prvá fáza je silne prepojená s biznisom. Používajú sa tu preto rôzne biznis výrazy (Business Intelligence). Ako efektívne vieme využiť softvér na dosiahnutie cieľov firmy? Pracovať pre firmu ako data scientist si vyžaduje pochopenie potrieb biznisu. V tejto fáze je tiež veľmi dôležité odkomunikovať, aké sú možnosti Data Science a čo je možné reálne dosiahnuť a čo nie. Veľa manažérov totiž nerozumie technickej stránke veci a ty ako datascience inžinier si tam na to, aby si im to vysvetlil ľudskou rečou. Druhá fáza je príprava dát. Nejaké dáta môže mať firma už nazbierané, iné treba kúpiť alebo nájsť nový spôsob ako zozbierať to, čo potrebuješ. Takže tu sa budeš hrabať v databázach, vyťahovať rôzne dáta, spájať všetko dokopy do nejakého zmyslupného celku. Taktiež musíš vedieť vizualizovať tieto dáta, aby si videl, čo máš na ruke. Treba si overiť, že dáta majú tú kvalitu, akú očakávaš. Často sa totiž stáva, že dáta sú chybné, nekvalitné, v iných jednotkách a podobne. Na to si musíš dávať veľký pozor. V tretej fáze začneme pracovať na modeli. To, čo sme zistili v predchádzajúcich krokoch, musíme "preložiť" do reči machine learning. Aký model použiť (vzhľadom na to, aké máš dáta), aké informácie sa z modelu vieme dozvedieť a ako to súvisí s biznisom. Štvrtá fáza by nám mala vypľuť hotový model pripravený na používanie. Tu všetky tie naše úvahy a predpoklady musíme pretaviť do kódu a natrénovať model na dátach. Znie to jednotucho, ale nie je to úplne easy. Hlavne to záleží od toho, aké kvalitné dáta máš k dispozícii.  Piata fáza sa opäť dotýka silne biznisu. V prvom rade musíme vedieť zhodnotiť, či model skutočne rieši náš problém, ktorý sme chceli vyriešiť a či je v tom dobrý. Tu zvykneme vytiahnuť ďalšie dáta, ktoré model ešte nevidel (testovacie dáta) a otestovať úspešnosť modelu. Výstupom by mala byť krásna prezentácia so všakovakými grafmi a vysvetlivkami, aby to tí "z hora" pochopili a dali ti palec hore.  Machine LearningMachine Learning je súčasťou Data Science a venuje sa algoritmom, programovaniu a trénovaniu modelu. Tento výraz si ľudia zamieňajú s umelou inteligenciou. Aby sme v tom mali jasno, umelá inteligencia využíva techniky machine learning, aby napodobnila ľudskú inteligenciu vo všeobecnosti. Umelá inteligencia sa zaoberá aj tým, ako ľudia interagujú s inteligentným agentom a aby sa ľudia cítili pohodlne, keď interagujú so strojom. Čiže je tam toho zahrnutého oveľa viacej (napr. aj psychológia). Machine Learning je tu a teraz a dennodenne sa používa. Sú to pokročilé algoritmy a techniky, ktoré spracujú nejaké dáta a vypľujú výsledok. Sú úzko špecializované na jednu a jedinú úlohu. ML techník a algoritmov je mnoho a každý rieši určitý malinký podiel tej umelej inteligencie. SlovníkToto odvetvie sa len tak hemží rôznymi výrazmi. Tieto stránky obsahujú základné výrazy, na ktoré určite narazíš a je dobré vedieť, čo znamenaju: • https://towardsdatascience.com/the-new-data-scientist-glossary-4a2c14bf550 • http://www.datascienceglossary.org/ • https://developers.google.com/machine-learning/glossary/ DatasetyExistuje viacero stránok, ktoré ponúkajú svoje dáta verejne a zadarmo. Inak väčšinou treba za dáta tvrdo platiť a kopec firiem si na zhromažďovaní dát vytvorili biznis. Googlenie určite pomôže nájsť mnohé stránky, ktoré ponúkajú svoje dáta. Tu je zoznam niekoľkých populárnych stránok: • https://www.kaggle.com/datasets • https://data.world/ • https://archive.ics.uci.edu/ml/index.php • http://academictorrents.com/ • https://www.reddit.com/r/datasets/ • https://datasetsearch.research.google.com/ Ak chceš vedieť viac o Data Science a Machine Learningu, prihlás sa do môjho online kurzu Python Data Science. Ak máš pripomienky alebo otázky k článku, smelo sa pýtaj v komentároch.
Konštruktory v Jave
Vzdelávanie
03.04.2020
Skillmea

Konštruktory v Jave

V tomto článku sa pozrieme, čo je to konštruktor v Jave (constructor in java). Na čo sa používa? Čo je to?  Trieda slúži na opis a výrobu objektov. Skúsme teraz porozmýšľať nad reálnym objektom – napríklad auto. Ak chceme opísať auto do programu, tak na opis auta použijeme triedu.  Čo má auto? Aké vlastnosti? Má počet dverí, značku, EČV, objem kufra a ďalších xy vecí. Nie všetky budeme používať. V našom projekte si vytvoríme novú triedu:[Image] Pomenujeme ju Auto a napíšeme tam globálne premenné. public class Auto { int doorCount; String brand; String plateNumber; }Teraz si vytvoríme objekt typu Auto. Na výrobu objektov budeme používať konštruktor. Konštruktor ako názov naznačuje slúži na skonštruovanie nového objektu. Bez toho, aby si ty sám napísal nejaký konštruktor, tak máš jeden dostupný automaticky. Tento sa volá – bezparametrický konštruktor – je to akoby metóda, ktorá na vstupe nemá parametre. Preto je možné vyrobiť nový objekt pomocou new Auto(); public class Auto { int doorCount; String brand; String plateNumber; public static void main(String[] args) { Auto auto = new Auto(); } }V programe sme použili new Auto() aj keď nič takéto nemáme napísané. Čo môžeme spraviť, je napísať si takýto konštruktor sami. public class Auto { int doorCount; String brand; String plateNumber; public Auto() { } public static void main(String[] args) { Auto auto = new Auto(); } } Do vnútra tohto konštruktoru si môžeme teraz napísať ľubovoľný kód. Konštruktory sa najčastejšie využívajú popri výrobe nového objektu aj k nastaveniu dát. Napríklad, ak chcem vyrobiť auto, ktoré je značky Škoda, tak vyrobím nový – druhý konštruktor, ktorého vstupný parameter bude práve počet dverí. Volať chceme Auto auto = new Auto(“Škoda”); public Auto(String brand) { }Čo ale spravíme s touto premennou brand, ktorú máme ako parameter? Ak pouvažujeme, tak chceme nastaviť globálnu premennú brand pre tento nový objekt. Ale ako poviem, že globálna premenná brand nech sa rovná tomu, čo je v parametry metódy brand?  Spravím to pomocou kľúčového slova this. Slovo this sa odkazuje na práve tento nový objekt, ktorý konštruujeme. Teda this sa viaže na novo vyrobený objekt z triedy Auto. Po správnosti by som mal povedať, že this odkazuje na inštanciu (instance) objektu. Pomocou konštruktoru vyrobíme novú inštanciu triedy Auto. Ak vyrobím 5 objektov, tak som vyrobil 5 inštancií triedy Auto. Takže this.brand ukazuje kam? Slovo this ukazuje na danú inštanciu objektu a cez bodku pristupujem k veciam dostupným v danej inštancii auta. Čo je tam dostupné? Teraz sú dostupné globálne premenné. Tak spravím: public Auto(String brand) { this.brand = brand; }public static void main(String[] args) { Auto auto = new Auto("Škoda"); }Po zavolaní tohto konštruktoru mám v premennej auto odkaz na objekt Auto s nastevným brand na Škoda. Takto si teraz môžem vytvárať nové inštancie typu Auto. public static void main(String[] args) { Auto auto = new Auto("Škoda"); Auto auto2 = new Auto("Škoda"); } Sú tieto dve autá rovnaké? Nie, nie sú, aj keď majú taký istý brand. Prečo? Lebo ak voláme slovíčko new, tak sa vytvára vždy úplne nový objekt v pamäti. Ukážka konštruktoru, kde nastavujeme všetky globálne premenné. V IDEI stlač ALT+Insert a vyber konštruktor – následne označ všetky premenné. Tieto premenné sa inak nazývajú aj fieldy.[Image] public Auto(int doorCount, String brand, String plateNumber) { this.doorCount = doorCount; this.brand = brand; this.plateNumber = plateNumber; } public static void main(String[] args) { Auto auto = new Auto("Škoda"); Auto auto2 = new Auto("Škoda"); Auto auto3 = new Auto(4, "Opel", "CCdddDD"); }Nové objekty môžeš vytvárať kde chceš a kedy chceš. Teraz som to robil v metóde main priamo v triede Auto. To ale samozrejme väčšinou robiť nebudeš. Viac o konštruktoroch v Jave a Java programovaní sa dozvieš v našich online kurzoch Java a OOP pre začiatočníkov a Java pre pokročilých. Ak máš nejaké otázky k tomuto blogu, napíš ich do komentárov 👇
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);                  }
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.
Môžeme sa dnes na hodine hrať? Od zákerného slniečka k programu Scratch
Vzdelávanie
27.02.2019
Skillmea

Môžeme sa dnes na hodine hrať? Od zákerného slniečka k programu Scratch

„Môžeme sa dnes na hodine hrať?“ To je otázka, s ktorou sa stretávam na hodinách počas krúžkov programovania.  Keď som začínal s učením, veľmi ma trápilo, aký postoj zaujať k žiakom. Predstavoval som si rôzne katastrofické scenáre, keď žiaci začnú robiť nezbedu od odvrávania až po demolovanie učebne.  Ako napomenúť deti?  Ako spacifikovať nezbedníkov?  Ako ich donútiť spolupracovať?  Ako sa odprezentovať, aby som nebol za hlupáka?  Ako im správne vysvetliť látku?  A to najdôležitejšie: Ako sa postaviť pred dav ľudí, ktorý vám v lepšom prípade venuje pozornosť, a byť schopný zo seba vysúkať zmysluplnú vetu? Začínal som so zákerným slniečkomNejaké skúsenosti som mal s doučovaním spolužiakov na vysokej škole. Pamätám si, ako sme trávili sobotné večery na Skype, kde sme sa snažili donútiť to zákerné slniečko, aby po spustení malo tvar ako na zadanom obrázku.  Neskôr som pomáhal spolužiakom pochopiť, čo sa deje s ich domácou úlohou.  Nakoniec som do nich tĺkol schopnosti ako si rozobrať zadanie, naplánovať postup, aby samostatne naprogramovali skúškový program.  Nedá mi nespomenúť, ako sa mi na strednej škole rozbil počítač a ja som maturitné otázky programoval s ceruzkou na papieri.  Čo ale stálo za tým, že som zvládol nakresliť slniečko a potom pripravoval spolužiakov na skúšku? Bol to ten skvelý pocit, že som v podstate z ničoho vytvoril funkčný program, hrateľnú hru, svet s vlastnými postavami. [Image] Trénujeme hlavu – každý po svojomPri programovaní si trénujeme to, čo máme v hlave. Musíme myslieť aj na to, že nie každý sa s tým ľahko popasuje. Už som počul aj sťažnosti od detí, aký je to útok na mozog. Deti radi trávia čas pri počítači. Nie každý sa však chce učiť zložité algoritmy. Je potrebné ich naučiť, že počítač nie je len na hranie. Je to aj nástroj, ktorý im umožňuje prejaviť sa. (To by sa ale mohli naučiť aj niektorí rodičia 😊.) Vedú k tomu viaceré cesty. Keď som prvýkrát otvoril prostredie Scratch, bol som nadšený. Prostredie mi ponúka všetko, čo potrebujem na vytvorenie vlastného sveta.  Tu máš, pohraj sa s tým, experimentuj, uvidíme, čo z toho vznikne.  Nepotrebuješ vedieť zložité informácie, čo sa za tým skrýva alebo prečo to tak funguje.  Prostredie ti napovie, toto s týmto sa dá spojiť, a vznikne tamto...  Scratch umožní používateľovi vytvoriť veľmi rýchlo jednoduchú hru. Postačí mi zopár klikov a už mi postavička pojedá jabĺčka a pripočítava skóre. Potom to už ide samé.[Image] Počítačové hry nie sú zloŽiaci sa tešia na hry, ktoré vytvoríme. A potom začínajú prichádzať otázky: „Kedy si naprogramujeme hru ako GTA V?“ Na to však musím odpovedať, že hru, ktorú vytváralo tisíc ľudí niekoľko rokov, si za jedno popoludnie v Scratchi nenaprogramujeme.  Keď si prejdeme základy, púšťame sa do skutočného programovania hier. Často sa pýtam detí na ich vlastné nápady, ktoré potom spolu realizujeme. Snažím sa tak v deťoch podporiť kreativitu. Chcem, aby rozmýšľali nad vlastnými schopnosťami a možnosťami prostredia Scratch.  Niekto môže namietať, že počítačové hry sú zlo, ktoré kazí dnešnú mládež. Ja však hovorím, že existujú hry, ktoré vedia deťom veľa priniesť: modelovanie v Minecrafte, manažment a plánovanie v Total War, simulácia života v Simse, budovanie svetov v Age of Empires.[Image] Autorom blogu je Ľuboš Jaroš Ľubošove vzdelávacie podklady ku Scratchu nájdete tu. Mgr. Ľuboš JAROŠ je absolvent magisterského stupňa štúdia učiteľstva matematiky a informatiky na FMFI UK (2015). Od začiatku vysokoškolského štúdia sa venoval didaktike programovania, či už v školských prácach alebo pri vedení krúžkov programovania pre žiakov 1. a 2. stupňa, v čom úspešne pokračuje doteraz. Vytvoril kompletné vzdelávacie podklady a videotutoriály pre programy Scratch Junior a Scratch Starter. Je autorom knihy Scratch Starter - Programovanie pre deti (2017). 3 roky na vyžiadanie vedie hodiny didaktiky pre učiteľov informatiky. Jeho obľúbeným pracovným nástrojom je programovacie prostredie pre deti s názvom Scratch.
5 spôsobov ako rozvíjať svoje dieťa a nezakazovať mu počítač
Vzdelávanie
18.02.2019
Skillmea

5 spôsobov ako rozvíjať svoje dieťa a nezakazovať mu počítač

Často dnes vidíme tristný obraz detí, ako v tmavom kútiku v žiari displeja svojho mobilu, tabletu alebo počítača presedia celé hodiny a bavia sa na príbehoch svojich reálnych či virtuálnych kamarátov vo fiktívnych svetoch. Až sa zdá, že počítačové hry a multimédiá sú pre deti príťažlivejšie než čokoľvek iné. Prečo sa to deje? Podľa vedeckých výskumov sme to my sami, kto vedome či nevedome už v útlom veku, učíme deti spracovávať informácie odlišným spôsobom ako celé generácie pred nami. Silné podnety a rýchle tempo vnemov z elektronických médií povzbudzujú v mozgu vylučovanie hormónu odmeny dopamínu, a tým ovplyvňujú jeho kognitívne funkcie. Človek má sklony tieto zážitky opakovať, vyhľadávať nové a silnejšie podnety, čím sa roztáča "dopamínová špirála". V súčasnosti sa s týmto problémom borí množstvo rodičov a vychovávateľov. Ak chceme, aby naše deti urobili aj niečo vo svoj prospech a svoju budúcnosť, potrebujeme tieto silné podnety najprv "prebiť", a tak si získať ich pozornosť. Potom by sme však mali postupne zjemňovať ,,nátlak” a cibriť výdrž a vnímavosť.  Ponúkam vám niekoľko inšpirácií, ktoré majú potenciál deti zaujať a zabaviť – bez toho aby prehlbovali svoju závislosť na médiách. Naopak, získajú radosť, zvýšia kontakt s rovesníkmi, vycibria si vnímavosť aj pohybové zručnosti. Efektívne tiež znížia závislosť na lacných náhradách zo sveta zábavného priemyslu. [Image] 1. Dajte krídla kreativiteDnes je trendom konzumácia obsahu. Podobne ako pri jedení aj tu to môžeme uchopiť z opačnej strany a "uvariť si" niečo vlastné. Vďaka všadeprítomným technológiám máme veľa možností.  Nakrútiť mobilom vlastný krátky hraný, animovaný, prírodopisný film či televíznu reportáž? Na spracovanie materiálu a tvorbu hudby môžeme využiť voľne dostupné aplikácie v online obchodoch. Podobne vieme vyrobiť hudbu (napr. Chrome Music Lab) a ako bonus aj plagát na premiéru (Office), prípadne aj s vlastnoručne kreslenou grafikou (napr. Photopea). Môžeme tiež natočiť aj veselé video (s pokazenými zábermi) o tom, ako to celé vznikalo. A máme ideálny príspevok do rodinnej videotéky! 2. StavebniceStavebnice sú ideálny prostriedok na konštruktívnu hru a experimenty. Sú navrhnuté tak, že rešpektujú intelektuálne a fyzické schopnosti detí v jednotlivých vekových kategóriách. Napríklad elektronická stavebnica Boffin, v ktorej si aj menšie deti bez potreby mobilu či počítača bezpečne postavia zábavné elektrické obvody.  Veľmi vhodné sú stavebnice Lego Technic s názornými ozubenými prevodmi a ďalšími súčiastkami, ktoré demonštrujú mechanické princípy.  Ak sa vám zdajú tieto stavebnice pridrahé, skúste niektorú z online Lego požičovní, ktoré sa začínajú vynárať aj u nás. Vrcholom tejto skupiny je robotická stavebnica Mindstorms, ktorá okrem lego dielikov obsahuje aj senzory a riadiacu jednotku. S použitím vhodného kurzu vovedie vás i vaše deti do sveta robotiky. [Image] 3. Výzva: Naučte ich programovaťVyššia úroveň používania digitálnych technológií je naučiť sa ich ovládnuť ich cez programovanie. Nie je až také náročné začať, ak viete, za ktorý koniec to chytiť. Deti na kurzoch a v letných denných táboroch, ktoré organizujeme v Learn2Code, nás presviedčajú o tom, že keď sú správne motivované a pod dohľadom skúseného inštruktora, základy programovania zvládne každé z nich. Mnoho vecí sa však dnešní tínedžeri učia z video návodov. A nie je to náhoda. Video návod môže do veľkej miery osobný sprievod inštruktora nahradiť. Prvé experimenty môžu začať v Scratchi, pokračovať vlastnými mobilnými appkami v AppInventore alebo grafickými skicami v javascriptovom prostredí P5.js. 4. Meranie síl s rovesníkmiAj na Slovensku existuje množstvo súťaží pre deti, v ktorých si môžu merať sily s rovesníkmi. Výnimka nie je ani informatika. Ak vášho potomka zaujímajú hry a programovanie, môže vyskúšať súťaž v tvorbe hier Galaxiáda. Jej druhý ročník práve prebieha. 5. Doprajte pohyb celému teluKaždé dieťa, či už programátorské alebo nie, uvíta chvíľu veselého pohybu! Neveríte? V sprievode zábavnej počítačovej hry Stepmania prekoná(te) detskú lenivosť. Princíp hry spočíva v tom, že dotykom nôh po podložke za sprievodu populárnej hudby "zostreľujete" rýchle ubiehajúce šípky. Stepmania je k dispozícií zadarmo. Jediné, čo k nej potrebujeme, sú ovládače Dance Pad, ktoré sa však dajú v domácich či zahraničných internetových obchodoch kúpiť už od 10 eur za kus. Hra obsahuje niekoľko herných režimov, dá sa hrať samostatne, ale zábavnejšia je vo dvojici (potrebujete dve podložky), či dokonca na turnaji. (Na ten si účastníci nosia svoje vlastné podložky.) Vďaka týmto aktivitám vy a vaše deti zažijete radosť a pocit zmysluplného využitia času a moderných technológií v prospech spolupatričnosti a vnímavosti. Zároveň povzbudíte ich zdravú sebadôveru a získavanie takých zručností, ktoré určite využijú v budúcnosti. Autorom článku je Marián Staňo Marián je absolvent učiteľstva matematiky a informatiky na FMFI UK (2001). Od začiatku štúdia sa venoval experimentálnemu vyučovaniu informatiky na ZŠ a neskôr v škole pre deti so všeobecným intelektovým nadaním (ZŠ Košická Bratislava, Škola pre mimoriadne nadané deti a gymnázium v Bratislave, Inštruktor Letného denného tábora FMFI UK). Má dvadsaťročnú prax vo vzdelávaní detí ako lektor a autor vzdelávacích materiálov. Má rovnako skúsenosť ako facilitátor arteterapeutických skupín dospelých a hľadá prieniky medzi animovanou tvorbou a technológiami.
Java najnovšie verzie – Java 9 moduly (1. časť)
Vzdelávanie
09.12.2018
Skillmea

Java najnovšie verzie – Java 9 moduly (1. časť)

Od verzie 9 bude java vychádzať v pravidelných intervaloch. Každých 6 mesiacov nová java. Takže môžeme očakávať nové funkcionality častejšie, ale v menších dávkach. Najpoužívanejšia Java v súčasnosti je java 8 – vyšla v roku 2014. Java 9 prvýkrát vyšla v septembri 2017, neskôr boli opravené kritické chyby a dalo by sa povedať, že taká lepšia verzia vyšla v januári 2018. Java 10 vyšla v marci 2018, Java 11 v septembri 2018. Takže rýchly posun vo verziách, ale nie drastický posun vo funkcionalite.  Čo je lepšie? Naraz a veľa alebo menej a postupne? Záleží od toho, čo robíš. Ak používaš veľa frameworkov a knižníc tretích strán, tvoja práca po zvýšení javy môže byť ovplyvnená.  Prvým míľnikom je java 11, ktorá je označená ako LTS, teda long term support. Táto verzia javy bude dlhodobo opravovaná a bude o ňu postarané na najbližšie roky. Čo to znamená? Že je pravdepodobnejšie, že firmy poskočia z javy 8 skôr na javu 11, lebo budú mať istotu, že táto java bude v budúcnosti opravovaná – ak by sa našla nejaká kritická chyba.  V tomto článku sa zameriame hlavne na výpis zmien, čo je nové. Nebudeme sa zaoberať jednotlivými zmenami podrobne. To si necháme do budúcna.  InštaláciaNajprv si musíš stiahnuť a nainštalovať najnovšiu javu jdk. V čase písania článku je to Java 11. Nastav si premennú prostredia JAVA_HOME na novú javu – na root, nie na bin priečinok. Potom do PATH premennej nastav cestu práve na bin priečinok novo nainštalovanej javy.  Spusti príkazový riadok a zadaj príkaz: java – version  Ak sa ti objavila verzia, všetko je v poriadku. [Image] Ak je nejaká chyba, alebo ukazuje staršiu verziu, tak sa uisti, že v PATH je cesta bin novej javy nastavený na začiatku. Je možné, že v PATH máš nastavené aj C:\ProgramData\Oracle\Java\javapath. Ak áno, tak to musí byť až za cestou na najnovšiu javu.  ModulyV jave 9 je najskloňovanejšia zmena projekt Jigsaw – ale stačí, ak si zapamätáme, že ide o modularitu – rozdelenie veľkého monolitu – teda celá aplikácia v jednom balíčku na menšie celky – moduly. Moduly potom povedia, čo zverejňujú do sveta a čo požadujú pre svoju správnu funkcionalitu.  Každý modul obsahuje module-info.java súbor a aspoň jeden balík. Modul-info.java v sebe obsahuje popis závislostí, ktoré modul potrebuje. Každý modul je nezávislý v ponímaní, že ak obsahuje obrázky, alebo konfiguračné súbory, tak modul si ich manažuje sám. Všetko, čo je v module je privátne pre modul, ak nepovieme inak.  Existujú 4 typy modulov. System moduly – Java SE a JDK moduly – ak si všimneš, tak v nainštalovanom jdk pre novšiu javu chýba priečinok jre. Teraz tam je jmods. Tu máme umiestnené všetky už default poskytované moduly. [Image] Aplikačné moduly sú moduly, ktoré chceme vytvárať, keď sa rozhodneme, že chceme používať moduly.  Automatické moduly sa vytvoria, keď pridávame JAR súbory na path modulu. Názov modulu sa preberie z názvu jar súboru. Tieto automatické moduly majú plný prístup na čítanie do všetkých ostatných modulov načítaných na path.  Nepomenovaný modul = ak sa na path – nie na module path – načítajú nejaké triedy alebo jar súbory, tak tieto triedy a jar súbory sú automaticky pridané do tohto nepomenovaného modulu. Slúži na spätnú kompatibilitu s predchádzajúcim starším javovským kódom.  DistribúciaModul má byť zbalený ako jar súbor – jeden jar súbor má obsahovať max jeden modul. Keď robíme build projektu, musíme si dať pozor, aby sme zabalili každý modul v našom projekte ako samostatný jar.  Základné modulyVraveli sme si, že jdk má novú štruktúru, ktorá má v sebe jmodules. Tu sú základné moduly. Tieto moduly si vieme vypísať pomocou príkazového riadku ak zadáme príkaz <b>java --list-modules</b>. [Image] Každý modul, ktorý vytvoríme, bude používať implicitne java.base modul. Použitie iných modulov bude dostupné po konfigurácii.  Vytvorenie moduluModul v podstate vznikne, ak zadefinujeme v roote zdrojového kódu modulu súbor module-info.java.  Týmto momentom sa pracuje so zdrojovým kódom ako s modulom. Moduly sa navzájom nevidia – nemajú prístup jeden do druhého a do tretieho a tak ďalej. Podľa toho koľko modulov používame.  Ak chceš používať niečo z vonku, alebo chceš, aby vnútro tvojho modulu, alebo čas vnútra tvojho modulu bolo viditeľné, musíš to zadefinovať.  Majme projekt, do ktorého si zadefinujeme nový modul. V module máme src priečinok, do ktorého budeme dávať všetok zdrojový kód. Vo vnútri si zadefinujeme balíček sk.jaro.demo a v ňom ešte external a internal. Vytvoríme si jednoduché triedy, ktoré len niečo vypíšu na konzolu. [Image] package sk.jaro.demo.external; public class HelloMainModuleExternal { public void doAction() { System.out.println ("Hello main module HelloMainModuleExternal"); } }package sk.jaro.demo.internal; public class HelloMainModuleInternal { public void doAction() { System.out.println("Hello main module HelloMainModuleInternal"); } }Tieto triedy sú odlišné len v názve a výpise na konzolu. Internal si neskôr nastavíme, aby bola viditeľná len v module main. External si neskôr nastavíme, aby bola viditeľná aj mimo modulu main. V src tohto modulu si vytvor súbor module-info.java. Vnútro súboru má syntax, kde je najprv kľúčové slovo modul, potom názov modulu – vieš používať aj bodky a potom sú kučeravé zátvorky: modul nazovmodulu{ }. Chceme, aby balíček external bol dostupný aj pre iné moduly – musíme nastaviť aby sa exportoval. module main { exports sk.jaro.demo.external; }Teraz si vytvoríme nový modul v tom istom projekte s názvom utils. Vo vnútri budeme mať jednu triedu, v ktorej sa budeme snažiť použiť HelloMainModuleExternal triedu z modulu main. [Image] Module-info.java musí teraz obsahovať, že v tomto module vyžadujeme modul main – pretože používame funkcionalitu z tohto modulu.  module utils { requires main; }Teraz môžeme použiť triedy, ktoré boli exportnuté z main modulu:  package sk.jaro.demo; import sk.jaro.demo.external.HelloMainModuleExternal; public class UseSomethingFromMainModule { public static void main(String[] args) { HelloMainModuleExternal helloMainModuleExternal = new HelloMainModuleExternal(); helloMainModuleExternal.doAction(); } }ZáverNa záver by si sa mohol teraz s tým kúsok pohrať. Skús použiť triedu, ktorá nie je exportnutá z modulu main.  O moduloch by sa dalo písať a hovoriť viac, ale dúfam, že si porozumel princípu modularizácie. Mne v priebehu študovania tejto témy vybehlo pár otázok, na ktoré som si ešte neodpovedal. Napríklad: Maven s java modularizáciou? Frameworky a modularizácia?  Ak sa ti článok páčil, tak napíš niečo do komentárov, poteší ma to.  Zaujímaš sa o Javu? Skús jeden z kurzov na túto tému na https://skillmea.sk.  Ak sa chceš o mne dozvedieť viacej sleduj môj web www.jaroslavbeno.sk.  Jaro Zdrojové kódy na stiahnutie.
Využi toto leto: Online kurzy, za ktoré neplatíš!
Vzdelávanie
12.08.2017
Martina Baumann

Využi toto leto: Online kurzy, za ktoré neplatíš!

Ešte stále nám zostáva pár týždňov prázdnin. Čo tak využiť horúce letné dni a okrem zábavy a dovoleniek sa čosi naučiť? Nemusíš nikam chodiť, učiť sa môžeš - kedy chceš a kde chceš - v pohodlí domova alebo niekde vonku na lehátku s prístupom na internet. Kurzy nám neustále pribúdajú, to vieme všetci. Len nedávno sme si však povedali, že poďme urobiť kurzy pre všetkých zadarmo - teda aj pre teba, tvojho kamoša, suseda, otca, mamu, sesternicu. V čom je pridaná hodnota týchto kurzov? V tom, že sú dostupné zdarma, a tak môžeš ušetrené euráče minúť niekde inde. Napríklad na nejaké fajnové drinky. Letná akcia so Zlavadna.skSamozrejme, platené kurzy nám v ponuke naďalej zostávajú. Ale aj tie máš teraz šancu vyskúšať v špeciálnej letnej akcii. Ako je to možné? Nie, nevyhrali sme jackpot (teda aspoň zatiaľ nie), len sme urobili ďalší zaujímavý deal pre teba. O čom to teda hovorím? Neobmedzený prístup ku všetkým online kurzom na Learn2Code počas troch mesiacov. Čítaš dobre, naozaj to nie sú halucinácie z tepla, ale rozhodli sme sa urobiť opäť nejakú tú tučnú akciu pre teba a tvojich kamošov. Do akcie sa zapoj TU. Java pre začiatočníkovTento online kurz je už podľa názvu vhodný pre začiatočníkov tak, aby sa naučili jednoducho programovať v najrozšírenejšom a najpoužívanejšom programovacom jazyku Java. Tento kurz vysvetľuje históriu, základné pojmy, nastavenie prostredia až po rôzne výnimky a samotné programovanie. Visual Design: Dizajn vlastného tričkaV tomto kurze sa naučíte, ako si vytvoriť vlastný motív na tričko. Okrem celkového vytvorenia dizajnu sa dozviete, aké farby a nástroje si treba pri vytváraní zvoliť, taktiež sa naučíte niečo o jednotlivých nástrojoch, farebných režimoch, o formátoch ako sú JPG, TIFF a PNG. Kurz je opäť vhodný pre začiatočníkov. Základy online stratégieOnline kurz prevedie študenta základmi online marketingovej stratégie, pričom získa všeobecný prehľad a dobrý základ pre ďalšie vzdelávanie v oblasti online marketingu. Napríklad aj to, ako sa zákazníci správajú a rozhodujú pri nákupe, ako funguje nákupný model See-Think-Do-Care, podľa ktorého si môže študent navrhnúť a vytvoriť vlastnú komunikačnú stratégiu. Základy online marketinguOkrem základných pojmov z online marketingu sa študenti zoznámia s content marketingom a ako ho robiť, základy performance marketingu, social media marketingu a marketingu vo vyhľadávačoch. Lektori online kurzu tu tiež vysvetľujú, čo je to landing page a prečo je vôbec dôležitá. Kde treba hľadať tieto kurzy?Netreba nejako zvlášť hľadať, uľahčím ti to. Pohodlne sa usaď, zapni si ventilátor a klikaj SEM (nájdeš tu prehľad všetkých kurzov, ktoré sú zdarma. Stačí si len vybrať). Páči sa ti naša ponuka kurzov? Ak áno, zdieľaj toto posolstvo aj medzi ostatných kamošov.