Výsledky vyhledávání

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

Články (126)

Všechny články
Co je nového v Bootstrap 5
Novinky
02.07.2020
Lubomir Herko

Co je nového v Bootstrap 5

Od poloviny června máme přístup k první alpha verzi Bootstrap 5. Kromě nové verze loga v sexy závorkách {B} se dočkáme i obrovského množství vylepšení na všech frontách. Už samotná dokumentace je ukázkou vylepšeného vzhledu a funkcionalit. Pokud se neumíš dočkat a chceš nový Bootstrap vyzkoušet ASAP, začni tady. Je to stále Alpha verze, nedoporučuji ji proto nasadit do žádného projektu. Než dostaneme první betaverzi, může projít změnami, které Ti vyrobí více práce než pomoci. Toto je "sestřih" nejvýraznějších změn, které jsme popsali přesně pro Tebe. Na míru. [Image] JavaScriptUž žádná podpora pro jQuery, i když..Pro některé killer feature, pro jiné nic podstatného. Nový Bootstrap 5 nebude již obsahovat jQuery jako jednu ze svých závislostí (i přesto, že jQuery „asi“ stále žije a v dubnu letošního roku jsme dostali novou verzi jQuery – 3.5). Víme to už dávno, už jsme se na to jen těšili. Ještě nemáme oficiální konečná čísla, ale očekáváme, že Bootstrap díky této zásadní změně ztratí jak na kilobajtech, tak na milisekundách. Pokud si rozumíme 😉 Pokud však stále jQuery ve svém projektu potřebuješ, Bootstrap o tom bude vědět a všechny komponenty přidá k modulům jQuery. V zásadě to znamená, že stále bude možné inicializovat například Tooltip komponent takovým (starým) způsobem (v případě, že Bootstrap detekuje přítomnost jQuery): $('[data-toggle="tooltip"]').tooltip(); Button pluginZměnami projde i state-management tlačítek. Ty využíváme například i jako indikátory ZAP/VYP při různých funkcionalitách našich aplikací. Ve starších verzích Bootstrap stav tlačítka řešil JavaScript. Bootstrap 5 se snaží state-management řešit v co nejvyšší míře dostupnými funkcionalitami a elementy HTML a CSS. Výsledkem tak je manažování stavu tlačítka pomocí checkbox a radio elementů. Naše ZAP/VYP tlačítka tak budou o něco spolehlivější mezi různými platformami. CSSCSS proměnnéS koncem podpory pro Internet Explorer přicházejí i nové možnosti. Jednou z nich jsou i CSS proměnné. Ty jsme spatřili již v předchozí verzi (root variables), avšak ne v takovém rozsahu jako ve verzi 5 – kde se css proměnné dostaly už i do jednotlivých komponent. Například do tabulek: .table { --bs-table-bg: #{$table-bg}; --bs-table-accent-bg: transparent; --bs-table-striped-color: #{$table-striped-color}; --bs-table-striped-bg: #{$table-striped-bg}; --bs-table-active-color: #{$table-active-color}; --bs-table-active-bg: #{$table-active-bg}; --bs-table-hover-color: #{$table-hover-color}; --bs-table-hover-bg: #{$table-hover-bg}; // Styles here... } Výhodou CSS proměnných je jejich používání bez nutnosti zkompilování SASS kódu do CSS. Takto bude možné hodnoty některých proměnných měnit v přímo Inspectoru prohlížeče, což urychlí práci například při prototypování. V Bootstrap 5 stále zůstane možnost definice proměnných v SASS (_variables.scss) souborech, tak, jak jsme to dělali dosud. Osobně bych neočekával kompletní přechod ze SASS proměnných do CSS proměnných. SASS má stále svou nenahraditelnou roli při vytváření proměnných pomocí mapování, proto očekávám, že budeme mít k dispozici kombinaci SASS proměnných s CSS proměnnými iv budoucnosti. Vylepšený gridZískáme nový grid-tier pro obrazovky o šířce větší než 1400px - .col-xxl-. Rovněž mezery mezi jednotlivými sloupci gridu budou nově "ohebnější". Získáme novou css utilitu g pro naše .row. S gutter hodnotami takto bude možné pracovat podobně jako s margin a padding hodnotami, na co jsme si již zvykli: .g-2 .gx-2 .gy-2 .g-lg-2 .g-0 FormulářeOd verze 4 jsme mohli ve svých aplikacích používat checkbox, radio a file elementy dvěma způsoby: 1. Buď jsme použili původní, systémový vzhled (poskytnutý browserem), 2. nebo jsme použili nový vzhled (custom-checkbox, custom-radio). Verze 5 bude obsahovat už jen nový vzhled těchto prvků. Formuláře tak budou vypadat rovněž v každém prohlížeči a operačním systému a přizpůsobení vzhledu těchto komponentů bude stejně jednodušší. Rovněž bude odstraněn i potřebný .form-group wrapper. Nové formuláře již budou obsahovat jen jednotlivé form elementy, bez tohoto DIV elementu. Hurá! Méně kódu! 🙂 <form> <div class="mb-3"> <label for="exampleInputPassword1" class="form-label">Password</label> <input type="password" class="form-control" id="exampleInputPassword1"> </div> ... </form> Wrapper bude potřebný pouze pro custom elementy (.form-select, .form-check, .form-file) a také .form-group. Utilities APIUtility jsou velmi užitečné CSS třídy, kterými obvykle měníme parametry rámování, barev, způsobů zobrazení, stínování a různých velikostí (width, height, padding, margin,...). V praxi se občas stává, že se nevejdeme do předdefinovaných utilit, které jsou součástí Bootstrap-u. Proto jsme někdy vytvářeli vlastní třídy. Například pokud nastavujeme šířku nějakého elementu, máme k dispozici takové css třídy: .w-25 /* 25% */ .w-50 /* 50% */ .w-75 /* 75% */ .w-100 /* 100% */ .w-auto /* auto */ Pokud jsme potřebovali 33% width, 90% width, nebo jiné hodnoty, vytvořili jsme vlastní CSS třídy, udělali override na $sizes mapu v nějakém vlastním souboru, nebo jsme nebodaj editovali přímo $sizes mapu v souboru proměnných _variables.scss. Ve verzi Bootstrap 5 máme k dispozici čistší a užitečnější SASS nástroj, jak modifikovat stávající, nebo přidat nové utility do našeho projektu, tématu nebo pluginu pro Bootstrap - utilities API: $utilities: map-merge( ( "width": ( property: width, class: w, values: ( 33: 33%, 90: 90% ) ), "input-padding": ( property: padding, class: ip, values: ( 0: 0, 1: .3rem, 2: .5rem, 3: .7rem, 4: .9rem, 5: 1rem, ) ) ), $utilities); Výsledkem takového kódu budou nové css třídy utilit: .w-33 /* nastaví width na 33% */ .w-99 /* nastaví width na 90% */ .ip-1 /* nastaví padding na .3rem */ .ip-2 /* nastaví padding na .5rem */ .ip-3 /* nastaví padding na .7rem */ .ip-4 /* nastaví padding na .9rem */ .ip-5 /* nastaví padding na 1rem */ Ostatní vylepšeníIkonyS alpha verzí Bootstrap 5 přichází také pátá alpha verze Bootstrap Icons. Je to sada více než 1000 ikon, které jsou nadesignovány tak, aby parádně ladily s Bootstrapem. Nifty funkcionalita je také SVG sprite, která nám umožňuje vytvořit vlastní mapu SVG ikon a efektně ji používat v projektu, aniž bychom kód špinili samotným SVG zdrojovým kódem. <svg class="bi" width="32" height="32" fill="currentColor"> <use xlink:href="bootstrap-icons.svg#heart-fill"/> </svg> Osobně jsem velkým fanouškem Fontawesome ikon, které obsahují kromě enormně většího množství ikon a jejich variant i velmi užitečné způsoby integrace do projektů. Fontawesome nejsou však dostupné zdarma, proto možná v dalším projektu i my v learn2code zvážíme integraci s Bootstrap ikonami. DokumentaceUž na první pohled je vidět, že dokumentace prošla změnami. Ty však nejsou jen vizuální, ale vylepšen je i samotný obsah. Orientace mezi sekcemi je díky novému postrannímu jménu rychlejší. Jednotlivé sekce obsahují také jakési "overview", které postupně přibývají do každé hlavní sekce dokumentace. I tyto změny urychlují navigaci v dokumentaci a hledání požadované informace je takto rychlejší. BarvyPřibyly také nové barevné odstíny a vylepšen bude také jejich kontrastní poměr. ZávěrTento text není a ani nechtěl být kompletním diffem verze 4 s novou verzí 5. Mnohem více novinek najdeš ve stále rostoucí dokumentaci k Bootstrap 5. Pokud jsem na něco důležitého zapomněl, klidně se ozvi v komentáři.
Mario Šmýkal: Jak psát dobré články a texty? Dá se psaní naučit?
Rozhovory
30.12.2022
Tím Skillmea

Mario Šmýkal: Jak psát dobré články a texty? Dá se psaní naučit?

Mário Šmýkal se narodil v Prievidzi a vystudoval marketingovou komunikaci v Trnavě. Aktuálně pracuje v deníku SME, kde vede obsahové studio SME Creative, píše newsletter Škola nepsaní a v Prievidzi pořádá talkshow Takové ze života a běžecké akce Brose Night Run Prievidza.    V podcastu nám prozradil jak psát i jak nepsat, jaké jsou nejčastější chyby při psaní, jaké předpoklady má dobrý autor a uvedl i několik zajímavých pisatelských úspěchů.   Mário Šmýkal: Jak psát dobré články a texty? Dá se psaní naučit? ➡️ Co jsou podle tebe takové nejčastější chyby, které dělají autoři? To je velmi náročná otázka, neboť lze říci filozoficky i velmi prakticky. Kdybych měl mluvit prakticky tak: • nesprávně dlouhé věty  • nesprávně vyskládané věty  • nesprávné pořadí slov ve větách - to je velmi náročné • uspořádání informací v článku - nemůžeš začít nějakou těžkou nudou nebo historickým exkurzem, to jsou právě momenty, které se mohou objevit nejdříve ve 2/3 článku    Z filozofických věcí je asi nejdůležitější psát pro čtenáře a ne pro sebe. Ve většině případů autoři píší tak, aby se to líbilo jim.   Každý jeden článek, který píšu nebo edituji, čtu nahlas několikrát. Jakmile mě přestane bavit nebo v momentě, kdy uprchne moje pozornost, si to okamžitě vyznačím a zjišťuji, co se tam vlastně stalo. Snažím se pozorovat, proč mi tam ušla pozornost. Za normálních okolností by se nemělo stát, že by člověk nevydržel číst dostatečně poutavý text.   ➡️ Jaká je optimální délka standardního článku, který bys chtěl publikovat například do novin?   Závisí na formátu, například my máme: · nejkratší odrážkový text do 4000 znaků  · střední délka textu do 6000 znaků · nejdelší jsou kolem 9000 znaků   Napsat tak dlouhý článek, aby byl od začátku po konec dobrý, je dost náročné. Některá témata neodkomunikuješ rychle a krátce. Potřebuješ se do toho tématu ponořit jako do bahenní koupele, tak aby tě téma najednou obalilo a ty sis ho zapamatoval mnohem lépe, než kdybys o něm narychlo přečteš 5 vět.    ➡️ Informace je třeba prý prezentovat formou příběhů. Co ty o tom myslíš? Jaká je podle tebe nejzajímavější forma jak podat nějakou informaci?  Ano, příběh je jednoznačně důležitý. Dělám to od začátku a pravděpodobně to budu dělat navždy. Každý jeden z našich článků musí mít nějaký příběh a to je patrné i na číslech. Nejčtenější články, které máme, jako například o kuřatech v Kauflandu, dosáhly přes 200 000 přečtení. Když jsem šel psát reportáž o kuřatech v Kauflandu, až na místě jsem začal zjišťovat, jaká je to vlastně firma a jaké má zajímavé benefity pro zaměstnance. Když jsem o tomto napsal příběh a pouze mezi řádky zmínil kuřata, dosáhl článku výrazně lepších výsledků.   ➡️ Co by měl splňovat člověk, který chce psát články a dělat nativní obsah?V první řadě bychom měli být všímaví a citliví k věcem. Psaní se lze naučit, ale pouze někoho. Důležité je všímat si věcí, které jiní nevidí. Pouze 1 ze 100 lidí si všimne něčeho, co nikdo jiný když vejde do místnosti. Například, já jsem si všiml, že tramvaje v Bratislavě mají čísla 1, 3, 4, 7 a 9, což mě zaskočilo, protože číslo 4 je sudé, zatímco ostatní jsou liché. Toto je jen příklad, že nemusíte vědět odpověď na všechno, pokud se člověk naučí všímat věci, pak je snadné psát. Ale pokud si někdo nedokáže všímat věci, tak mu nic nepomůže. Ani vědět jak psát, protože bez schopnosti všímat si věcí, nikdy nebude moci napsat dobrý článek a bude klouzat pouze po povrchu.   V podcastu i na přednášce v Trnavě Mário vzpomínal, že psaní se lze naučit. Ale ne každého.   Inspiroval se citátem od Stephena Kinga: „I když je nemožné udělat ze špatného spisovatele schopného a stejně tak z dobrého spisovatele geniálního..."   .... je možné učinit ze schopného spisovatele dobrého. Je k tomu zapotřebí množství práce, nadšení pro věc a včasná pomoc. Tak jako zpěv nebo herectví nemůže dělat každý, stejně nemůže každý psát – nejlépe.   ➡️ Jak probíhá výběr nového kandidáta?  Tak v první řadě mě zajímá, co už napsal. Potom se pokaždé snažím vymyslet nějakou otázku nebo téma, které má kandidát zpracovat. Především se snažím objevit jeho všímavost. Je důležité umět si i domyslet (ne ve smyslu vymyslet něco vlastního). Uvedu na příkladu:    Na fotce jsou zimní běžecké závody. Tipněte si kdo vyhraje. [TIP: Všichni jsou navlečení, jen 2 mají kraťasy a krátké tričko.]⬇️ ⬇️ ⬇️ Určitě nevyhraje nikdo, kdo má dlouhý rukáv. Protože když běžíte rychle, tak vám bude vedro.  Čili při psaní je důležité umět si domyslet, pospojovat a přemýšlet v kontextu. Pro více Mariových zajímavých storiek si poslechněte Skillmea podcast: #9 Jak psát dobré články a texty? a pro hodnotné tipy pro psaní článků všemi deseti doporučujeme odběr newsletteru Škola nepsání.
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.
Java Files, Path, čtení ze souboru
Vzdělávání
17.09.2020
Skillmea

Java Files, Path, čtení ze souboru

File I/O (Featuring NIO.2)Ve verzi 7 přišel nový balík java.nio, ve kterém je nově uděláno to, co bylo v java.io. Chceš vědět, jak číst soubory (java read file)? Tak musíš vědět, co je to Path a Files. Můžeš používat oba balíčky. Musíš si ale dávat pozor na to, že pokud pracuješ na projektu, kde se používá java 6 a případně níže, tak ti nepůjdou tyto nové věci. Ale uvažujme, že na takových starých projektech nepracujeme a budeme si vysvětlovat věci s použitím tohoto nového balíčku. Budeme si mluvit o základních třídách Path a Files, budeme manipulovat se soubory a složkami a tak podobně. Zde je zajímavý link porovnání funkcionality zmíněných balíků a jaké chyby měla java.io: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping PathJednoduše řečeno je to linka na soubor nebo na složku v daném operačním systému. Soubory jsou hierarchicky uloženy. Ve windowsu je na vrchu označení disku například C:\home\skuska. V linuxových systémech je root začínající lomítkem / například /home/skuska. Zde můžeme vidět, že ve windowsu a v linuxu se používají úplně jiné oddělovače. Na to je třeba pamatovat. Relativní a absolutní cestaAbsolutní cestu můžeme chápat jako úplnou celkovou adresu nebo cestu na soubor nebo složku. C:\home\skuska je absolutní cesta, která vždy obsahuje root, tedy v tomto případě označení disku C:. Pokud bych ale napsal jen home\skuska\text.txt - tak vidím, že se snažím přistoupit na soubor text.txt, který je umístěn ve složce home a skuska. Ale kde se nachází složka home? Bez dalších informací to nevím a to je relativní cesta. Třída PathZákladní třída v tomto balíčku – používá se aby uchovávala informace o názvu souboru, složkách které jsou použity ke zkonstruování cesty aby bylo možné lokalizovat dané dokumenty nebo složky. Path na windowse je bude odlišná od Path na unixu. Pokud mluvíme o třídě Path, tak můžeme v jednoduchosti říci, že můžeme manipulovat s cestou, která vede ke složkám nebo souborům. Třída FilesTato třída slouží k manipulaci se složkami a soubory. Používá třídu Path. Když přistupujeme k souborům nebo celkově ke zdrojům na disku – tak jsou „otevřené“. Potom s nimi pracujeme a když už s nimi nepracujeme tak musíme zavolat „uzavření“ práce s těmito zdroji, aby je mohl používat někdo jiný. K automatickému uzavření můžeme použít try-with-resources. Práce se souboryMáš Path instanci, která reprezentuje soubor nebo složku. Teď ale stále nevíš, jestli reálně tento soubor nebo složku existuje, jestli se dá z něj číst, zda se do něj dá zapisovat a podobně. Existuje soubor nebo neexistuje, můžu k němu přistoupit? Path path = Paths.get("C:\work\tools\Apache Software Foundation\Tomcat6\logs\service-install.log"); System.out.println(Files.exists(path)); System.out.println(Files.notExists(path)); isReadable(Path) isWritable(Path) isExecutable(Path) Jsou to stejné soubory? isSameFile(Path, Path) mazání souboru Files.delete(path); Vyhodí to výjimku proč se to nepodařilo, pokud se to nepodařilo. Metoda deleteIfExists(Path) také smaže soubor ale pokud soubor neexistuje tak se nevyhodí výjimka.   kopírování souboru Files.copy(source, target, REPLACE_EXISTING);Do metody lze dát varargs options. StandardCopyOption a LinkOption enums jsou podporovány. Všimni si, že pokud dáš ctrl a click na copy metodu, tak je tam CopyOption... options. Potom klikni ctrl na copy option a zjistíš, že je to jen interface, ale v popisu máš napsáno, že umíš použít StandartCopyOption, což implementuje CopyOption.[Image] Tady si můžeš prohlédnout implementace CopyOption rozhraní. Pokud kopíruješ soubor na místo kde se takový soubor již nachází, tak se soubor nepřepíše pokud nezadáš option REPLACE_EXISTING. Složky lze také kopírovat ale zkopírují se prázdné i když v nich byl nějaký soubor. Čtení jsou souboru (read from file)Konečně jsme přišli na kus kódu, díky kterému můžeš číst ze souboru (read from file): Path path = Paths.get("C:\\work\\tools\\Apache Software Foundation\\Tomcat6\\logs\\service-install.log"); List<String> lines = Files.readAllLines(path);
EU CodeWeek 2017
Novinky
27.09.2017
Marián Kristeľ

EU CodeWeek 2017

Minulý rok se téměř milion účastníků zapojilo do některé z 23 000 akcí pořádaných v rámci kampaně EU CodeWeek 2016 . Akcie se konaly ve více než 50 zemích světa a tedy CodeWeek už není jen čistě evropskou záležitostí. [Image] Co je CodeWeek?CodeWeek je kampaň, jejímž cílem je popularizovat programování a digitální svět v EU a ve světě. Cílem této kampaně je ukázat, že programování není určeno pouze pro úzkou skupinu odborníků, ale pomocí něj lze realizovat vlastní nápady. CodeWeek slaví letos své páté narozeniny a školy, učitelé, programátoři, vzdělávací organizace připravují různé akce, kterými se snaží zpopularizovat programování. Jak se zapojit?Děti, mládež nebo i dospělí se mohou zúčastnit akcí zveřejněných na stránce codeweek.eu. Programátoři nebo vzdělávací organizace si mohou vytvořit vlastní veřejné akce a pozvat lidi, aby jim ukázali, jak programování vypadá v praxi. Učitelé a školy rovněž mohou zorganizovat různé mini kurzy nebo se s žáky zúčastnit programátorských akcí v jejich regionu.  Chceš se zapojit se svou akcí? Přidej jej na stránku  events.codeweek.eu . Zde si také umíš vyhledat seznam plánovaných akcí. Zatím jich tam není mnoho, ale určitě budou přibývat :) Proč začít s programováním?Způsob jakým pracujeme, ale také komunikujeme se vlivem rychle se vyvíjejících technologií mění. Nauč se programovat a zlepši svoji digitální gramotnost, přestaneš být konzumentem v digitálním světě, staneš se jeho tvůrcem. Zlepšíš i svůj přístup k řešení problémů, což jistě využiješ i v běžném životě. V neposlední řadě, tvé uplatnění na trhu práce rapidně zlepšíš. Máme zde i pár statistik: v současnosti se vyžadují alespoň nějaké IT dovednosti ve více než 90% pracovních pozic. Poptávka po IT odbornících roste ročně o více než 3%, avšak IT zaměřené školy nedokážou tuto poptávku pokrýt svými absolventy. Pokud nebude tento problém řešen, do roku 2020 bude v EU chybět více než 800 000 IT specialistů.  Learn2Code pořádalo EU Code Week workshopy i minulý rok, vypadalo to na nich přibližně takto: Co tedy udělat dál?Vytvoř vlastní event nebo se přidej do nějakého, který přibude na mapě. Pokud si neumíš poradit, kontaktuj nás a rádi ti pomůžeme s organizací :) Klidně followuj oficiální EU Code Week twitter profil ->  https://twitter.com/CodeWeekEU  a při sdílení na sociálních sítích používej hashtag #CodeEU. Pomůžeš tak šíření povědomí o akci.
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.
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 :) 
Jak na vlastní Virtuální privátní server - část 1.
Vzdělávání
21.01.2021
Lubomir Herko

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í.