Náš blog

Agilní vývoj - úvod do problematiky
Vzdělávání
10.05.2021
Skillmea

Agilní vývoj - úvod do problematiky

Co je agilní vývoj? „Agilní metodiky pro řízení vývoje software jsou takové metodiky, které využívají agilního přístupu, tedy pružně reagují na změnu, průběžně rozvrhují práci v průběhu vývoje a ověřují výstupy s uživateli. Agilní metodiky obsahují základní principy, kterými by se měl úspěšný projekt vývoje software řídit. Proces vývoje je díky agilnímu přístupu postaven na týmové spolupráci, otevřené komunikaci týmu, zapojení zákazníka a celkové flexibilitě a otevřenosti změnám. Využití agilních metodik pro vývoj softwaru v praxi: Agilní přístup k vývoji se uplatňuje především u složitého, komplexního nebo inovačního softwaru, u kterého je velmi obtížné sepsat detailní požadavky na začátku projektu. Ty se postupně upřesňují nebo tvoří průběžně na základě zkušeností s prototypy z jednotlivých iterací vývoje na základě zpětné vazby od uživatelů. Agilní metodiky jsou zaměřeny na efektivnost práce, kvality výsledků a spokojenost uživatelů. Nesnaží se potlačovat změny oproti původnímu plánu, ale naopak je pro ně charakteristické upřesňování a přizpůsobování výsledného softwaru.“ (zdroj: managementmania.com) Následně když víme, že budeme používat agilní vývoj, potřebujeme nějaký tool – nástroj, kde budeme řídit úkoly. Jedním z nejznámějších nástrojů je Jira. Agilní přístupy a metodikyAgilních přístupů a metodik je mnoho. Záleží, co v projektu potřebujete. Nejznámější metodika je Srum. V Jiře si umíme zvolit zejména mezi Scrum a Kanban. Co vybrat? Záleží na projektu. Ve firmě budeš pravděpodobně používat Srum. Jaký je rozdíl? Kanban je o hlavně o vizualizaci práce. Kanban používá kolonky, které představují různá stádia vývoje. Vezmu si roli – je přidělena. Daný člověk na ní začne dělat - je v kolonce in progress (pracuje se na ní). Poté je úloha posunuta na test nebo dokončena. Kolonky si můžete přizpůsobit. Zde si o tom můžeš přečíst obšírněji. Scrum týmy pracují ve stanovených intervalech zvaných sprinty. Sprint je přibližně týden nebo dva. Během sprintu pracují lidé na úkolech, které jim byly přiděleny na začátku sprintu na takzvaném plánování sprintu. Srum vede jedna osoba a tou je takzvaný Srum master. Během Srum vedení týmu se cíle projektu upravují – sbírají se informace od klientů, od uživatelů a poté se aplikují změny. Tady si o tom můžeš přečíst obšírně. JiraJira je zdarma pro jednoduchý projekt a tím. Na této stránce si umíš založit svou Jiru. Jira je tool pro management úkolů a tyto úkoly musí být přiřazeny do projektů. Tedy jako první krok je vytvoření projektu. Jsi přihlášen v Jiře a v pravém horním rohu budeš mít tlačítko na vytvoření projektu.[Image] Vytvoríš si projekt:[Image] Jako Template je vybrán Kanban. Toto umíme změnit po stisku Change template. Co zvolíš je na tobě. Pojdu si ukázat Scrum. Vyberu Scrum a vytvořím projekt. Momentálně nemáme žádný sprint. Musíme jej vytvořit, abychom začali vývoj. Jdeme do Backlogu, což je místo, kde máme vytvořené úkoly.[Image] Bez úkolů nebude sprint. Vytvoř si úkoly. Máš na výběr několik míst, kde vytvořit úkoly, ale princip je stále tentýž – mít úkoly, na kterých se může pracovat.[Image] Když máme vytvořené úkoly, tak umíme spustit sprint.[Image][Image]  Vytvořil si sprint. Nyní je prázdný. S týmem se domluvíte, co se má udělat a dané úkoly se přetáhnou z backlogu do sprintu. Dohodli jsme se, že uděláme dva úkoly a jeden ponecháme v backlogu. Následně spustíme sprint.[Image] Při spuštění určíme, jak dlouho má sprint probíhat. Nyní je sprint aktivní a umíme si prohlédnout nástěnku sprintu. V této nástěnce vidíme, v jakém jsou úkoly stádiu.[Image] Samozřejmě nesmíš zapomenout daný úkol někomu přidělit. Otevřeš si úlohu a assigneš (přidělíš) ji někomu.[Image] Daný uživatel si umí vypsat jen jeho úkoly v daném sprintu.[Image] Autorem článku je Jaroslav Beňo.
O zlatém řezu a jeho aplikacích v designu
Vzdělávání
11.04.2021
Ľudovít Nastišin

O zlatém řezu a jeho aplikacích v designu

V designu jako takovém je velmi důležité, aby byl výsledek práce jasný a každý mu chápal. Ať už je to ve formě zalomení textu, oříznutí fotografie nebo navržení loga. Za tímto účelem se kromě jiných pomůcek často využívá i aplikace zlatého řezu, o kterém si nyní něco povíme. Z angl. „Golden ratio“ hovoříme o konkrétním matematickém poměru, který se velmi často vyskytuje iv přírodě a designové odvětví se jím inspiruje. Zlatý řez nám pomáhá dosáhnout co nejpřirozeněji působících proporcí, tvarů či struktury. “Zlatý řez vznikl již ve starověkém Řecku” Jedná se o velmi speciální číslo - 1,618. Vychází ze známé Fibonacciho posloupnosti a jeho aplikaci můžeme nalézt iv přírodě, například ve tvaru mořské mušle či ve formaci oblaků u hurikánů. Tato posloupnost je tvořena vždy částkou dvou předchozích čísel (0-1-1-2-3-5-8-13-21-...). A právě z této sekvence odvodili už ve starověkém Řecku zlatý řez (golden ratio), aby uměli lépe vyjádřit rozdíly mezi čísly sekvence. Jak používat zlatý řez v designuAplikace zlatého řezu do designérské profese vůbec není tak náročná, jak by se mohlo na první pohled zdát. Jeho využitím můžeme vytvářet například proporcionální layouty na web. Pokud chceme navrhnout web, který má vedle prostoru pro hlavní obsah i sidebar, tak právě s využitím zlatého řezu umíme stanovit jejich přesnou šířku. Pokud by se jednalo řekněme o prostor o šířce 960px, tak prostor pro hlavní obsah by měl mít šířku 593px (960px/1,618) a sidebar šířku 367px (593px/1,618). Samozřejmě, že v praxi do toho vstupuje několik dalších faktorů (např. padding), ale logiku tohoto poměru to deklaruje skvěle.[Image] A jelikož toto číslo vychází ze sekvence nekonečného množství čísel, tak jeho opakovaným aplikováním získáme různé velikosti (délky, šířky,...), se kterými můžeme v designu pracovat a vyskládat z nich funkční a intuitivní UI. Jak jsme si již říkali, zlatý řez lze aplikovat v podstatě na všechny oblasti designu či kreativy. Ukážeme si k tomu několik příkladů. Ořezávání obrázkůPokud se jedná pouze o ořez prázdného prostoru na kraji fotografie, věc je jednoznačná. Ale pokud je třeba oříznout i samotný obsah fotografie či obrázku, situace se mění. Výsledek musí zůstat vyvážený a ty nejdůležitější věci na obrázku by měly mít své místo. Právě s tím nám umí pomoci zlatý řez.[Image] (Zdroj: industrydev.com) Typografie a hierarchie Umíme si také pomoci při výběru správné kombinace velikosti použitých fontů. Takto bude mít název, podnázev a samotný text tu správnou velikost a hierarchie mezi nimi bude okamžitě jasná.[(Zdroj: Invisionapp)] UI Webdizajn Rozložení jednotlivých elementů a ploch na webu rozhoduje o tom, jak intuitivně se bude návštěvník webu cítit. A stejně tak, jestli se mu to bude líbit. Jak jsme již dříve psali v článku, například šířka jednotlivých sloupců je díky zlatému řezu jasně stanovena.[(Zdroj: Apiumhub)] LogoA posledním příkladem je využívání zlatého řezu při tvorbě loga. Tady to možná na první pohled není až tak očividné. No věřte, že zlatý řez se zde aplikuje velmi často ai ta nejznámější loga byla vytvořena právě s jeho pomocí.[(Zdroj: Twitter, NatGeo)]Někdy jej v logu najdete jednoduše (National Geographic logo), jindy je to trošku skryté (Twitter logo). Právě v tom druhém případě bylo logo vytvářeno za pomoci série kružnic s jasně danými velikostmi. Ty pomáhaly vytvářet všechny křivky a záhyby loga, dokud z něho nevzniklo ikonické logo, které působí přirozeně a hezky. A není to náhoda. Zlatý řez je není technika, je to spíše myšlenkový proces. Vědět ho aplikovat efektivně chce svůj čas. Určitě se však vyplatí pohrát si s ním a zkoušet podle něj vytvářet nějaké layouty či ořezávat důležité fotografie. Šikovnou pomůcku v podobě spirály zlatého řezu najdeš zde.
Studijní plán pro budoucího JavaScript programátora
Vzdělávání
26.03.2021
Skillmea

Studijní plán pro budoucího JavaScript programátora

Lidé se nás často ptají, jak se stát frontend developerem, jaké technologie by měly ovládat, co všechno vědět, kde začít a jaká je správná posloupnost jednotlivých online kurzů. Na základě našich zkušeností, rad od lektorů jako Yablko a dalších, jsme v tomto článku dali dohromady studijní cestu příštího frontened developera. Frontend developer vs backend developer vs fullstack developerFrontend developer, frontenďák je člověk, který je zodpovědný za části webové aplikace nebo webové stránky, které uživatelé vidí a interagují s nimi. Backend developer je člověk, který má na starosti všechno to, co člověk nevidí – infrastruktura, datový model, databáze. No a pak je tady full-stack developer, který je směsí frontendu i backendu a zvládne celý proces návrhu webové aplikace od začátku do konce. Pomozme si tímto meme pro lepší vizualizaci:[Programátorské meme]V dnešní době se dost stírá hranice mezi frontendem a backendem. Je to kvůli tomu, že stále více úkolů, které spadají do oblasti backendu, mají na starosti frontend vývojáři. Frontend developer dělá zejména tyto úkoly: • rozhoduje o designu a struktuře webstránek, • vyvíjí funkce k dosažení dobré uživatelské zkušenosti (user experience), • dbá na responzivitu webové stránky, • optimalizuje webstránku pro rychlé načítání a škálovatelnost v budoucnosti, • volí správnou kombinaci webových technologií pro dosažení nejlepšího výsledku. Dovednosti front-end developeraDobrý frontenďák je k nezaplacení. Doslova. Při vývoji webstránek či aplikací je nesmírně důležitý a musí proto mít komplexní znalosti nejen z oblasti vývoje webu: • ovládat technologie jako HTML, CSS, JavaScript a další (čti dále v článku), • pokud umí pracovat s nějakým grafickým softwarem jako například. Photoshop, Sketch alebo Illustrator, je to veľké plus, • základní znalosti SEO, • dobré komunikační znalosti, neboť hodně komunikuje s kolegy (grafik, backend developer, projektový manažer, klient), • nezalekne se problémů a umí je řešit. Mzda frontend developeraPodle portálu platy.sk na Slovensku vydělává JavaScript developer (proč jsme vybrali právě pozici JavaScript developer se dozvíš níže v článku) od 1.300 Eur až po 2.900 Eur. Záleží na počtu let praxe, zkušeností, projektech na jakých jsi již pracoval a tak dále. Dobré JavaScript developery firmy stále hledají, takže když naskočíš na vlak frontend developmentu, o práci budeš mít postaráno.[Priemerný hrubý mesačný plat programátora na Slovensku]JavaScript je také extrémně populární, podle RedMonk rebríčka je JavaScript číslo 1 co se týče popularity na GitHube a Stack Overflow. Když pohledáš i otevřené pozice např. na Profesi, vyhodí ti to stovky pozic JavaScript či frontend programátora. A když si do svého LinkedIn profilu doplníš, že ovládáš JavaScript ak tomu nějaký JavaScript framework, inbox ti vybuchne od nabídek různých IT recruiterů. Pojď na to a viz návod, jak se stát frontend programátorem. Jak se stát frontend developerem?Nenech se odradit a jdi za svým cílem. V textu níže jsme vypíchli podle nás ty nejdůležitější technologie, které by si jako dobrý frontenďák měl ovládat. Pojďme na to. “TL;DR: HTML, CSS a JavaScript jsou zádovou kostí frontend developmentu. Frontend development kombinuje právě tyto tři technologie ak tomu JavaScriptové frameworky (nebo knihovny).” Krok číslo 1: HTML a CSSToto je úplně první téma, kterému by ses měl věnovat, pokud máš v plánu být frontend developerem. Je to alfa a omega celého frontend developmentu. HTML a CSS používají všechny weby, všechny webové aplikace. HTML a CSS tě zdarma naučí kurz Webrebel 1: HTML, CSS a JavaScript. Všechna videa o HTML a CSS jsou k dispozici zdarma, stačí se přihlásit do kurzu. V tomto kurzu se naučíš také důležité věci o tom, jak vůbec internet funguje, jak fungují prohlížeče, což je HTTP a HTTPS, DNS, JSON, XML a spousta dalších zkratek, kterým nyní možná nerozumíš, ale v procesu tvorby webstránek jsou to důležité znalosti . A když budeš u CSS, věnuj mu pořádně hodně času. Může se zdát, že je snadné pracovat s CSS, ale na jeho zvládnutí je zapotřebí mnoho času. Zkus se zeptat backend developera, proč není frontendistou? Šance, že ti odpoví, "Nebo nesnáším CSS" je dost vysoká. Sledovat videa nestačí a proto si určitě během jejich sledování dělej domácí úkoly, které v kurzu jsou. Udělej si své vlastní portfolio, nabídni se svým známým, že jim uděláš webstránku, dělej maličké projektíky jen tak pro své potěšení a takto se budeš zdokonalovat a chytíš psaní kódu za pačesy.[Ukážka HTML, CSS a Java Script | Zdroj: https://moz.com/blog/javascript-seo] Krok číslo 2: piš lépe CSSLepší CSS se naučíš psát například díky preprocesorom. Známými preprocesory jsou Sass, Less nebo Stylus. Preprocesor je program, který zpracuje kód v jednom formátu (např. Sass) a změní jej na kód v druhém formátu (CSS). Díky Sass umíš psát méně kódu a bude přehlednější. Když budeš dělat na webových projektech, je dobré ovládat i nějaký ten CSS framework. Největšími frajery na tomto poli jsou pravděpodobně Bootstrap a Foundation. Bootstrap je iniciativa Twitteru a zaslouží si velkou pochvalu za zavedení responzivního designu ve velkém měřítku. Byl to první framework, který podporoval filozofii 'mobile-first'. Pomocí Bootstrapu umíš relativně rychle vytvářet responzivní weby. Pokud je pro tebe Bootstrap zbytečně omezující v tom, jak tvůj design bude vypadat, vyzkoušej CSS framework Tailwind 2. Je pro lidi, kteří chtějí mít flexibilitu a tvořit vlastní design. Tailwind je intuitivní a moderní CSS framework, který se lze rychle naučit. Krok číslo 3: trošku přitopíme - JavaScriptJavaScript bude pro tebe jako frontend developera bezpochyby nejdůležitější dovedností. Jak se naučit JavaScript? Logická odpověď: začni základy. Nebuď povrchní, ale ani v úvodu nechoď do úplných detailů. Learning by doing je naše doporučení, když se učíš JavaScript: 1. Nauč se základy JavaScriptu, 2. Nauč se React, Vue alebo Angular, 3. Pochopíš, že nemáš dobré základy JavaScriptu, 4. Vrať se k bodu 1. a nauč se pořádně JavaScript. JavaScript je již několik let po sobě nejpopulárnějším programovacím jazykem, pozice vyžadující JavaScript přibývají jako houby po dešti. Když budeš vědět JavaScript, o robotu máš postaráno. Yablko připravil parádní kurz o moderním JavaSciptu. Tento kurz tě naučí psát moderní JavaScript, budeš vědět jeho syntaxi (ES6 a ES7), abys nepsal spaghetti code a pravidla jazyka. Kromě toho, zvládneš nástroje jako package managers (správa závislostí) npm a yarn, zkrotíš DOM, budeš umět používat nástroje jako Webpack a tak dále. V kurzu je téměř 23 hodin materiálu o moderním JavaScriptu, bude to fuška, ale výsledek bude stát za to. Krok číslo 4: vyber si svůj osud - Vue, React, AngularKdyž jsi zvládl předchozí tři kroky, jsi připraven naučit se pracovat s mocnými nástroji v podobě JavaScript frameworků nebo knihoven. Aktuálně v roce 2021 jsou nejvíce v kurzu Angular, React a Vue. Nemusíš vědět všechny, raději jeden a pořádně. Každá z těchto technologií má svá pro a proti a jsou určena ke komplexnímu vývoji frontendových webových aplikací. Tyto frameworky jsou si podobné a pokud se naučíš jeden, přejít na jiný framework není až tak náročné. Pojďme si nyní velmi stručně představit zmíněné tři frameworky. Angular je vyvíjen společností Google, poprvé byl vydán v roce 2010 a je postaven na TypeScriptu. Otcem Angularu je Slovák Miško Hevery. V roce 2016 byl představen výrazný update tohoto frameworku - Angular 2, v jehož rámci došlo ik vypuštění "JS" z názvu. Kromě Googlu samotného používají Angular weby jako PayPal, Upwork, Microsoft a další. React je vyvíjen dalším gigatnem - Facebookem, který jej mimo jiné používá v aplikacích Instagram či WhatsApp, na Reacte fičí i weby Netflixu či Uber. První release byl v roce 2013 a jedná se o JS knihovnu pro vytváření uživatelských rozhraní (UI). Vue je nejmladším JS frameworkem v tomto výběru. Vue za sebou sice nemá žádnou velkou firmu, ale také je používán velkými firmami. Alibaba, Behance nebo GitLab. S příchodem Vue 3 v září 2020 přešlo Vue na TypeScript.[JavaScript frameworks Angular, React, Vue] BONUSGitGit se používá ve většině vývojářských firem, čím dříve se naučíš s Gitem pracovat, tím lépe pro tebe. Git je verziovací systém, díky kterému se můžeš kdykoli vrátit k původní verzi svého kódu, sdílíš kód s kolegy spolupracovníky, pracuješ v týmu. Git ovládáš přes příkazový řádek nebo si nainstaluješ nějaké GUI pro Git. Git ti vlastně ukládá celou historii tvého projektu do repozitáře. Své repozitáře ukládáš na jakémsi hostingu – což může být GitHub, GitLab či Bitbucket. TestováníChceš-li být úplný král, svůj kód určitě i testuj. Vyhneš se tak mnohým problémům při vývoji. U JavaScriptu jsou nejpoužívanější knihovny pro testování Jest, Mocha, Chai. ZávěrNezapomínej, nemusíš dokonale ovládat vše z výše uvedeného. V tomto článku jsme se snažili přinést ti průřez technologií, které bys měl ovládat, pokud se chceš stát frontend programátorem. Mohlo by se zdát, že jich je příliš mnoho a bojíš se, že to nezvládneš. Pro dodání sebedůvěry si přečti tyto příběhy absolventů našich kurzů, kteří se rozhodli změnit kariéru. Nebo si prohlédni pár rozhovorů s absolventy na našem YouTube. Nikdy není pozdě začít s programováním. Když se rozhodneš pro vzdělávání formou online kurzů, nejdůležitější je vydržet. Držíme ti palce. Kódování zdar!
Kotlin Raw String
Vzdělávání
19.02.2021
Skillmea

Kotlin Raw String

String je základní datový typ v programovacích jazycích. Slouží k uchování textu. Pokud chceme napsat String tak text vložíme mezi dvojité uvozovky. val cesta = "cesta";Ve většině případů je to dostačující. Co když do textu chceme nastavit cestu na soubor jako text. C:\work\tools\__test Musíme ho vložit do proměnné typu String a všechna lomítka zdvojit - escapnout. val cesta = "C:\\work\\tools\\__test";Kotlin má také pomůcku a tou je Raw String. Pro napsání textu použiji třikrát dvojité uvozovky na začátku i na konci. val cestaRaw = """C:\work\tools\__test"""Raw String nám umožňuje zapsat String na více řádků bez nutnosti spojování pomocí +. Mám text, který chci napsat na více řádků. Co musím udělat, pokud to chci v jednom Stringu? Všechny části spojím pomocí + a přidám speciální značku pro nový řádek \n. val text = "1 639,33\n" + "6 540,03\n" + "8179,36\n" + "+2500,04"U Raw Stringu jen stisknu enter pro nový řádek a pokračuji v psaní. val textRaw = """1 639,33 6 540,03 8179,36 +2500,04"""Tento způsob ale není pěkně čitelný – veškerý text mám zasazený na levou stranu, neboť nechceme abychom tam dali např. taublátor – v původním textně nebyl. Co můžeme udělat je přidat nějaké speciální značku na začátek řádku, který chci odsadit a pak řeknu, že vše nalevo od značky spolu se značkou považuji jen za odsazení textu. Přidejte značku (hocijakou): val textRaw = """1 639,33 #6 540,03 #8179,36 #+2500,04"""Nyní řekneme, že # je speciální značka pro odsazení. val textRaw = """1 639,33 #6 540,03 #8179,36 #+2500,04""".trimMargin("#") A můžeme odsadit pro lepší čitelnost: val textRaw = """1 639,33 #6 540,03 #8179,36 #+2500,04""".trimMargin("#")Nebo použijeme default znak oddělovače, což je pipe |. val textRaw = """1 639,33 |6 540,03 |8179,36 |+2500,04""".trimMargin()Nyní se tyto dva Stringy budou rovnat. println("${text == textRaw}") //truePoužití v reálné aplikaciUrčitě bys rád viděl příklad z reálné aplikace. Jedním z takových příkladů by bylo použití při psaní Android aplikace. Přesněji například při psaní příkazů pro poptávku na databázi v Room frameworku, který se používá pro zjednodušený přístup k databázím. V Room píšeme takzvané Dao třídy pro přístup k databázi. Vezměme si jeden příklad kde chci napsat SQL příkaz k vyjmutí filmů z databáze. @Query("SELECT id, movie_name, genres, directors year FROM MOVIES") suspend fun getAllMovies(): List<MovieShort>Příkaz bys rád napsal na více řádků, aby byl lépe čitelný. @Query("SELECT id, movie_name, genres, directors year " + "FROM MOVIES") suspend fun getAllMoviesInShortForm(): List<MovieShort>Nebo použiješ Raw String. @Query(""" SELECT id, movie_name, genres, directors year FROM MOVIES """)Určitě si umíš představit jak se ti zlepší čitelnost, budeš-li mít složitější select příkazy v kombinaci například s join.
Jak na vlastní Virtuální privátní server - část 1.
Vzdělávání
21.01.2021
Lubo Herkoo

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í.
Abstrakce a řazení v kolekcích v Javě
Vzdělávání
08.12.2020
Skillmea

Abstrakce a řazení v kolekcích v Javě

Pojďme si popovídat o abstraktních třídách v jevu (abstract class in java). Abstrakce slouží ke schování složitosti od uživatele a zobrazuje pouze relevantní informace. Abstraktní třídy a metody V našem příkladu víme, že všechna zvířata vydávají zvuk. Je to něco abstraktního – něco, co si umíme představit a v kódu to zapíšeme následovně. Upravme metodu ve třídě Animal. public abstract void makeNoise(); Dává to smysl, neboť Animal nepředstavuje určité specifické zvíře a tedy nevíme, jaký zvuk vydá, ale víme, že chceme aby všechno, co bude dědit od Animal, vydávalo zvuk. Pomocí public abstract jsem řekl, že tato metoda nemusí mít nitro – nemusí mít kód (implementaci). Pokud mám abstraktní metodu, tak i celá třída musí být abstract. public abstract class Animal{ public String name = "animal"; public abstract void makeNoise(); }Pokud je třída abstract, tak z ní nemůžu vyrobit objekt. Nač bych i dělal objekt Animal, nicméně je to jen abstrakce. Toto nebude fungovat: Animal animal = new Animal(); Pokud je Animal abstract a obsahuje abstract metodu, tak jsem řekl, že potomek musí napsat implementaci abstract metody nebo bude pak také abstract. Nám vyhovuje, aby Mamal byl také abstract. Tím pádem nemusíme vyrobit implementaci. Ze třídy Mamal smažeme makeNoise a označíme ji za abstract. public abstract class Mamal extends Animal { public String name = "mamal"; }Nyní třídy, které dědí od Mamal musí implementovat metodu makeNoise. Cat a Dog již danou metodu implementují, tedy nemusíme nic dělat. Ale Fox tuto metodu nemá a proto ji musíme implementovat. IntelliJ IDEA nám v tomto pomůže zkratkou. Stiskneme Alt+Insert a vybereme Implement Methods. public class Fox extends Mamal { @Override public void makeNoise() { System.out.println("Ring-ding-ding-ding-dingeringeding!"); } } Seřazování v kolekcíchPro seřazování použijeme již existující algoritmus ve třídě Collections.sort(l). Písmeno l v tomto případě bude Dopis. Pokud by tento List obsahoval sadu Stringů, byly by seřazeny abecende, pokud by obsahoval Datum tak budou seřazeny chronologicky. Jak je to možné? Je to proto, že tyto třídy implementují rozhraní Comparable. Pokud by ses snažil takto seřadit takové třídy, které neimplementují toto rozhraní, tak program vyhodí výjimku. Existuje ale možnost, že ve tvé třídě implementuješ toto rozhraní. Potom toto třídění je nyní považováno za přirozené. Příklad: Máme Osobu, která implementuje Comparable. Musíme implementovat metodu compareTo. public class Osoba implements Comparable<Osoba>{ private String meno; private String priezvisko; private int vek; public Osoba(String meno, String priezvisko, int vek) { this.meno = meno; this.priezvisko = priezvisko; this.vek = vek; } //get, set metódy vynechané pre čitatelnosť @Override public String toString() { return "Osoba{" + "meno='" + meno + '\'' + ", priezvisko='" + priezvisko + '\'' + ", vek=" + vek + '}'; } @Override public int compareTo(Osoba o) { int porovnaniePriezvisk = o.getPriezvisko().compareTo(this.getPriezvisko()); return porovnaniePriezvisk !=0 ? porovnaniePriezvisk : o.getMeno().compareTo(this.getMeno()); } } Co když chceš použít úplně jiné než přirozené třídění, chceš to třídit například podle věku. Nebo chceš třídit objekty, které neimplementují Comparable rozhraní? Tak si ho vyrobíš. K tomu použiješ rozhraní Comparator a poté ho požiješ Collections.sort(e, VEK_TŘÍDĚNÍ);. public class Sort { private static final Comparator<Osoba> VEK_TRIEDENIE = new Comparator<Osoba>() { @Override public int compare(Osoba o1, Osoba o2) { return Integer.compare(o1.getVek(), o2.getVek()); } };Vyzkoušíme si: public static void main(String[] args) { Osoba[] osobyArray = { new Osoba("Jaro", "Beno", 20), new Osoba("Peter", "Beno", 25), new Osoba("Karol", "Slepec", 18), new Osoba("Tomas", "Vlak", 22) }; List<Osoba> osoby = Arrays.asList(osobyArray); System.out.println(osoby); Collections.sort(osoby); System.out.println(osoby); Collections.sort(osoby, VEK_TRIEDENIE); System.out.println(osoby); } }V dalších blozích se podíváme na pár zajímavostí z Javy 13 a také se budeme věnovat i Kotlinu. Zůstaň nám věrný a uč se Javu 😊
Funkce VLOOKUP
Vzdělávání
16.11.2020
Skillmea

Funkce VLOOKUP

Funkce VLOOKUP se používá tehdy, když potřebujete najít údaje v tabulce nebo rozsahu podle řádku. Vyhledejte například cenu automobilové části podle čísla části nebo vyhledejte jméno zaměstnance na základě ID zaměstnance. Funkce VLOOKUP patří k nejpraktičtějším Excel funkcím. Funkce VLOOKUP znamená: = VLOOKUP (co chcete vyhledat, kde ho chcete vyhledat, číslo sloupce v rozsahu obsahujícím hodnotu, která se má vrátit, vraťte přibližnou nebo přesnou shodu – označenou jako 1/TRUE nebo 0/FALSe). Vysvětlíme si danou funkci na jednoduchém příkladu: • v databázi chceme přidat k ID klienta jeho příjmení a město, ze kterého pochází. • v jedné tabulce (v levé, viz obrázek níže) nám chybí určité údaje o klientech, konkrétně příjmení a město • ve druhé tabulce (v pravé, viz obrázek) máme údaje o klientech - jeho ID, příjmení a město, ze kterého pochází.[Image] Obě tabulky mají společný jeden identifikátor, a tedy ID_klient. Na základě této společné shody umíme pomocí funkce VLOOKUP vyhledat údaje z jedné tabulky a přiřadit je do druhé tabulky. Řešení: zadejme do buňky Příjmení funkci VLOOKUP a rozklikněme si ji. Argument funkce Vyhledávaná_hodnota je něco, co naše dvě tabulky spojuje, tedy ID_klient. Argument funkce Pole_tabulky jsou údaje z druhé tabulky, ze které čerpáme (tuto tabulku si nezapomeňte ve funkci ukotvit pomocí klávesy F4). Dalším argumentem fukce VLOOKUP je Číslo_indexu_sloupce, do kterého napíšeme číslo sloupce z naší druhé tabulky - hledáme Příjmení, co je druhý sloupec, tak napíšeme číslo 2. Poslední argument funkce je Vyhledávání rozsahu, která může být přibližná nebo přesná shoda; TRUE (1) nebo FALSE (0). V našem případě chceme přesnou shodu, tedy použijeme 0 – FALSE. Funkce bude zapsána následovně:[Image] A tady je výsledek, podle ID_klient se nám zobrazí v naší první tabulce příjmení zákazníků Rovněž můžeme postupovat iv případě, že chceme doplnit MĚSTO klienta do první tabulky.[Image] Krátké shrnutí k funkci VLOOKUP, obsahuje tyto 4 argumenty: 1. co hledám, 2. kde to hledám, 3. ve kterém sloupci je výsledek, 4. chci hledanou hodnotu přesně nebo přibližně? Pokud máš nějaké dotazy k této funkci, nebo je ti z článku něco nejasného, napiš otázku do komentáře.
OOP v C++: třída reprezentující válec a něco víc
Vzdělávání
05.11.2020
Skillmea

OOP v C++: třída reprezentující válec a něco víc

V úvodu tohoto blogu bych chtěl pozdravit všechny nadšence vyššího programovacího jazyka C++. V tomto blogu jsem si pro vás připravil téma z objektově orientovaného programování. Z aplikačního hlediska jsem si pro vás připravil implementaci třídy, která reprezentuje válec jako 3D geometrický útvar. To znamená, že se znovu budeme bavit v intencích analytické geometrie. To není z toho důvodu, že bych vás chtěl zatěžovat vyšší matematikou, ale z toho důvodu, že geometrické objekty lze pěkně reprezentovat třídami a objekty implementovanými v jazyce C++. Už v předchozím kurzu jsem rozvinul myšlenku objektově orientovaného programování a mimo jiné jsem tvrdil, že objekt v jazyce C++ odráží vlastnosti a schopnosti objektu reálného světa. Za takový objekt můžeme považovat také válec, který si nemusíte skutečně sestrojit z nějakého materiálu, ale stačí se na něj dívat z pohledu analytické geometrie. Takže na začátek si představíme trochu teorie, kterou musíme dotáhnout do konce právě proto, abyste rozuměli zdrojovému kódu, který jsem si pro vás připravil. Potom vás ještě pověřím vyřešením logického úkolu, který když chcete úspěšně splnit, musíte mít dobré poznatky ze základů analytické geometrie. Ale o tom pak... Je třeba se tedy připravit a zvládnout pojmy jako jsou kartézský souřadnicový systém, bod, vektor, přímka, rovina, jejich algebrický popis, až po skalární či vektorový součin vektorů. Pojďme ale pěkně popořádku. Na začátku vám položím otázku: Jak jsi ty představuješ válec v prostoru? Určitě bys věděl, jak vypadá jeho tvar, popřípadě bys ho uměl nakreslit. No dobře, z hlediska geometrie může být, ale za těmi čarami se skrývá i konkrétní matematický popis. Začněme tedy bodem. Bod je základní geometrický útvar, který je ve 3D kartézském prostoru reprezentován třemi souřadnicemi. Souřadnice bodu mohou nabývat jakoukoli hodnotu z oboru reálných čísel. Proč mluvím právě o bodě? Je to z toho důvodu, abych vám usnadnil práci. Válec můžeme definovat právě dvěma body. Konkrétně jsou to body, které leží ve středu dvou podstav válce. To znamená, že střed dolní podstavy a střed horní podstavy válce jasně vymezují výšku válce. Když k tomu přidáme poloměr podstavy, máme přesnou představu, o který válec se jedná. S tím usnadněním práce jsem to myslel opravdu vážně, asi byste přece nechtěli, kdybych vám definoval rovnici dvou kružnic, které by reprezentovaly podstavy válce, byť tato reprezentace by byla správná. K vysvětlení reprezentace válce, která je vlastní analytické geometrii, vám nabízím následující obrázek:[Image] Na obrázku máte znázorněn 3D kartézský souřadnicový systém, který je vlastní výpočtem v analytické geometrii. Na okraj jen podotknu, že se jedná tedy o systém, který je ortogonální a zároveň ortonormální. V tomto souřadnicovém systému je zobrazen válec, který je jednoznačně určen dvěma body a poloměrem podstav válce. Zmíněné dva body reprezentují právě středy podstav válce. Vraťme se nyní na chvíli do světa objektově orientovaného programování. Už víme, že chceme reprezentovat válec třídou. Definujme tedy vlastnosti a schopnosti válce. Z kurzů víte, že vlastnosti objektu jsou reprezentovány datovými členy třídy.  Já jsem položil požadavek na datové členy třídy následovně: • mějme datový člen, který bude reprezentovat střed dolní podstavy válce, • mějme datový člen, který bude reprezentovat střed horní podstavy válce, • mějme datový člen, který bude reprezentovat poloměr podstav válce. Uvedené tři atributy jsou dostatečné k tomu, aby byl válec reprezentován jednoznačně. Já však kladu ještě další požadavky na datové členy třídy válec. Přestože další parametry válce jsou jasně určeny předchozími třemi, chci, aby byly explicitně dopočítány a uloženy do datových členů následující údaje:  • výška válce, která je jasně určena vzdáleností středů podstav, • obsah povrchu válce, který je determinován poloměrem a výškou válce, • objem válce, který je také jasně určen poloměrem a výškou válce. • výchozí konstruktor, který bude užitečný při vytváření nové instance třídy a bude inicializovat všechny datové členy na nulové hodnoty, • druhý uživatelem definovaný konstruktor, který se také použije při vytváření nové instance třídy a bude inicializovat hodnoty datových členů na argumenty předávané přes parametry konstruktoru. Tento konstruktor bude tedy parametrický. Kromě inicializace základních tří atributů (středy podstav, poloměr podstav válce) bude dopočítávat atributy výška, obsah a objem válce, • destruktor, který bude dealokovat paměť vyhrazenou pro novou instanci této třídy, • členskou metodu, která bude sloužit k přestavování hodnot datových členů, to znamená, že z válce s původními rozměry a souřadnicemi vznikne jiný válec, který má nové souřadnice a nové rozměry, • členskou metodu, která bude vracet hodnotu souřadnic bodu, který reprezentuje střed dolní podstavy válce, • členskou metodu, která bude vracet hodnotu souřadnic bodu, který reprezentuje střed horní podstavy válce, • členskou metodu, která bude vracet hodnotu poloměru podstav válce, • členskou metodu, která bude vracet hodnotu obsahu povrchu válce, • členskou metodu, která bude vracet hodnotu objemu válce, • členskou metodu, která bude vracet informaci o tom, zda libovolně zvolený bod definovaný třemi souřadnicemi patří do prostoru (objemu válce) nebo ne. Právě požadavek na poslední členskou metodu je analyticko-logická hádanka, kterou je třeba vyřešit, vyžaduje však širší znalosti z analytické geometrie. Této úloze se budu tedy podrobněji věnovat a to z toho důvodu, abyste řešení pochopili a neztratili se ve spleti matematických vztahů a implementačních detailech. V úvodu jsme si tedy vysvětlili, že uvedu příklad z objektově orientovaného programování, který bude aplikován na oblast analytické geometrie a to konkrétně na geometrický objekt válec. Dále jsme si ukázali obrázek pro jasnější představu a pochopení úlohy, definovali jsme si požadavky na třídu, kterou lze implementovat a jako poslední jsem zadal úkol, který řeší problém průniku libovolně zvoleného bodu a prostoru válce. Bez dalších okolků vám na následujících řádcích nabízím zdrojový kód, který v sobě skrývá implementaci třídy reprezentující válec, třídu reprezentující bod ve 3D kartézském prostoru, členskou metodu třídy válec, která odpovídá na otázku, zda libovolný bod patří do prostoru válce nebo ne. No ak tomu funkci main(), ve které budeme novou instanci třídy válec používat. 001: #include <iostream> 002: #include <cmath> 003: using namespace std; 004: 005: const double pi = 3.14159; 006: 007: class cPoint3D 008: { 009: public: 010: cPoint3D(); 011: cPoint3D(double x, double y, double z); 012: ~cPoint3D(); 013: double x; 014: double y; 015: double z; 016: }; 017: 018: cPoint3D::cPoint3D() 019: { 020: this->x = 0.0; 021: this->y = 0.0; 022: this->z = 0.0; 023: } 024: 025: cPoint3D::cPoint3D(double x, double y, double z) 026: { 027: this->x = x; 028: this->y = y; 029: this->z = z; 030: } 031: 032: cPoint3D::~cPoint3D() 033: { 034: 035: } 036: 037: class cCylinder 038: { 039: public: 040: cCylinder(); 041: cCylinder(cPoint3D V1, cPoint3D V2, double radius); 042: ~cCylinder(); 043: void SetCylinder(cPoint3D V1, cPoint3D V2, double radius); 044: cPoint3D GetV1(); 045: cPoint3D GetV2(); 046: double GetRadius(); 047: double GetHeight(); 048: double GetContent(); 049: double GetVolume(); 050: bool BelongToCylinder(cPoint3D X); 051: 052: private: 053: cPoint3D V1; 054: cPoint3D V2; 055: double radius; 056: double height; 057: double content; 058: double volume; 059: }; 060: 061: cCylinder::cCylinder() 062: { 063: this->V1 = cPoint3D(0.0, 0.0, 0.0); 064: this->V2 = cPoint3D(0.0, 0.0, 0.0); 065: this->radius = 0.0; 066: this->height = 0.0; 067: this->content = 0.0; 068: this->volume = 0.0; 069: } 070: 071: cCylinder::cCylinder(cPoint3D V1, cPoint3D V2, double radius) 072: { 073: this->V1 = V1; 074: this->V2 = V2; 075: this->radius = radius; 076: this->height = sqrt(pow(this->V1.x - this->V2.x, 2.0) + pow(this->V1.y – this->V2.y, 2.0) + pow(this->V1.z - this->V2.z, 2.0)); 077: this->content = 2 * pi * pow(this->radius, 2.0) + 2 * pi * this->radius * this->height; 078: this->volume = pi * pow(this->radius, 2.0) * this->height; 079: } 080: 081: cCylinder::~cCylinder() 082: { 083: 084: } 085: 086: void cCylinder::SetCylinder(cPoint3D V1, cPoint3D V2, double radius) 087: { 088: this->V1 = V1; 089: this->V2 = V2; 090: this->radius = radius; 091: this->height = sqrt(pow(this->V1.x - this->V2.x, 2.0) + pow(this->V1.y - this->V2.y, 2.0) + pow(this->V1.z - this->V2.z, 2.0)); 092: this->content = 2 * pi * pow(this->radius, 2.0) + 2 * pi * this->radius * this->height; 093: this->volume = pi * pow(this->radius, 2.0) * this->height; 094: } 095: 096: cPoint3D cCylinder::GetV1() 097: { 098: return this->V1; 099: } 100: 101: cPoint3D cCylinder::GetV2() 102: { 103: return this->V2; 104: } 105: 106: double cCylinder::GetRadius() 107: { 108: return this->radius; 109: } 110: 111: double cCylinder::GetHeight() 112: { 113: return this->height; 114: } 115: 116: double cCylinder::GetContent() 117: { 118: return this->content; 119: } 120: 121: double cCylinder::GetVolume() 122: { 123: return this->volume; 124: } 125: 126: bool cCylinder::BelongToCylinder(cPoint3D X) 127: { 128: bool flag = true; 129: 130: double u1 = this->V2.x - this->V1.x; 131: double u2 = this->V2.y - this->V1.y; 132: double u3 = this->V2.z - this->V1.z; 133: 134: double d1 = -(u1 * X.x) - (u2 * X.y) - (u3 * X.z); 135: double t = (-(u1 * this->V1.x) - (u2 * this->V1.y) - (u3 * this->V1.z) - d1) / (u1 * u1 + u2 * u2 + u3 * u3); 136: 137: cPoint3D XT = cPoint3D(V1.x + u1 * t, V1.y + u2 * t, V1.z + u3 * t); 138: 139: double dist_01 = sqrt(pow(X.x - XT.x, 2.0) + pow(X.y - XT.y, 2.0) + pow(X.z – XT.z, 2.0)); 140: 141: double d2 = -(u1 * this->V1.x) - (u2 * this->V1.y) - (u3 * this->V1.z); 142: double d3 = -(u1 * this->V2.x) - (u2 * this->V2.y) - (u3 * this->V2.z); 143: 144: double dist_02 = abs(u1 * X.x + u2 * X.y + u3 * X.z + d2) / sqrt(u1 * u1 + u2 * u2 + u3 * u3); 145: double dist_03 = abs(u1 * X.x + u2 * X.y + u3 * X.z + d3) / sqrt(u1 * u1 + u2 * u2 + u3 * u3); 146: 147: if ((dist_01 <= this->radius) && (dist_02 <= this->height) && (dist_03 <= this->height)) 148: { 149: flag = true; 150: } 151: else 152: { 153: flag = false; 154: } 155: 156: return flag; 157: } 158: 159: int main() 160: { 161: cPoint3D V1 = cPoint3D(0.0, 0.0, 0.0); 162: cPoint3D V2 = cPoint3D(0.0, 0.0, 4.0); 163: cCylinder Cylinder = cCylinder(V1, V2, 1.5); 164: 165: cout << Cylinder.BelongToCylinder(cPoint3D(0.0, 0.0, 2.0)) << endl; 166: cout << Cylinder.BelongToCylinder(cPoint3D(0.0, 1.0, 2.0)) << endl; 167: cout << Cylinder.BelongToCylinder(cPoint3D(1.0, 1.0, 2.0)) << endl; 168: cout << Cylinder.BelongToCylinder(cPoint3D(1.5, 0.0, 0.0)) << endl; 169: cout << Cylinder.BelongToCylinder(cPoint3D(1.5, 0.0, 4.0)) << endl; 170: 171: cout << Cylinder.BelongToCylinder(cPoint3D(2.0, 1.0, 2.0)) << endl; 172: cout << Cylinder.BelongToCylinder(cPoint3D(1.0, 2.0, 2.0)) << endl; 173: cout << Cylinder.BelongToCylinder(cPoint3D(10.0, 5.0, 7.0)) << endl; 174: 175: cout << endl; 176: 177: V1.~cPoint3D(); 178: V2.~cPoint3D(); 179: Cylinder.~cCylinder(); 180: 181: return 0; 182: }Na řádku 001 je zavolána direktiva preprocesoru #include, která přidává hlavičkový soubor iostream do zdrojového kódu. Část této standardní knihovny potřebujeme, protože chceme používat objekt cout, pomocí kterého budeme zapisovat informaci do okna konzolové aplikace. Podobně je na řádku 002 opět použita direktiva preprocesoru #include. Tentokrát ovšem kvůli přidání hlavičkového souboru cmath. Tento hlavičkový soubor je také součástí standardní knihovny jazyka C++ a potřebujeme jej, protože budeme používat funkce pow() a sqrt(). Jen pro ozřejmení funkci pow() budeme používat pro výpočet druhé mocniny námi zadaného argumentu a funkci sqrt() pro výpočet druhé odmocniny zadaného argumentu. Na řádku 003 pomocí klíčového slova using definujeme, že budeme používat jmenný prostor std. Tento řádek jsem do kódu umístil proto, abychom nemuseli ke objektům, třídám a funkcím, které do tohoto prostoru patří, přistupovat přes std a operátor přístupu :: . Kromě toho, že funkce pow(), sqrt(), objekt cout a manipulátor endl přísluší nějakým hlavičkovým souborům, patří i do jmenného prostoru std. Na řádku 005 je definována konstanta s identifikátorem pi. Ta reprezentuje Ludolfovo číslo a má hodnotu 3,14159. Tuto konstantu potřebujeme k výpočtu obsahu povrchu a objemu válce. Pokračujeme řádkem 007, na kterém pomocí klíčového slova class deklarujeme třídu s identifikátorem cPoint3D. Tato třída nám bude v programu reprezentovat bod ve 3D karteziánském souřadnicovém systému. Deklaraci zmíněné třídy začínáme na řádku 008 levou programovou závorkou, za kterou na řádku 009 následuje klíčové slovo public, kterým definujeme, že následujícím členům bude přidělen veřejný přístup. Na řádcích 010 až 012 jsou tedy deklarovány tři členské metody třídy cPoint3D, přičemž jsou to speciální členské funkce a to konkrétně dva konstruktory a destruktor. Na řádku 010 je deklarován výchozí konstruktor, kterému nepřísluší žádné parametry. Tento konstruktor slouží k vytvoření nové instance třídy cPoint3D s tím, že inicializuje datové členy na nulové (výchozí) hodnoty. Na řádku 011 je deklarován uživatelem definovaný konstruktor, který slouží také k vytvoření nové instance třídy, přičemž pomocí svých parametrů, přes které se předávají konkrétní argumenty (souřadnice bodu), inicializuje datové členy třídy. Rozdíl mezi prvním a druhým konstruktorem je ten, že první nepotřebuje parametry, protože inicializuje datové členy na 0, které lze pak přestavit jinou členskou metodou na konkrétní hodnoty, zatímco druhý konstruktor přiřazuje datovým členům nenulové hodnoty prostřednictvím argumentů předávaných přes parametry konstruktoru. K úplnosti textu uvádím, že druhý konstruktor má tři parametry x, y, az právě proto, že bod ve 3D prostoru má tři souřadnice ak tomu přísluší také tři členské proměnné třídy cPoint3D. Jsou to proměnné se stejným identifikátorem jako parametry konstruktoru, tedy x, y, z. Existují informační zdroje, které zpochybňují a nedoporučují totožnost identifikátorů parametrů konstruktorů a členských proměnných třídy. Já však toto názvosloví považuji za běžné a správné z toho důvodu, že existuje klíčové slovo this, které reprezentuje uvnitř objektu ukazatel na objekt a lze jeho prostřednictvím přistupovat k datovým členům. Tímto zápisem (syntaxou) se dá odlišit identifikace parametru a členské proměnné objektu. Je přece jasný rozdíl mezi x a this->x. První je parametr konstruktoru a druhé datový člen, ke kterému přistupujeme pomocí ukazatele. Na řádku 012 je deklarován destruktor, který nám bude sloužit k dealokaci paměti vyhrazené pro novou instanci třídy cPoint3D po jejím vytvoření. Destruktory jsou speciální členské funkce tříd, které slouží právě ke zmíněnému účelu, jednoduše řečeno, mají za úkol uklidit po objektu v paměti. Na řádcích 013 až 015 jsou deklarovány tři datové členy x, y az, kterým je přidělen typ double. Tyto reprezentují souřadnice bodu ve 3D kartézském souřadnicovém systému. Na řádku 016 se uzavírá deklarace třídy cPoint3D pravou programovou závorkou a středníkem. Jen připomenu, že středník tam musí být uveden, je to jeden z ojedinělých případů v jazyce C++, kdy se používá středník za programovou závorkou. Na řádku 018 začíná definice výchozího konstruktoru třídy cPoint3D. Jedná se o bezparametrický konstruktor, který inicializuje datové členy na řádcích 020 až 022 na nulu. Po tomto přiřazení se konstruktor ukončuje pravou programovou závorkou na řádku 023. Na řádku 025 začíná definice druhého uživatelem definovaného konstruktoru téže třídy, který na rozdíl od prvního má tři parametry, jehož prostřednictvím se předávají argumenty reprezentující souřadnice bodu ve 3D karteziánském souřadnicovém systému. Tyto se na řádku 027 až 029 přiřazují jednotlivým datovým členům. Konstruktor končí na řádku 030 pravou programovou závorkou. Na řádcích 032 až 035 je uvedena definice destruktoru třídy cPoint3D. Jeho tělo je prázdné a neobsahuje žádný kód tak, jak to bývá u většiny destruktorů. Pro zopakování úlohou destruktora je dealokovat (uvolnit) paměť, která byla konkrétní instanci třídy vyhrazena. Ve zdrojovém kódu se na řádku 037 dále pokračuje deklarací třídy cCylinder, která nám bude reprezentovat právě geometrický objekt válec. Na řádku 038 je uvedena levá programová závorka, která otevírá zmiňovanou deklaraci. Za ní je uvedeno klíčové slovo public, které slouží k přidělení veřejného přístupu k datovým členům a členským metodám, které jsou dále deklarovány. Zatímco třída cPoint3D měla pouze veřejné datové členy a členské metody, třída cCylinder obsahuje také členy soukromé. To znamená, že při této třídě budeme využívat techniku skrývání některých datových členů. Obor platnosti veřejného přístupu platí ve zdrojovém kódu po klíčové slovo private, tedy po klíčové slovo, které nastavuje jiný typ přístupu ke členům třídy. Pro úplnost informace dodám, že členům třídy může být přidělen ještě třetí typ přístupu protected, což v překladu znamená chráněný přístup. Tento typ přístupu však v tomto úkolu využívat nebudeme. Vraťme se ale zpět ke zdrojovému kódu. Na řádcích 040 až 050 jsou deklarovány všechny členské metody, kterým je přidělen veřejný přístup. Tyto si postupně rozebereme. Na řádku 040 je uvedena deklarace výchozího konstruktoru, který má za úkol inicializovat všechny datové členy třídy na nulové hodnoty. Jako poznámku uvedu, že nevidím moc smysl těchto konstruktorů, ale v praxi se volí právě zmiňovaný postup. To znamená, že se vytvoří dva konstruktory, jeden bez parametrů, jehož funkcionalita byla zmíněna výše a druhý konstruktor s parametry, přes které můžete datovým členům přiřadit již konkrétní nenulové hodnoty. Ke výchozímu konstruktoru je třeba potom doprogramovat implementaci metody (tzv. setter), která má stejnou funkci jako konstruktor s parametry. Rozdíl oproti použití parametrického konstruktoru je ten, že inicializujete datové členy třídy ve dvou krocích. V prvním kroku definujete objekt s inicializací datových členů výchozími nulovými hodnotami a ve druhém kroku se pak tyto členy inicializují na uživatelem zadanou hodnotu. Pro úplnost doplním, že smysl používání výchozích konstruktorů vidím při pointrové aritmetice, to znamená v případech, kdy jsou datové členy deklarovány jako směrníky základních vestavěných typů nebo typů, které jsou definovány uživatelem. Tehdy slouží výchozí konstruktor kromě vytvoření objektu pro alokaci paměti (konkrétně haldy) pro daný typ pomocí operátora new. Na řádku 041 je deklarován druhý konstruktor, který má tři parametry. První a druhý parametr jsou typu cPoint3D, ty reprezentují souřadnice středů podstav válce. Třetí parametr reprezentuje poloměr podstav válce. To jsou tři parametry, pomocí kterých lze jednoznačně definovat válec. Na řádku 042 je deklarován destruktor třídy cCylinder. Stejně jako u předešlé třídy má za úkol dealokovat paměť, která je vyhrazena pro novou instanci této třídy. Pokračujeme deklarací členské metody SetCylinder() na řádku 043. Jedná se o tvz. setter, neboli metodu, která má za úkol nastavit hodnoty členských dat třídy. Na řádcích 044 a 045 jsou deklarovány členské metody GetV1() a GetV2(). Tyto metody nemají žádné parametry a vracejí typ cPoint3D. Úkolem první z nich je vracet informaci o souřadnicích středu dolní podstavy válce, druhá z nich vrací informaci o souřadnicích středu horní podstavy válce. Na řádcích 046 až 049 jsou deklarovány členské metody GetRadius(), GetHeight(), GetContent() a GetVolume(). Jsou to gettery, které mají návratový typ double. V takovém pořadí, jak byly jmenovány, slouží k tomu, aby vraceli hodnotu členských dat, která reprezentují poloměr, výšku, obsah a objem válce. Na řádku 050 je deklarována členská metoda BelongToCylinder(). Jako návratový typ vrací bool. Tato metoda slouží ke zjištění toho, zda libovolně zvolený bod ve 3D karteziánském souřadnicovém prostoru patří do prostoru (objemu) válce nebo ne. Podotýkám, že vyřešení tohoto logického úkolu je nejnáročnější, protože musíte znát hlubší souvislosti z analytické geometrie. Ostatní implementace třídy cCylinder je poměrně jednoduchá záležitost oproti zmiňovanému úkolu. Na řádku 052 je uvedeno klíčové slovo jazyka C++ private, které zajistí, že dále deklarované datové členy budou mít soukromý přístup. Na řádcích 053 a 054 jsou pak deklarovány datové členy V1 a V2, které reprezentují střed dolní a horní podstavy válce. Právě proto jim byl přidělen datový typ cPoint3D. Dále jsou na řádcích 055 až 058 deklarovány datové členy radius, height, content a volume. Je jim přidělen datový typ double a ve stejném pořadí reprezentují poloměr, výšku, obsah a objem válce. Na řádku 059 je uvedena pravá programová závorka a středníkem, které uzavírají deklaraci uživatelem definovaného typu (třídy) cCylindr. Implementační detaily (definice) této třídy pokračuje na dalších řádcích zdrojového kódu. Na řádcích 061 až 069 je uvedena definice výchozího konstruktoru cCylinder. Konstruktor nemá žádné parametry, jeho úkolem je vytvářet novou instanci třídy cCylinder a inicializovat všechny datové členy této třídy na nulové hodnoty. Na řádcích 071 až 079 je uvedena definice druhého uživatelem definovaného konstruktoru, která má tři parametry. První dva jsou typu cPoint3D, pomocí nichž se předávají souřadnice středů dolní a horní podstavy válce. Přes třetí parametr, který je typu double, se předává hodnota poloměru válce. Datovým členům V1, V2 a radius jsou přímo přiřazeny hodnoty příslušejících parametrů konstruktoru. Hodnota datového členu height, která reprezentuje výšku válce, je vypočtena ze souřadnic bodů podstav. Výše válce se totiž rovná vzdálenosti těchto bodů, která je geometricky dána jako druhá odmocnina součtu mocnin rozdílu jednotlivých souřadnic dvou bodů. Vztah pro výpočet vzdálenosti dvou bodů je následující:[Image]Hodnota datového členu content, který reprezentuje obsah povrchu válce, je determinován výškou válce a poloměrem podstavy válce. Vztah pro výpočet obsahu povrchu válce je následující:[Image] Podle uvedeného vztahu se vypočítá obsah povrchu válce, jehož hodnota je přiřazena do členské proměnné content na řádku 077. Na řádku 078 je vypočtená hodnota objemu válce a přiřazena do členské proměnné volume. Objem válce je determinován také poloměrem a výškou válce podobně, jako tomu bylo při výpočtu obsahu povrchu válce. Vztah pro výpočet objemu válce je následující:[Image] Na řádku 079 je uvedena pravá programová závorka, která uzavírá definici uživatelem definovaného konstruktoru třídy cCylinder. Na řádcích 081 až 084 je uvedena definice destruktoru třídy cCylinder. Tělo destruktora je prázdné, jeho úkolem je dealokovat paměť, která byla vyhrazena pro novou instanci třídy cCylinder. Na řádcích 086 až 094 je uvedena definice členské metody SetCylinder, která má návratový typ void, čili vrací absenci informace. Tato metoda je tzn. setter, který má za úkol nastavit (přestavit) hodnoty datových členů třídy cCylinder. Jeho funkcionalita je stejná jako u uživatelem definovaného konstruktoru s tím rozdílem, že tato metoda není volána při vytváření nové instance. Může být však aplikována na instanci, která již byla vytvořena. Při jejím volání se změní parametry válce, čili lze jí definovat jiný válec ve 3D kartézském prostoru. Na řádcích 096 až 099 je definována členská metoda GetV1(). Má návratový typ cPoint3D, přičemž je to getter, který má za úkol vrátit souřadnice středu dolní podstavy válce, který je objektem třídy cCylindr reprezentován. Na řádcích 101 až 104 je definována členská metoda GetV2(). Má také návratový typ cPoint3D a podobně jako předešlá metoda má za úkol vrátit souřadnice středu podstavy válce, v tomto případě se však jedná o horní podstavu. Na řádcích 106 až 109 je definována členská metoda GetRadius(). Vrací návratový datový typ double, který reprezentuje poloměr podstavy válce. Na řádcích 111 až 114 je definována členská metoda GetHeight(). Jejím úkolem je vrátit hodnotu datového člena height, který reprezentuje výšku válce. Na řádcích 116 až 119 je definována členská metoda GetContent(). Tato metoda má za úkol vrátit hodnotu datového člena content, který reprezentuje vypočtený obsah povrchu válce. Na řádcích 121 až 124 je definována členská metoda GetVolume(). Tato metoda má za úkol vrátit hodnotu datového člena volume, který reprezentuje vypočtený objem válce. Na řádcích 126 až 157 je definována členská metoda BelongToCylinder(). Úkolem této metody je rozhodnout o tom, zda bod zadaný přes parametr patří do prostoru (objemu) válce nebo ne. Návratový typ této metody je bool, který reprezentuje právě pravdivostní hodnotu zmiňovaného rozhodnutí. Pokud bod se souřadnicemi zadanými přes parametr metody patří do prostoru válce, metoda vrací hodnotu true, ne-li, vrací hadnotu false. Na první pohled se zadaný úkol zdá jednoduchý, není tomu však tak. Právě proto uvedu následující předpoklady, které budeme potom analytickým postupem (výpočtem dokazovat): • patří-li bod do prostoru válce, musí být kolmá vzdálenost tohoto bodu od osy válce menší nanejvýš rovna poloměru podstavy válce, • patří-li bod do prostoru válce, musí být kolmá vzdálenost tohoto bodu od jeho dolní podstavy menší nanejvýš rovna výšce válce, • patří-li bod do prostoru válce, musí být kolmá vzdálenost tohoto bodu od jeho horní podstavy menší nanejvýš rovna výšce válce. K uvedeným předpokladům ještě dodám, že nestačí splnění jednoho nebo dvou z nich. Pokud chceme potvrdit výrok, že konkrétní bod patří do prostoru válce, musí být splněny všechny tři uvedené podmínky. Úspěšné vyřešení úkolu, má následující postup: 1. Vypočítáme souřadnice směrového vektoru přímky, která prochází středy obou podstav válce. Této přímce říkáme osu válce, která je jasně definována zmíněnými dvěma body (střed dolní a horní postavy válce). Souřadnice vypočítáme odečtením dvou bodů, což znamená, že provedeme rozdíl příslušných souřadnic bodů podle následujících vztahů:[Image] 2. Dále sestrojíme rovinu, která je kolmá na osu válce a zároveň prochází bodem, o kterém rozhodujeme, zda patří do prostoru válce nebo ne. Jelikož směrový vektor osy válce je totožný s normálovým vektorem zmíněné roviny, umíme vyjádřit koeficienty a, b, c, které jsou součástí obecného tvaru rovnice roviny. Z uvedeného vyplývá, že potřebujeme dopočítat už jen koeficient d obecného tvaru rovnice roviny. Obecný tvar rovnice přímky je tedy následující:[Image] Když z uvedené rovnice vyjádříme koeficient d, dostaneme následující matematický vztah:[Image] Po vypočtení koeficientu d, pokračujeme následujícím krokem, ve kterém počítáme souřadnice bodu, který vznikne průnikem osy válce a rovinou, která je na ni kolmá a prochází bodem, o kterém rozhodujeme, zda patří do prostoru válce nebo ne. 3. Mějme tedy osu válce (přímku), která je dána následujícím parametrickým vyjádřením[Image] Po rozvinutí pro jednotlivé souřadnice, vzniknou následující rovnice:[Image] Protože počítáme průnik přímky a roviny, dosaďme rovnice 3.2, 3.3 a 3.4 do rovnice 2.1, vznikne nám následující matematický vztah.[Image] Protože koeficienty a, b, c jsou souřadnice směrového vektoru osy válce, můžeme napsat:[Image] Po úpravě rovnice 3.6 a vyjádření parametru t, dostaneme následující vztah:[Image] 4. Po vypočtení koeficientu t, můžeme vypočítat souřadnice bodu, který vznikne průnikem osy válce a zmíněné roviny podle následujících vztahů[Image] 5. Označme bod, o kterém rozhodujeme, zda patří do prostoru válce identifikátorem A, dále označme bod, který vznikne průnikem osy válce a zmiňované roviny jako bod B, vzdálenost těchto dvou bodů pak vypočítáme podle následujícího vztahu[Image] Jak již bylo řečeno, je-li tato vzdálenost menší nanejvýš rovna poloměru podstavy válce, máme splněn první předpoklad, že zadaný bod patří do prostoru válce. 6. V tomto kroku budeme pokračovat analytickým způsobem, kterým budeme dokazovat, že bod splňuje druhý předpoklad, to znamená, že vzdálenost bodu od dolní podstavy válce je menší než výška válce. Budeme vycházet ze vztahu 2.2 a vypočítáme koeficient d pro rovinu, která je kolmá na osu válce, prochází však středem dolní podstavy válce. Tato rovina má stejný normálový vektor jako rovina, která procházela tím bodem, o kterém rozhodujeme, jestli patří do prostoru válce nebo ne. Koeficienty a, b, c, které vystupují v obecném tvaru rovnice roviny, přísluší tedy hodnotám souřadnic směrové vektoru osy válce. Z uvedené vyplývá, že když známe souřadnice normálového vektoru roviny a známe bod, který v ní leží (střed dolní podstavy válce), umíme vyčíslit hodnotu koeficienta d. 7. Po předchozím kroku nám už stačí dopočítat vzdálenost bodu od podstavy přímým vztahem, který je následující:[Image] Pokud je tato vzdálenost menší nanejvýš rovna výšce válce, máme splněn druhý předpoklad, abychom mohli tvrdit, že bod patří do prostoru válce. 8. Pokračujeme výpočtem vzdálenosti bodu od horní podstavy válce. Sestrojíme tedy rovinu, která je kolmá na osu válce a prochází středem horní podstavy válce. K tomuto přijedeme stejným způsobem jako v kroku 6. Obdobně podle vztahu 7.1 vypočítáme předmětnou vzdálenost. Pokud je tato menší nanejvýš rovna výšce válce, máme splněn poslední předpoklad, pro tvrzení výroku, že zadaný bod patří do prostoru válce. Právě tento postup je zachován při implementaci řádků zdrojového kódu 128 až 156. K označení jednotlivých parametrů, které byly součástí průběžného výpočtu se pouze použily v některých případech jiné identifikátory. Na řádku 128 je deklarována proměnná typu bool s identifikátorem flag. Do ní se uloží informace, která bude reprezentovat pravdivostní hodnotu výroku o tom, zda bod do prostoru válce patří či nikoli. Na začátku ji inicializujeme hodnotou true. Na řádku 130 je deklarována proměnná u1, která reprezentuje x složku směrového vektoru osy válce, vypočtená je jako rozdíl x souřadnic bodu V2 a V1. Na řádku 131 je deklarována proměnná u2, která reprezentuje y složku směrového vektoru osy válce, vypočtená je jako rozdíl y souřadnic bodu V2 a V1. Na řádku 132 je deklarována proměnná u3, která reprezentuje ze složku směrového vektoru osy válce, vypočtená jako rozdíl ze souřadnic bodů V2 a V1. Pro doplnění informace, identifikátory V1 a V2 patří datovým členům třídy cCylinder, které reprezentují souřadnice středů podstav válce. Na řádku 134 je vypočtena hodnota proměnné d1, která reprezentuje koeficient d v obecném tvaru roviny, která je kolmá na osu válce a prochází bodem X (bod, o kterém rozhodujeme). Tento koeficient je potřebný k tomu, aby byla kompletní rovnice roviny v prostoru. Potom lze vypočítat parametr t podle vztahu 3.7. Právě tento vztah modeluje přiřazovací příkaz na řádku 135. Po výpočtu parametru t můžeme definovat bod XT (bod, který je kolmým průmětem bodu X na osu válce), který je typu cPoint3D. Ten je definován na řádku 137 tak, že se zavolá konstruktor třídy cPoint3D, kterému se předají hodnoty argumentů. Tyto hodnoty se vypočítávají podle vztahů pro výpočet souřadnic bodu ležícího na přímce, která je dána svým parametrickým vyjádřením (vztahy 4.1 až 4.3). Na řádku 139 je deklarována proměnná dist_01, které se přiřazuje výpočet vzdálenosti bodu X od osy válce. Ta se vypočítá jako geometrická vzdálenost dvou bodů ve 3D kartézském prostoru, a to konkrétně bodu X a XT podle vztahu 5.1. Na řádcích 141 a 142 jsou vypočteny hodnoty proměnných d2 a d3, které reprezentují koeficient d rovin, které procházejí středy podstav válce a jsou kolmé na osu x. Z těchto koeficientů, směrového vektoru a souřadnic bodů X se vypočítávají vzdálenosti bodu od horní a dolní postavy válce. Tyto vzdálenosti se ve zdrojovém kódu počítají na řádcích 144 a 145. Na řádku 147 je uveden příkaz if, ve kterém je vyhodnocena pravdivost výrazu, který je tvořen třemi jednoduchými výroky. První z nich tvrdí, že vzdálenost bodu od osy válce je menší nebo rovna poloměru válce. Druhý z nich tvrdí, že vzdálenost bodu od dolní podstavy válce je menší nebo rovna výšce válce. A poslední z výroků obdobně tvrdí, že vzdálenost bodu od horní podstavy válce je menší nebo rovna než výška válce. Výroky jsou pospojovány logickým operátorem and, což znamená, že jsou-li současně všechny pravdivé, složený výrok je také pravdivý a řízení programu přejde na řádek 149, kde se hodnotě flag přiřadí pravdivostná hodnota true. Je-li jen jeden ze tří výroků nepravdivý, složený výrok je nepravdivý také, což znamená, že bod nepatří do prostoru válce a řízení programu přejde na řádek 153 do klauzule else, kde se přiřadí hodnotě flag pravdivostná hodnota false. Na řádku 156 se vrací hodnota proměnné flag pomocí klíčového slova return. Na řádku 159 začíná definice funkce main(), kterou volá operační systém. V těle této funkce jsou na řádku 161 a 162 vytvořeny nové instance třídy cPoint3D, které reprezentují středy podstav válce. Na řádku 163 je vytvořena nová instance třídy cCylinder, kde se pomocí parametrů konstruktoru předávají argumenty reprezentující středy podstav a poloměr válce. Na řádcích 165 až 173 jsou do okna konzolové aplikace zapsány informace o tom, zda body, jejichž souřadnice zadané jako argumenty členské metody BelongToCylinder(), patří do prostoru válce nebo ne. Celkově jsme volali tuto členskou ve zdrojovém kódu 8krát. To znamená, že jsme prověřovali osm bodů. Jen pro informaci prvních pět patřilo do prostoru válce a další tři ne. Pro správnost programu si výsledky můžete ověřit analytickým postupem, který je v předchozím textu uveden. Na řádku 175 se pouze přechází v okně konzolové aplikace na další řádek. Na řádcích 177 až 179 jsou již jen zavolány destruktory definovaných objektů z důvodu dealokace paměti. Na řádku 181 je vrácena hodnota 0 operačnímu systému. Na řádku 182 se ukončuje tělo funkce main() pravou programovou závorkou. V závěru vám chci poděkovat za přečtení blogu. Doufám, že vás článek, který se týkal objektově orientovaného programování a příkladu z analytické geometrie zaujal. Podstatnou přidanou hodnotou zdrojového kódu byla členská funkce, která rozhodla o tom, zda bod zadaný jako argument této funkce patří do prostoru válce či nikoli. Byl to skutečně náročnější úkol a proto jsem rád, že jste řešení pochopili a spolu se mnou tento úkol rozlouskli. Autorem tohoto článku je Marek Šurka.
Digitální svět v G-Suitu
Vzdělávání
13.10.2020
Skillmea

Digitální svět v G-Suitu

Žijeme v době, kdy jsou technologie již povinnou součástí našich životů. Postupně jak jsme do tohoto světa vstupovali, tak jsme si nebyli ani vědomi, do jakých rozměrů to naroste a stane se to naší součástí. Pro naše pohodlí jsme zkoušeli různé technologie, které nám usnadňují život a pomáhají řešit problémy. Dostali jsme se do stavu, že využíváme řady programů, které jsou online nebo offline a odebíráme různé novinky či newslettery od různých firem. Najednou jsme se ocitli ve stavu, kdy nás začaly tyto technologie a informace zahlcovat a vyžaduje to z naší strany více času na jejich organizaci. Není důležité, jak to bylo, ale je důležité, co bude a jak s tím naložíme dnes. Z tohoto důvodu vám chci představit G-Suite, mix nejlepších aplikací od Google, který vytvořil léty tvrdé práce s lidmi. Představení G SuiteG Suite nám nabízí řadu nástrojů pod jednou střechou, pod jedním přístupem, vše krásné pohromadě. Usnadňuje organizaci dat, souborů, mailů a ostatních věcí. Kdo G Suite nezná, tady je krátké představení: G Suite je předplatné cloudových služeb a kancelářských aplikací. K tomuto musím zmínit samozřejmě samotný Gmail, který nabízí základní služby G Suite. G-suite je vhodný jak pro jednotlivce, tak pro malé, střední a velké firmy. Gmail a G Suite obsahuje: • Gmail - Mailový server, mailová pošta • Hangouts / Meet - Videokonference • Kalendář • Google Disk • Google Dokumenty • Google Tabulky • Google Formuláře • Google Prezentace Toto vše je v základním balíčku pro Gmail a G Suite. Hlavní rozdíl je v tom, že v G Suite můžete mít vlastní doménu emailu, v Gmailu máte příponu @gmail.com[Image] Přednosti G Suite se objevují při nasazení ve firemním prostředí. Obsahuje: • Archivace emailů a konverzací • Google Sejf  Vault • Google Cloud Search • Správa prostředí • Správa mobilních zařízení Jednoduše vše, co je zapotřebí ve firemním prostředí, ve kterém pracuje více lidí a je důležité mít společné kalendáře, nastavení přístupů do pracovních složek, sdílení jednotlivých dokumentů, plánování, kontrola. Největší výhody G SuiteSpolupracování v reálném čase V dokumentech či tabulkách může pracovat najednou více lidí a to zároveň upravovat dokument, psát k němu komentáře, opravovat jej, editovat. Ukládat a sdílet soubory Ukládáte soubory na Google Disk, který je zálohován a zabezpečen a sdílíte soubory pouze s tím, kým potřebujete, vše máte přesně pod kontrolou. Zabezpečení dat Obsahuje bezpečnostní opatření, dvoufázové ověření, jednotné přihlášení. Při ztrátě zařízení nepřijdete o data. Archivace emailů. a mnoho dalšího. Implementace G SuiteG Suite je ideální řešení pro každého, kdo má rád jednoduchost a potřebuje pracovat v digitálním světě. Vytvářet dokumenty, být propojen s kolegy a sdílet soubory a to vše je možné z jakéhokoli místa na světě, kde máte připojení k internetu. Pokud byste si chtěli takové řešení vybudovat sami, stálo by Vás to mnohem více peněz, než platíte měsíčně Google produktem G Suite. G Suite posouvá své hranice dál a vždy se snaží dodat to, co je zapotřebí. Vzniká mnoho dalších nástrojů jako například: • Apps Script, což je vytváření vlastních příkazů, které se mají zpracovávat či na úrovni makra v tabulkách nebo jiných částí, • Weby, • Google Cloud Platform, který se postará o chod aplikací napojených na mobilní zařízení nebo webové stránky, Google AI, který pomáhá automatizaci, technologie budoucnosti, a mnoho dalšího. Podívejte se na naše videotutoriály a naučte se základy práce s G Suite, pokud máte dotazy napište nám. Pokud uvažujete o implementaci G Suite, oslovte nás a jsme schopni vám pomoci od začátku po úplnou implementaci G Suite do vašeho prostředí. Vyškolíme vás, jak s G Suite nejlépe pracovat.
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);
Matematické operace v Excelu
Vzdělávání
28.07.2020
Skillmea

Matematické operace v Excelu

Funkce a vzorce jsou možná nejvyužívanější částí Excelu a v tomto blogovém příspěvku se podíváme na nejdůležitější matematické operace. Pomocí matematických operací umíme vypočítat například průměr, maximální či minimální hodnoty, součty. Funkce SUM (Součet)Je to pravděpodobně nejpoužívanější matematická funkce, která jednoduše spočítá hodnoty ve vybraných buňkách, viz obrázek níže. Funkci SUM můžeme použít i pro sčítání normálních čísel. =SUM(9;2;8)funkcia nám dá výsledok 19.[Image] Funkce SUMIF (Součet na základě podmínky)Zajímavou součtovou matematickou funkcí je SUMIF, která spočítá hodnoty s nějakou podmínkou. Například z tabulky níže chceme spočítat „Cenu po slevě“ spolu za všechny objednávky z města Martin. V argumentech funkce SUMIF nás samotný Excel navádí na to, co máme zadat. Boldem jsou zvýrazněny argumenty Kritéria a Rozsah, které spolu souvisí. Kritériem je to, co je naší podmínkou - tedy konkrétně Martin. Rozsah jsou ty buňky, ve kterých umíte najít svá kritéria. Čili označíme sloupec Město. Rozsah souhrnu je to, co chci spočítat - označíme tedy sloupec 'Cena po slevě'. Klepneme OK a dostaneme výsledný součet.[Image] Funkce ROUND (Zaokrouhlování)Funkce Round zaokrouhluje matematicky. Argumenty funkce je číslo, které chceme zaokrouhlit a druhý argument je na kolik desetinných míst chceme dané číslo zaokrouhlit.[Image] Funkce SUBTOTAL (Součtová řádka)Tato funkce se využívá při tvorbě součtových řádků v tabulkách. Jedná se o praktickou funkci, která dokáže nahradit několik dalších funkcí. SUM, COUNT, MIN, MAX a podobně. Její velkou výhodou je, že pokud použijete např. filtr, umožní ti rozhodnout se, co se skrytými řádky. Prohlédněte si obrázky níže, v prvním nemáme použito žádné filtrování a výsledky funkcí SUM i SUBTOTAL jsou shodné. Když se však podíváme na obrázek číslo dvě, ve kterém jsou již použita filtrování, výsledky funkcí SUM a SUBTOTAL jsou rozdílné a správný výsledek nám dává právě funkce SUBTOTAL. Je to právě kvůli tomu, že spočítává jen viditelné hodnoty v buňkách, nikoli hodnoty v buňkách, které jsou skryty.[Image][Image] Funkci subotal si vyvoláme jako každou jinou funkci a její argumenty jsou následující: • Číslo funkce: pokud neznáte přesné číslo funkce, je vhodné si otevřít pomocníka a vyhledat si tu správnou funkci. V našem případě je to číslo funkce 109, protože se jedná o funkci SUM a ignorujeme skryté hodnoty. • Odk1: rozsah, se kterým má naše funkce pracovat, tedy označíme všechny buňky, které má funkce spočítat nebo provést jinou matematickou operaci. Čísla funkcí pro funkci SUBTOTAL: Číslo funkce (zahrnuje skryté hodnoty)Číslo funkce (ignoruje skryté hodnoty)Funkce1101AVERAGE 2102COUNT3103COUNTA4104MAX5105MIN6106PRODUCT7107STDEV8108STDEVP9109SUM10110VAR11111VARP  Average (Průměr)Matematická funkPrůměrce Average (Průměr) vypočítá průměrnou hodnotu z rozsahu buněk. Vyvoláme si funkci a do syntaxe označíme všechny hodnoty, ze kterých chceme vypočítat průměr.[Image] I tuto funkci můžeme modifikovat pomocí IF a tedy použít funkci s podmínkou AVERAGEIF. OdmocninaV Excelu umíte velmi rychle a jednoduše odmocňovat. Existuje k tomu matematická funkce SQRT, která má jen jeden argument a tedy číslo, ze kterého chceme druhou odmocninu vypočítat. Funkci SQRT lze použít pouze pro druhou odmocninu. Chcete-li vypočítat jinou, je třeba použít matematický vzorec Y(1/x) případně funkci POWER(). Pokud se chceš zdokonalit v Excelu, podívejte se na některý z našich Excel online kurzov pro začátečníky alebo pokročilé. Pokud se chceš naučit používat Excel ještě efektivněji, přečti si i náš článek o klávesových zkratkách v Excelu. V dalším blogovém příspěvku se podíváme na dalí zajímavosti z Excelu, zaměříme se na vyhledávací funkce VLOOKUP a HLOOKUP.
Již 4 000 dětí se zúčastnilo webinářů STEM Kindloteka
Vzdělávání
30.06.2020
Skillmea

Již 4 000 dětí se zúčastnilo webinářů STEM Kindloteka

Společnost Amazon začala ve spolupráci se sdružením Learn2Code v dubnu, během pandemie a povinné karantény, bezplatné online webináře STEM Kindloteka pro děti. Tato iniciativa probíhala současně v Česku i na Slovensku. Amazon chtěl touto iniciativou pomoci dětem, jejich rodičům a učitelům v náročném období, během kterého byly školy zavřené. Od konce dubna až do konce června sdružení Learn2Code s podporou společnosti Amazon připravilo 39 bezplatných webinářů, kterých se v obou zemích zúčastnilo 4 000 dětí v přímém přenosu. Dodatečně měli webináře na kanálu YouTube téměř 6 500 vidění. Odezva od rodičů i dětí byla velmi pozitivní. „Syn je nadšený, Scratch-u se věnuje každý den a vaše webináře jsou super. Nestíhá je sice dívat živě ale druhý den je dívá na youtube a moc ho to baví!“ Říká paní Lenka, máma 9 letého účastníka. Vyjádření syna bylo velmi stručné ale výstižné: "Je to zábava a chci se přihlásit i na další kurz." Webináře probíhaly dvakrát týdně až do konce června. Během webinářů se děti učily programovat v programovacím jazyce Scratch i velké hry. Flappy Bird, Pacman, Super Mario a další. Děti se na nich učily vše od začátku až po složitější příkazy. Po každém webináři obdrželi účastníci jeho videozáznam, zdrojové kódy, obrázky i řešení. Naše webináře sledovali i učitelé, pro které se staly pomůckou. „Já jsem byla velmi spokojená s webináři, hodně jsem se naučila a účastí na nich jsem získala nové dovednosti a cenné metodické materiály,“ hodnotí webináře Mária Vitikáčová, učitelka ze ZŠ Bukovecká v Košicích. „Super je archiv a videonahrávky, ke kterým se můžeme kdykoli vrátit,“ dodává. Účastníci měli možnost připojit se přes nástroj Zoom, v případě, že se chtěli aktivně zapojovat, nebo přes YouTube, pokud chtěli webinář jen online sledovat. Všechny webináře si mohou i nadále prohlédnout na YouTube kanálu Learn2Code. „Spolu bylo zrealizováno téměř 40 webinářů, které si děti hned oblíbily. Aktivně se do našich online setkání zapojovali. Kladli spoustu zvědavých otázek,“ řekl Marián Kristeľ marketing & operations z Learn2Code. „Každé lekce se zúčastnilo průměrně přes 100 dětí.” Spolupráce mezi Learn2Code a společností Amazon zahrnovala také poskytnutí všech online kurzů pro děti od Learn2Code od poloviny dubna do konce června bezplatně. I tato aktivita zaznamenala velký úspěch. Na tyto kurzy se od spuštění spolupráce přihlásilo více než 2000 uživatelů. Jelikož spolupráce mezi Learn2Code a Amazonem zaznamenala úspěch, připravili společně i další formát, tentokrát pro rodiče a učitele. V speciálním videu s Lucií Šickovou, spoluzakladatelkou světově úspěšné slovenské firmy Pixel Federation, která tvoří počítačové hry vysvětlili, jaký význam může mít programování ve výchově a rozvoji dětí. Lucie Šicková je zároveň mámou tří malých dětí. Zabývali se tedy i tématy, jakou školu a proč navštěvují její děti, zda a kolik se s dětmi učí a jak se to změnilo během domácí karantény, zda ověřené tipy, co ve výchově funguje. „Jelikož koronakrize odhalila různé nečekané otázky ohledně vzdělávání a výchovy dětí, rozhodli jsme se podpořit i takový formát pro rodiče a učitele. Věříme, že to bude pro rodiče užitečné,“ řekla Miroslava Jozová, PR manažerka Amazon pro ČR a Slovensko.