Výsledky vyhledávání

pro ”c++” jsme našli 182 výsledků

Články (118)

Všechny články
Co je testování softwaru?
Vzdělávání
18.10.2021
Skillmea

Co je testování softwaru?

Software je třeba testovat během jeho vývoje i po každém updatu. Pokud se chceš dozvědět, co je součástí testování softwaru, proč je testování důležité, kde v procesu vývoje se testování nachází a které jazyky je dobré ovládat, pokud chceš být IT tester, čti tento článek dále. Co je testování softwaru?Testování softwaru je metoda, která kontroluje, zda skutečný softwarový produkt odpovídá očekávaným požadavkům (implicitním i explicitním) a zajišťuje, aby softwarový produkt neobsahoval chyby, resp. pomáhá s tím, aby software obsahoval co nejméně chyb a žádné kritické. Zahrnuje spuštění softwarových/systémových komponent pomocí manuálních nebo automatizovaných nástrojů. Účelem testování softwaru je identifikovat chyby, nedostatky nebo chybějící požadavky v porovnání s původními požadavky. Testování softwaru se týká procesu ověřování a vyhodnocování funkce softwarové aplikace nebo produktu. Používá se ke snížení nebo odstranění chyb a minimalizaci množství dodatečných investic, které musí společnost investovat do řešení problémů a vydávání aktualizací. Softwarový tester tedy hledá chyby, nedostatky či jiné problémy ve webových či mobilních aplikacích, desktopových produktech nebo hrách. “TL;DR: IT testeři jsou důležití, protože pomáhají vysoké kvalitě softwarových produktů, spokojenosti zákazníků a uživatelů a dlouhodobé prosperitě businessu.” Proč je testování softwaru důležité?Testování softwaru je důležité, protože neotestovaný nebo nedostatečně výkonný software může mít vliv na tisíce uživatelů. Pokud například webová aplikace, která prodává produkt, funguje příliš pomalu, zákazníci mohou být netrpěliví a koupí si podobný produkt jinde. Nebo pokud databáze v aplikaci pošle nesprávné informace pro vyhledávací dotaz, lidé mohou ztratit důvěru k webové aplikaci nebo firmě obecně. Softwarový tester pomáhá předcházet těmto druhům selhání. Testování softwaru navíc může pomoci zajistit bezpečnost uživatelů nebo osob, kterých se týká používání. Úkolem testeru je tedy vžít se do pozice uživatele daného softwarového produktu a připravit si různé scénáře, které na daném produktu v průběhu vývoje testuje. Nalezené problémy následně reportuje vývojářskému týmu, který tyto chyby odstraní. “TL;DR: Cílem testování je zajistit co nejvyšší uživatelskou spokojenost s produktem.[Image]” Typy testování softwaruExistuje několik typů testování softwaru, z nichž každý vyžaduje různý stupeň specifičnosti. Zde je seznam některých z nejběžnějších: Testování použitelnosti (Usability testing)Testování použitelnosti je nejlepším způsobem jak zjistit, zda s webovou stránkou, aplikací nebo hrou běžní uživatelé umí zacházet a pochopit, jak při jejím používání přemýšlejí. Usability testing je v podstatě způsob, jakým dokážeme ověřit výsledek své práce na reálných uživatelích. Usability testing představuje hodnocení produktu nebo služby jeho testováním reprezentativním vzorkem uživatelů. Zpravidla musí účastníci během testování splnit několik úkolů, přičemž je jejich chování a jednání pečlivě sledovány a zaznamenávány testerem. Akceptační testováníHlavním účelem akceptačního testování není nalezení chyb, ale ohodnocení připravenosti systému pro nasazení a používání. Jedná se tedy o kontrolu, zda systém funguje tak, jak má. Software v tomto případě pracuje s ostrými a skutečnými daty, testuje se, zda produkt pracuje správně v reálném nasazení a splňuje uživatelské požadavky. Integrační testováníCílem je ověřit, zda větší části softwaru spolu fungují. Tento typ testování většinou neprovádějí testeři, ale samotní vývojáři. Testuje se interakce s různými částmi softwaru, ale také s hardwarem, operačním systémem. Unit testySlouží programátorovi jako okamžitá zpětná vazba k napsanému kódu. Unit testy slouží k testování menších jednotek zdrojového kódu. Programátor napíše kód a následně pro tento kód napíše testy. Existuje přístup psaní testů před kódem, který se nazývá Test Driven Development. Test by měl testovat chování kódu za standardních i mimořádných situací. Ideální unit test je nezávislý na ostatních testech a na zbytku testovaného programu. Někdy není na první pohled vidět rozdíl mezi unit a integračním testováním. Kromě těchto testů známe další druhy testů, například. performance testy. Co potřebuješ vědět, chceš-li být testerem?I když jako IT tester nemusíš napsat ani řádek kódu, v mnoha případech jej stále musíš umět přečíst. Jako tester softwaru tvoje práce zahrnuje více než jen klikání a procházení aplikací. Musíš být schopen přezkoumat kód a hledat potenciální problémy nebo zjistit, co mohlo způsobit chybu nebo poruchu. Většina testerů provádí kromě manuálního testování také psaní automatizovaných testů. Napsat automatizované testy je ale výrazně jednodušší než naprogramovat celé aplikace. Podle portálu platy.sk je průměrná měsíční mzda IT testeru v Bratislavě téměř 2.000 Eur, takže vydat se na tuto kariérní cestu je iz finančního pohledu zajímavé. Zde je několik jazyků, které by ses měl naučit, abys maximalizoval své vyhlídky na práci testeru: • Java • Python • C# Stačí se naučit samozřejmě jeden z jazyků, může být také jiný než je v seznamu. Kromě toho budeš určitě potřebovat pořádnou dávku preciznosti a být komunikativní, jelikož budeš muset reportovat nalezené chyby, správně je pojmenovat, najít řešení a budeš dále v kontaktu s vývojářským týmem. Pokud v IT teprve začínáš, práce manuálního IT testeru je skvělý start. Manuální testování je stále tady a bude zde i nadále, jelikož má mnoho výhod, například pomocí manuálního testování umíš objevit nové chyby v aplikaci, designové chyby a další. Opět poznamenáváme, že trh v QA se neustále vyvíjí a předpokládáme, že bude chtít univerzální testery, kteří umí dobře manuálně testovat a zároveň i tvořit automatizaci. Pokud máš v plánu stát se automatizovaným testerem, máme pro tebe hned několik kurzů. Nejprve začni s kurzem Selenium, ve kterém se naučíš i Javu a JUnit. Tento kurz má také pokračování pro pokročilé. Pokud se ti více zamlouvá JavaScript, určitě mrkni kurz Cypress.io. Cypress je moderní testovací nástroj pro end to end testování.
Lambda výrazy v Javě - část III.
Tipy a triky
03.10.2019
Skillmea

Lambda výrazy v Javě - část III.

Lambda a vnitřní anonymní třídyVelmi se nám žádá říci, že lambda výrazy jsou jen zkratky jak napsat vnitřní anonymní třídy. Ale pamatuj si, není tomu tak. Vypadá to podobně, ale lambda není implementace rozhraní. Lambda je sama osobě nezávislá jiná věc. Podívejme se na příklad. Namísto toho, abychom použili implementační třídu našeho rozhraní IHelloWord, vytvoříme si vnitřní anonymní třídu. IHelloWord helloWord3 = new IHelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } };Všechny 3 možnosti, které mají jako návratovou hodnotu rozhraní IHelloWord můžeme podsunout do metody printHelloWord(IHelloWord helloWord). helloWord.printHelloWord(helloWord1); helloWord.printHelloWord(helloWord2); helloWord.printHelloWord(helloWord3); Jak to, jak to?Jak java ví, jaký má použít typ pro lamba výraz? Abychom tomu porozuměli, vytvoříme si novou třídu, kde budeme pracovat s lambda výrazem. Vytvořme si rozhraní, které bude mít jednu metodu, která bude vracet int a na vstupu bude také 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; } }Nyní si navrhněme lambda výraz, který odpovídá dané metodě. Nepotřebujeme návratovou hodnotu int, neboť java umí na ni přijít sama a nepotřebujeme ani název metody a ani modifikátor přístupu public. Náš lambda výraz bude vypadat takto: (int a) -> a*5;Nyní použijte tento lambda výraz: public static void main(String[] args) { Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10)); }Na výstupu bude 50. V tomto příkladu se lambda tváří jako instance rozhraní Nasob. V předchozích příkladech, kdy jsme používali HelloWord, jsme takovou proměnnou vkládali jako parametr metody printHelloWord (HelloWord3 v IDEi). Namísto toho jsme mohli tuto lambdu vložit přímo do metody. helloWord.printHelloWord(() -> System.out.println("HelloWord impls lambda");); Java kompilátor vezme tento lambda výraz a podívá se kam jde. Jedná se o metody printHelloWord a podívá se, co akceptuje na vstupu. Akceptuje rozhraní HelloWord. Pokud lambda sedí s požadavkem, že dané rozhraní obsahuje jen jednu metodu a ta vrací void a na vstupu nemá žádný parametr, tak java řekne, že daná lambda je typu HelloWord. Toto se jmenuje Type inference. Java si sama zjistí typ. Teď, když víš jak java dokáže zjistit typy, vrátíme se k příkladu, který jsme začali psát v této kapitole. V našem příkladu umíme ještě více zkrátit zápis našeho lambda výrazu. Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10));Jelikož naše lamba jde do metody rozhraní, kterou zná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); }Když to víme, tak nemusíme při psaní lambda výrazu znovu specifikovat typ vstupního parametru. Nasob nasobPiatimi = (a) -> a*5; A jelikož máme jen jeden parametr, nemusíme psát ani závorky. Násob napětí = a -> a*5; Už nebudeme nic mazat, neboť by nám už nic nezbylo 😃 Nyní můžeme napsat metodu, která bude na vstupu očekávat rozhraní Nasob a když ji použijeme, tak do ní 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 jevu mohli klidně vytvořit nový typ pro tyto lambda výrazy. Ale neudělali to a jedním z důvodů je i zpětná kompatibilita se starším kódem. Jak už víme, tak lambda výrazy můžeme použít všude tam, kde máme vyhovující rozhraní. Ve vnitřních anonymních třídách, v metodách kde je na vstupu interface a podobně. Pří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"); Při tomto musíme pamatovat, aby rozhraní byla jedno metodová nebo aby ostatní metody rozhraní byly default. A dané metody v rozhraních, aby se shodovaly s lambda výrazem. Takové rozhraní s jednou abstraktní metodou (metoda, která poskytuje popis ne implementaci) se nazývá Functional interface. Představ si, že používáš rozhraní, které má jen jednu metodu a používáš ho pro lambda výrazy. Nyní by někdo cizí přišel a do tohoto rozhraní by přidal další abstraktní metodu, přesněji její popis bez implementace. Takové rozhraní by již více nebylo functional interface a proto by se nemohlo použít pro lambda výraz a nastala by chyba - přestože rozhraní by bylo v pořádku. Třeba na to myslet a pokud chceme něco přidat do functional interfac, tak jen jako default metody. Abychom upozornili kohokoli, kdo by chtěl něco přidat do našeho rozhraní, tak máme možnost přidat anotaci @FunctionalInterface. K anotacím se ještě dostaneme, tak se nebojte. Nyní je důležité vědět, že je to pomůcka – tato pomůcka nám udělá to, že jakmile napíšeme další metodu do našeho rozhraní, tak nastane chyba. Danou anotaci nemusíme psát, ale je to super. @FunctionalInterface public interface HelloWord { void sayHello(); }Příklady na vyzkoušení: 1. vytvoř si seznam míst 2. setřiď seznam 3. napiš metodu, která vypíše vše ze seznamu míst 4. udělej si metodu, která vypíše jen ta města, která se skládají z jednoho slova nepoužívej při tom lambda výrazy Pokračování příště 👋 Články a online kurzy o Javě pro tebe připravuje Jaro Beňo.
Veronika Čiefová: Jaká pravidla a rituály si vytvořit při práci z domova?
Rozhovory
16.06.2022
Tím Skillmea

Veronika Čiefová: Jaká pravidla a rituály si vytvořit při práci z domova?

Veronika Čiefová se ve své firmě věnuje kariérním a psychologickým konzultacím. Člověk má často nějaký problém v kariéře, neumí se rozhodnout, kterým směrem se vydat, vidí buď více nebo žádné možnosti, zda se necítí motivovaný.  S Veronikou prostřednictvím rozhovoru hledají, co je pro člověka to pravé. Spolu si kladou otázky jako: Co vás v minulosti bavilo? Co vám dávalo energii? V jakém bodě se to změnilo? Podle odpovědí se snaží přijít na to, které části života pro něj znamenají hodně, co ho umí nadchnout a co mu odebírá energii.  V podcastu s Veronikou jsme rozebrali, co všechno má vliv na spokojenost v práci, duševní zdraví a zda je finanční ohodnocení ten nejdůležitější faktor. V tomto článku se podíváme na Veronikiny doporučení pro práci z domova.  Práce z domova se stává stále častějším trendem v dnešní době a pro mnohé zaměstnance je to skvělá možnost ušetřit čas a peníze za cestu do zaměstnání. Nicméně, práce z domova může být náročnější, není-li správně zorganizována. Aby bylo možné efektivně pracovat z domova, je důležité vytvořit si pravidla a rituály, které vám pomohou udržet produktivitu a vyhnout se stresu a vyhoření. [Pravidlá a rituály pri práci z domu] ➡️  Jaká pravidla a rituály si vytvořit při práci z domova? 🕒 Časové odděleníZákladem je vytvořit strukturu času, kdy pracujete a kdy odpočíváte. Vytvořte si rituály přechodu z jedné fáze do druhé, jako například oblékání do pracovního oblečení před prací. Je důležité nepracovat v pyžamu. Sprcha nebo procházka po skončení práce také vytváří ideální přechod mezi prací a odpočinkem. Někteří lidé využívají také tzv. "fake commuting", kdy před začátkem a po skončení práce z domu nasednou do auta a převezou se dvě ulice.  🏠 Prostorové odděleníIdeální je mít dedikovanou místnost pro práci. Domácí pracovna by se určitě neměla nacházet v ložnici, lidé mají pak častěji problém s usnutím. Pokud není možné vyhradit na pracovnu celou místnost, postačí kout místnosti nebo třeba židle, na které sedíte pouze během pracovní doby. 🛌 Připravení mysli na spánekJe důležité nepracovat alespoň 2 hodiny před spánkem a hodinu před spaním se vyhnout dívání do počítače, mobilu nebo televize. Je lepší pomalu utišovat mysl čtením knihy nebo pobytem v méně osvětlené místnosti, aby se naladila na spánek. 🧒 Rozdělení služeb u dětíV případě, že máte děti v domácnosti během pracovní doby, doporučuje se domluvit si strukturu s partnerem nebo partnerkou, kdo bude v daném čase "na službě". Když děti budou něco potřebovat, tak se ohlásí dopoledne pouze na jednoho a odpoledne pouze na druhého partnera. Vyhradí se tak klidnější prostředí, alespoň na nějakou část pracovní doby.  [Podcast s Veronikou Čiefovou a Radovanom Debnárom]Celý rozhovor s Veronikou si můžete poslechnout ve třetí části Skillmea podcastu: Co má vliv na spokojenost v práci a jsou peníze nejdůležitější?, který najdete na našem YT kanály. Pokud vás zajímá kariérní poradenství, doporučujeme Veronikin kurz Kreativní rozhodování o kariéře. 
Lambda výrazy v Javě - část IV.
Tipy a triky
30.10.2019
Skillmea

Lambda výrazy v Javě - část IV.

Funkcionální rozhraníPokud chci používat lambda výraz, tak potřebuji k tomu rozhraní s jednou abstraktní metodou. Daná metoda musí odpovídat popisu našeho lambda výrazu. Pokud se nad tím zamyslíš, tak ve skutečnosti se dané rozhraní může jmenovat ledajak. Na názvu nezáleží. A i metoda v tom rozhraní může mít ledajaký název, pro logiku lambda výrazu to nemá žádný smysl. Jediné, co je důležité je, aby metoda seděla s lamba výrazem v tom, co vrací a to, co je na vstupu metody jako parametr. Bylo by naprosto super, kdybychom nemuseli vždy při psaní lambda výrazu řešit vytvoření nového rozhraní, které nám bude sloužit jako typ daného lambda výrazu. Co řekneš? Řekli jsme si, že java nevytvořila nový typ pro lambdy. Při psaní, jsme si mohli všimnout, že metody jsou často podobné. Vracím nějaký typ nebo vracím void a mám tam název metody tam jsou nebo nejsou parametry. Jsou zde nějaké paterny, nějaké vzorce, které se opakují častěji. Java nám nabízí několik takových rozhraní, která můžeme klidně použít. Tato rozhraní jsou v balíčku java.util.function. V tomto balíčku je mnoho před připravených rozhraní, které můžeš používat. Tato rozhraní používají generika, tak si tam umíš dosadit objekty jaké potřebuješ. Například Predicate je přesně stvořený k tomu, pokud potřebujeme vzít na vstupu objekt a vrátit boolean jako návratovou hodnotu. Takto můžeme použít toto rozhraní namísto toho rozhraní, co jsme si sami napsali, když jsme řešili předchádzající úlohu.  Jak ošetřit výjimkyUdělejme si příklad, který bude obsahovat seznam osob, které budu zpracovávat – vypíšeme jejich jména a dáme je na velká písmena. 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()); } } } Přepíšeme si to na lambda výraz. Náš kód, který chceme metodě prodat jako argument je System.out.println(osoba.getMeno().toUpperCase()). Pracuji tedy jen s objektem osoba. Výsledek napíšu na konzoli. Tím pádem mám jeden argument a tento kus kódu nevrací žádnou hodnotu. Budeme k tomu potřebovat funkcionální rozhraní, které má metodu s jedním parametrem a nevrací nic. Takovým je Consumer s jeho metodou 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); } } } Nyní si náš seznam osob změním tak, že místo jmen dám do seznamu null. Při zpracovávání 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šetřit tuto výjimku. Jak na to? Jedním ze způsobů je obalit volání 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 ošklivé řešení. To co přijde do consumer může být leccos možné a nemusí to dát NullPointerException, možná to bude jiná výjimka. Náš kód chceme mít jednodušší. Druhou možností je, aby byla výjimka zpracována přímo v lamba výrazu. 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); } } }Dosáhl jsem toho, že metoda processOsoby je krásnější, ale náš lambda výraz je nyní víceřádkový a ne pěkný - jednořádkový. Na jedné straně chceme mít pěkné jednoduché lambda výrazy, na druhé straně chceme, aby bylo postaráno o výjimky. V našem kódu se vraťme k řešení, které nepoužívá try catch blok. K odchycení výjimky použijeme wrapper metodu. Try catch blok si vyvedeme do zvláštní metody a poté obalíme náš lambda výraz, dalším lambda výrazem, který má try catch blok. Udělejme to, co jsem teď napsal. Vytvoříme novou metodu, která bude akceptovat lambda výraz. V našem případě jsme k tomu použili Consumer rozhraní. A protože je to wrapper, tak to co mi přijde na vstup tak dám i na výstup. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; }V metodě processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); zavolám místo lambda výrazu, wrapper metodu, jejíž argument bude lambda výraz. Udělá to totéž, ale použil jsem wrapper metodu. 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; } }Tady můžu udělat následující věc. Namísto toho abych lambdu přehnal přes wrapper metodu, tak ji ani nepoužiji, ale použijeme jen její vstupní parametr, což je osoba. Mohu udělat něco takového: private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> System.out.println(osoba.getPriezvisko()); }Namísto toho, abych využil vstupní lambdu, která mi přišla přes parametr consumer, jsem na ni zapomněl a jen jsem využil vstupní parametr dané lambdy a vytvořil jsem novou lambdu. Při volání consumer.accept(osoba); v metodě processOsoby se provede lambda výraz z wrapper metody. Toto není skutečný wrapper. Skutečný wrapper, vezme vstupní lambdu a provede co požaduje. Nyní máme jistotu, že se zavolá přesně náš požadovaný lambda výraz a zároveň můžeme přidávat kód kolem. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> consumer.accept(osoba); }Zde přichází nářad try catch blok v wrapper metodě. Upravíme si kód, aby nám házel výjimku. 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"); } }; } }Pokud se zastavuješ při myšlence, že jsme nic nezjednodušili, jen jsme přesunuli kód na jiné místo, tak máš pravdu, ale! Pokud si danou metodu uděláš generickou, tak si do této metody můžeš zabalit ledajakou lambdu, jejíž typ je Consumer rozhraní. Škoda, že tvůrci jevy neudělali takové wrapper metody pro všechna funkcionální rozhraní 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čovat s Lambda výrazy budeme opět v dalším článku. Mé jméno je Jaro Beňo a naučím tě programovat v Javě. Ahoj.
EU Code Week: Evropský týden programování
Události
06.10.2019
Skillmea

EU Code Week: Evropský týden programování

Ve dnech 5.–20. října 2019 vrcholí sedmý ročník Evropského týdne programování, tzv. EU Code Week. Dobrovolníci z řad učitelů, institucí a nadšenců z více než 70 zemí se budou snažit prostřednictvím aktivit představit nové vzdělávací možnosti a materiály, aby tak zvýšily zájem o programování a zatraktivnily jeho výuku. Proč se zapojujeme i my?Hodiny informatiky na základních a středních školách jsou ne vždy vedeny zábavnou a poutavou formou. Jen si vzpomeň na ty své. Digitální gramotnost se však pro uplatnění na trhu práce stává klíčovou a o tom, jakou roli by měla hrát ve vzdělávání není třeba vést diskuse. Něco o tom víme iv Learn2Code, kde se nás denně obracejí lidé s otázkou, kde s programováním začít. Proto jsme se i my s podporou spoločnosti Google opět staly součástí iniciativy EU Code Week, abychom podpořili digitální vzdělávání na školách a pomohli dětem rozvíjet znalosti a dovednosti, které jim pomohou realizovat nápady a usnadní orientaci v digitálním světě. Pokud se v něm totiž budou správně orientovat již nyní, budou lépe připraveni využívat jeho přínosů a čelit jeho nástrahám.[Image] Tento rok sa s Learn2Code vydáváme na východ Slovenska do Košic a okolí, kde se prostřednictvím workshopů budou moci děti na více základních školách seznámit s programováním v prostředí Scratch, který se díky své jednoduchosti výborně hodí pro výuku programování, vytváření interaktivních her a animací. Kromě Scratchu máme pro děti připraveny i zážitkové hodiny s roboty Ozoboty a programování her v jazyce JavaScript pro pokročilejší. Letos jsme spojili síly is leadership programem Teach for Slovakia a některé ukázkové hodiny zorganizujeme na školách zapojených do TfS. Pokud chceš vědět, jak to na takovém našem workshopu vypadá, můžeš si prohlédnout tento sestřih z roku 2016. Jak se můžeš zapojit?Evropský týden programování je nezávislá iniciativa dobrovolníků s podporou Evropské komise, do které se může zapojit kdokoli, tedy i ty. Můžeš být učitel, vést programátorský kroužek nebo se zkrátka dobrovolně angažovat v digitálním vzdělávání. Stačí, když uspořádáš programátorskou aktivitu #CodeWeek a přidáš ji na mapu na stránce codeweek.eu. Na stránce navíc najdeš návod a propagační materiály, které ti s realizací pomohou. Pokud si na něco podobného netroufáš, můžeš tuto akci podpořit i použitím hashtagu #codeweek. 
Jak zjistit, zda je číslo zadané ze vstupu prvočíslem?
Tipy a triky
16.10.2019
Skillmea

Jak zjistit, zda je číslo zadané ze vstupu prvočíslem?

V 15. kapitole online kurzu vyššího programovacího jazyka C++ úrovně Elementary II najdete mezi zadáními praktických příkladů pro domácí procvičení i úlohu, ve které máte najít největší společný dělitel dvou čísel a také úlohu, ve které máte najít nejmenší společný násobek dvou čísel nebo jejich největší společný dělitel.   Sáhnete-li do osnov matematiky druhého stupně základní školy někde do 6. nebo 7. ročníku, zjistíte, že klíčem k vyřešení těchto dvou úkolů je rozklad obou čísel na součin prvočísel. Úkoly patří z hlediska logiky a analytického myšlení mezi začátečnické. Přesto vím, že jsou náročnější. Právě proto jsem se rozhodl napsat tento blog. V tomto blogu nechci řešit tento úkol za vás, ale alespoň bych vám rád podal návod, jak zjistit, zda je načtené číslo ze vstupu prvočíslem. Tento úkol je jeden z dílčích úkolů, které je třeba řešit při dvou zmíněných příkladech, jejichž řešení jste dostali za úkol najít. Ti, kteří zapomněli, co je prvočíslo, ozřejmím i tento pojem. Prvočíslo je celé kladné číslo, které je dělitelné pouze jednotkou a svojí vlastní hodnotou. Budeme se tedy pohybovat pouze v množině kladných celých čísel. Příkladem prvočísla může být např. číslo 5, protože je dělitelné pouze číslem 1 a 5. dalšími příklady jsou 2, 3, 7, 11, 13, 17 atp. Samotné číslo 1 se za prvočíslo nepovažuje. Řekněme, že máme číslo 60, jeho rozklad na součin prvočísel je 2 x 2 x 3 x 5. Už z rozkladu je zřejmé, že jej můžeme vynásobit číslem 1, nic by to totiž nezměnilo na výsledku, pořád byste dostali číslo 60. Vidíte , a právě proto se matematici dohodli, že 1 prvočíslem nebude, nemá totiž již žádný vliv v součinu prvočísel, jehož výsledkem je nějaké číslo. Takže bez zbytečných dalších prázdných frází přejdu rovnou k věci. Následuje tedy zdrojový kód v jazyce C++, který řeší titulek tohoto 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 řádku 01 je uvedena direktiva preprocesoru #include, jejímž parametrem je standardní knihovna iostream. Potřebujeme ji z důvodu používání objektů cout, cin a manipulátoru endl. Na řádku 02 uvádíme v platnost jmenný prostor std pro celý zdrojový soubor .cpp. Zmíněné objekty cout, cin a manipulátor endl je zároveň součástí tohoto prostoru. Na řádku 04 je uvedena funkce main i se svým návratovým typem, kterým je int (integer). Tuto funkci volá operační systém. Na řádku 05 je uvedena levá programová závorka, kterou začíná tělo funkce main. Na řádku 06 je deklarována proměnná iNumb pro datový typ int. Tato proměnná reprezentuje hodnotu celého kladného čísla, o kterém chceme zjistit, jestli patří mezi prvočísla. Na řádku 08 je pomocí objektu cout zapsán na výstup konzolové aplikace textový řetězec, který vyzve uživatele k zadání hodnoty kladného celého čísla, jehož vlastnost prvočísla testujeme. Na řádku 09 je prostřednictvím objektu cin načtena tato hodnota do proměnné iNumb. Na řádku 10 je prostřednictvím objektu cout a manipulátoru endl přesunut kurzor konzolové aplikace na další řádek. Na řádku 12 je deklarována proměnná flag a zároveň inicializována na hodnotu true. Tato proměnná nám bude po otestování načteného čísla ukládat informaci, zda je číslo prvočíslem nebo ne. Z hlediska logiky algoritmu je nutno proměnnou flag inicializovat před testováním na hodnotu true. Algoritmem budeme totiž testovat, zda načtené číslo mezi prvočísla nepatří. Používá se zde tedy postup vylučovací. Na řádku 14 je testována podmínka, zda v proměnné iNumb není hodnota 1. Pokud ano, program pokračuje kladnou větví a do proměnné flag se na řádku 16 zapíše hodnota false, která reprezentuje stav, kdy načtené číslo prvočíslem není. Na řádcích 13 a 15 jsou pouze uvedeny programové závorky, které uzavírají blok kódu uvedený v kladné větvi. Pokud zmíněná podmínka splněna není, pokračuje se zápornou větví. Blok kódu v záporné větvi uzavřen programovými závorkami na řádcích 19 a 29. Na řádcích 20 až 27 je uvedeno jádro algoritmu, který testuje vlastnost prvočísla u čísel větších než 1. A v čem spočívá idea jádra algoritmu? V každé iteraci cyklu zjišťujeme, zda je číslo dělitelné hodnotou v proměnné i. Nejmenší číslo, kterým může být načteno testované dělitelné, je číslo 2 (viz. řádek 20 – for smyčka) a proto iterujeme od této hodnoty. Proměnnou i postupně inkrementujeme (viz. řádek 20 – for smyčka) a testujeme, zda je hodnota proměnné iNumb dělitelná beze zbytku pomocí operace modulo na řádku 22, která je umístěna v příkazu if. Pokud je číslo dělitelné hodnotou v proměnné i beze zbytku, tak se na řádku 24 uloží do proměnné flag hodnota false, což reprezentuje stav, kdy načtené číslo není prvočíslem. Proměnná i se inkrementuje po iNumb/2 (viz. řádek 20 – for smyčka). Důvodem je fakt, že žádné celé kladné číslo nemůže být přece dělitelné beze zbytku číslem větším než je jeho polovina. Nenajde-li se tedy číslo, kterým je načtená hodnota testovaného čísla dělitelná beze zbytku, neuloží se do proměnné flag hodnota false, čili po ukončení v ní bude uložena hodnota true, což reprezentuje stav, kdy je načteno testované číslo prvočíslem. Na řádku 25 je uvedeno klíčové slovo break a to z toho důvodu, že v případě nalezení jednoho čísla, které dělí načtené testované číslo beze zbytku, není nutné hledat další dělitele. Testované číslo už prvočíslo totiž být nemůže a proto násilně ukončíme smyčku for, urychlíme program, který následně přejde až na řádek 30. Zde se už jen testuje hodnota v proměnné flag. Pokud je v této proměnné uložena hodnota true, tak se zapíše na výstup konzolové aplikace pomocí objektu cout informace o tom, že je načteno testované číslo prvočíslem (viz. řádek 32), pokud false tak informace, že prvočíslem není. Na řádcích 41 a 42 je již jen načítán vstup z konzolové aplikace pomocí objektu cin, což slouží k tomu, aby se hned program neukončil a byl zobrazen výsledek v okně konzole, dokud uživatel nezatlačí libovolná klávesa. Na řádku 44 vrací funkce main operačnímu systému hodnotu 0, která indikuje stav správného ukončení aplikace. Na řádku 45 je ukončeno tělo programu pravou programovou závorkou. Algoritmus, který jsem navrhl a implementoval v jazyce C++, není ještě optimální. Je však pro účely kurzu úrovně začátečník dostačující. Mezi prvočísly lze ještě sledovat určité vlastnosti, nebudu je však tomto bloku vzpomínat, abych příliš posluchače úrovně začátečník zbytečně nadměrně nezatížil. Optimální algoritmus však budu ještě publikovat a rozebírat v dalším bloku a v kurzu, který bude zaměřen i na matematiku. Autorem blogu je Marek Šurka, lektor online kurzů jazyka C++ na Learn2Code.
Jak na vlastní Virtuální privátní server - část 1.
Vzdělávání
21.01.2021
Lubo Herko Edited

Jak na vlastní Virtuální privátní server - část 1.

Každý týden jeden blog. Takové jsem si dal předsevzetí do nového roku. Hned první týden se to nepodařilo, ale co už 🤦🏻‍♂️ . V tomto textu (nebo seriálu?) budeme řešit tvůj vlastní Virtuální privátní server (VPS). Konkrétně: • zjistíme co to VPS vlastně je a jaké jsou výhody a případné nevýhody, • zkusíme analyzovat naše potřeby a vybrat vhodné parametry našeho serveru, • VPS koupíme, nastavíme, zajistíme a připravíme pro naši aplikaci, • z GitHub repozitáře nasadíme naši aplikaci do produkce pomocí GithubActions (CI), • koupíme doménu a nasadíme SSL certifikát pomocí letsencrypt. Je to hodně práce, pome na to.[Image] K čemu mi je vlastní server?Hned na začátku si to vyjasněme: VPS je pro většinu projektů zbytečný. Při dnešních možnostech, jak svou aplikaci umíme nasadit do produkce a zpřístupnit ji uživatelům na pár kliků, je často zbytečné řešit komplikované nastavování vlastního serveru. Hlavně údržba a řešení případných problémů nám může připomenout, jak špatně jsme se rozhodli. Přesto VPS má své místo a někdy se opravdu může hodit, například: • pokud máš linux v malíčku, nebo svůj VPS už máš (jsi zkušený/á), • pokud výkon sdíleného hostingu viditelně nestačí a už neumíš svou aplikaci dále optimalizovat, • pokud nepostačují dostupné technologie sdíleného hostingu (potřebuješ doinstalovat vlastní knihovny, tooly), • pokud má aplikace extrémní nároky na výkon procesoru, velikost paměti, nebo potřebuješ ukládat gigabajty/terabajty dat, • pokud jsou data, se kterými pracuješ příliš senzitivně na to, aby byla uložena na jednom místě spolu s daty jiných uživatelů sdíleného hostingu. Asi bychom našli i další případy, specifika, kdy se hodí VPS, tyto nám však prozatím postačí. Pokud tedy spadáš do některého z kritérií, čti dále. Jaký výkon serveru potřebuji?Brzdí. Než přistoupíme ke koupi serveru bychom měli vědět, jaké jsou naše požadavky. Alespoň přibližně. Potřebujeme spoustu jader procesoru? Nebo si vystačíme s jedním, případně dvěma jádry? Potřebujeme spoustu operační paměti, nebo terabajty dat na disku? To jsou těžké otázky, ale poradím ti: • Pokud aplikace neexistuje a chceš VPS jen vyzkoušet, zvol nejlevnější server jaký je v nabídce. Zda máš 1 procesor, nebo 32 procesorů - terminál reaguje vždy stejně rychle. • Pokud je aplikace nová a neznáš její nároky, začni raději s méně výkonným a levnějším serverem. Například CPU s jedním nebo dvěma jádry a 2G RAM. Většina providerů disponuje jednoduchým škálovacím nástrojem. Pokud se zvýší nároky, pohneš v administračním rozhraní nějakým sliderem a šup, máš o dvě jádra více, případně dvojnásobek RAM - do pár vteřin. • Pokud jsi narazil na limity sdíleného hostingu, pravděpodobně znáš důvod, proč chceš vyzkoušet VPS. Nejlepší pokud si komunikoval s podporou svého providera a potvrdili, že jsi narazil na limit jejich CPU, nebo RAM. Kde koupit server?Takže, pokud víme alespoň přibližně co chceme, udělejme průzkum. Osobně mám vyzkoušených těchto prodejců VPS: • Linode, DigitalOcean, Hetzner, WebSupport Ubuntu Server a terminál bude u každého prodejce stejný. Řídit se tedy můžeme podle následujících kritérií: 1. cena 2. ještě jednou cena 3. možnosti administračního rozhraní a případného navyšování výkonu do budoucnosti 4. lokalita datového centra (co nejblíže uživatelům) Moje zkušenost V poslední době to u mě osobně vyhrává Hetzner (hetzner.de). Frajeři mají vynikající ceny (vlastní server v době psaní tohoto textu umíš získat již za 3E/měsíc) a navyšování počtu CPU a RAM je řešeno jednoduchým sliderem v administračním rozhraní. Super věc 🎉. Datové centrum můžeš zvolit relativně blízko – Falkenstein, Nemecko. TIP: V levém horním rohu změníš jazyk webu z německého na anglický. 😎 Vytvoření účtu HetznerJak se už konečně tedy dostaneme k vlastnímu serveru? Takto: 1. Vytvoř si účet na hetzner.de (klik) 2. Klikni na linku, kterou ti Hetzner poslal na email zadaný při registraci 3. V sérii formulářů vyplň své iniciály (poslední formulář vyžaduje údaje o platbě, žádná platba předem však není nutná) 4. Po vyplnění a odeslání formulářů se implicitně zobrazí formulář - nastavení tvých iniciál. Vpravo nahoře klikej na čtverečky a vyber z nabídky možnost "Cloud": Pokud máš po absolvování předchozích kroků před sebou takovou obrazovku:[Konzole cloudu Hetzner.de. je vše v pořádku.] Můj server!Už jsme blízko. V seznamu projektů (předchozí obrázek) klikni na "Default" (tento název umíš změnit přes ikonu tří teček v pravém horním rohu karty produktu) a následně "Add server".[Vytvoření nového VPS.] Parametry serveruNyní zvolíme parametry serveru. V tomto případě zvolíme nejlevnější variantu, ale některé možnosti popíšeme blíže. Parametry serveru tedy nastavíme následovně: 1. Location (umístění datového centra): Falkenstein, protože je nejblíže Slovensku. 2. Image (operační systém): Ubuntu 20.04, protože s ním umím pracovat a také existuje obrovská komunita uživatelů Ubuntu serveru, což usnadní vyhledání návodů a řešení případných problémů. Se serverem Ubuntu bude dále pokračovat i tento tutoriál. 3. Type (typ serveru): Standardní, protože nám nevadí, že spolu s naším VPS budou na fyzickém serveru běžet i jiné virutální servery. Dedikovaný typ serveru je vhodný jen tehdy, potřebujeme-li opravdu velký výpočetní výkon pro naše použití. Z dalších možností typu serveru vyberme hned první s označením CX11 a tedy 1x VCPU, 2GB RAM, 20GB SSD v ceně €2.99 za měsíc. 4. Volume (externí disk): Nevytváříme externí disk. 1. TIP: Pokud vytvoříme VPS o velikosti SSD 20GB a potřebujeme více dat, nemusíme hned měnit velikost SSD na serveru, ale můžeme připojit k serveru externí disk. Má to jednu velkou výhodu a jednu menší. Velkou výhodou je, že v případě zvyšování výkonu (např. z 1CPU a 2GB RAM na 4CPU 8GB RAM) můžeme zvolit možnost, že nechceme navyšovat i velikost SSD – tedy SSD zůstane na hodnotě 20GB. Takové rozhodnutí nám v budoucnu umožní i krok zpět a tedy snížení počtu VCPU a RAM. Takto můžeme ušetřit nemálo finančních prostředků, pokud potřebujeme zvýšit výkon VPS jen dočasně, ne natrvalo (např. pokud je aplikace přetížena jen v období Vánoc). 5. Network (síť): Nevytváříme síť, protože nevytváříme skupinu serverů, které potřebujeme mít na jedné síti (např. pokud bychom potřebovali zvlášť VPS pro webserver a databázový server). 6. Additional features (další možnosti): V případě možnosti User data nespekulujeme (zatím). To se nám může hodit tehdy, chceme-li některé činnosti automatizovat, například automaticky přidat uživatele do systému, spustit různé skripty po instalaci a podobně. Backups jsou pravidelné zálohy, což je nutnost na produkčním serveru, kde běží ostrá aplikace. Tato služba je však zpoplatněna – 20% z ceny našeho serveru. Pokud tedy vytváříš produkční server, nafurt, tak doporučuji i se zálohami. Pokud jen testuješ, tak je to na tobě 😉 . 7. SSH Key (SSH klíč): Pokud máš zkušenosti s *nix systémy, možná máš vytvořený svůj id_rsa.pub klíč. Pokud ano, tady ho můžeš použít a tak se autentifikovat při připojování k serveru. V opačném případě (a to je náš případ) ti bude zasláno heslo k root uživateli na tvůj email. Tady tedy nespekulujeme a zatím nezaškrtneme tuto možnost. 1. TIP: Povolit vzdálený přístup pro root uživatele není bezpečné a používá se pouze pro prvotní nastavení serveru (první přihlášení do nového VPS). Jedním z prvních kroků po přihlášení se do nového VPS by mělo být vytvoření vlastního uživatele, který se bude přihlašovat pomocí klíče (ne hesla) a zakázání vzdáleného přístupu pro root uživatele. To bude také náš postup. 8. Name (Název): Toto je název serveru, který je zobrazen v administračním panelu hetzner, ale iv konzole po připojení k serveru přes SSH protokol. TIP: Vzpomeň si na nějaké názvy světů, postav z tvých oblíbených počítačových her, komiksů nebo filmů 😎 . Hodně čtení kvůli pár klikům. Nastavení serveru tedy může vypadat i takto:[Nastavenie parametrov VPS.] První SSH spojení Po potvrzení nastavení chvíli počkáme na spuštění nové instance našeho VPS. Zároveň nám Hetzner doručí email s informacemi o IP adrese, na kterou se budeme připojovat a heslem pro root uživatele. Tak zkontroluj email a pojď se přihlásit na server přes SSH. Jaký program použít k přihlášení přes SSH? Pro MacOS je to Terminal nebo iTerm. V případě linuxu (jakéhokoli) je to velmi podobné MacOS - tedy opět Terminal. Uživatelé Windows mohou použít pro SSH připojení program Putty, případně nainstalovat WSL doplněk a použít WSL terminal. Napiš nám pokud se setkáš s nějakým problémem, pořešíme. Z emailu jsem se dozvěděl, že IP mého serveru je 78.47.244.57 a heslo k uživateli root je ss3PgfWnHwxUhUaKEEr9 (ani nezkoušej, server v době čtení tohoto textu již nebude existovat).[Email s autorizáciou do nášho VPS.] TerminalPříkaz ssh, který použijeme v MacOS, Linux nebo WSL terminálu má následující syntax: ssh pouzivatel@ip_servera Tedy v našem případě: ssh root@78.47.244.57 Terminál si vyptá heslo, můžeme ho jen zkopírovat a přilepit. Při zadávání hesla do terminálu se nezobrazují žádné hvězdičky ani odezva. Proto jen potvrdíme příkaz klávesou Enter. Pokud se na server připojujeme poprvé, SSH se zeptá, zda chceme server uložit do seznamu SSH serverů. Napíšeme yes a spojení se v případě správného hesla úspěšně naváže:[Image] První připojení k serveru přes SSH. Při prvním přihlášení je nutné změnit heslo uživatele root. Zadáme staré heslo a vytvoříme nové. Hotovo. Náš nový VPS server Ubuntu 20.10 je vytvořen. Co dál?V další části blogu budeme pokračovat s nastavením našeho serveru: 1. vytvoříme si na lokálním počítači SSH klíč 2. vytvoříme na serveru vlastního uživatele a nastavíme přihlašování přes SSH klíč 3. zajistíme server pomocí firewallu, fail2ban a jiných nástrojů 4. nainstalujeme a spustíme webový server (nginx) 5. nainstalujeme a spustíme databázový server (postgresql, pokud budeš potřebovat tak i MySQL) 6. nainstalujeme závislosti (git, nodejs, ...) Ve třetí části budeme řešit deploy naší aplikace na VPS: 1. koupíme doménu a nasměrujeme ji na server 2. naklonujeme naši aplikaci na server, spustíme ji pod doménou a vytvoříme k ní službu (systemd service aby se automaticky spustila při případném restartu serveru) 3. pomocí certbot nastavíme doméně SSL certifikát a zpřístupníme aplikaci pod HTTPS 4. pomocí GithubActions nastavíme continous integration tak, aby se po push do main branche spustily automatizované testy a v případě bezchybnosti se aplikace rovnou nasadí do produkce Hodně roboty máme. Ale hodně se také naučíme. Čtvrtá část není.
Co bys měl vědět o Předplatném online kurzů pro rok 2018
Novinky
16.11.2017
Skillmea

Co bys měl vědět o Předplatném online kurzů pro rok 2018

Předplatné Learn2Code online kurzů jsme letos trochu upravili a máš možnost si jej objednat nebo prodloužit za výhodných podmínek. Vždyť čti dál. Cenu ročního přístupu jsme snížili z 249 Eur na 199 Eur a kromě toho, pokud si předplatné objednáš například v listopadu, přístup získáš až do konce prosince 2018. Máš tak od nás další měsíc studia programování, online marketingu nebo designu grátis .  Co všechno u nás najdešJiž téměř 40 online kurzů můžeš studovat na Learn2Code platformě. Další kurzy budou neustále přibývat, zmíním jen ty nejzajímavější, na které se asi nejvíc těšíš: • Python pro začátečníky • Android Developer • JavaScript série • VBA programování • Adobe Illustrator • a mnoho dalších témat Toto vše máš za 199 Eur, což je přibližně 15 Eur na měsíc , pokud přičteme i prosinec 2017 jako bonusový měsíc, který dostáváš zdarma. A to se vyplatí, protože dostaneš desítky kurzů, stovky hodin videomateriálu, certifikáty o absolvování kurzů, podporu od lektorů v diskusích. Předplatné jako dárekNevíš, čím obdarovat sebe nebo své blízké na Vánoce? Máme pro tebe super tip - Learn2Code Předplatné :) Vzdělávání je ta nejlepší investice do budoucnosti pro tebe nebo tvé blízké. A proto nám napiš email a vystavíme ti dárkový poukaz.[Image] Garance včetně penězLearn2Code kurzy prošly stovky spokojených studentů, nekupuješ tedy kočku v pytli. Pokud sis přesto nejistý, jestli se ti bude online forma vzdělávání zamlouvat a zda ti bude vyhovovat, garantujeme ti vrácení peněz v ochranné lhůtě 14 dnů. V případě, že tedy nebudeš s našimi kurzy spokojen, vrátíme ti plnou částku zpět. O vrácení peněz nás požádej emailem do 14 dnů od tvé objednávky.[Image] Pojď do toho! Veškeré info a přihlašování do předplatného  najdeš na této stránce . Pokud máš nějaké dotazy nebo nejasnosti, napiš nám email nebo zavolej :)