Náš blog

O zlatom reze a jeho aplikáciách v dizajne
Vzdelávanie
11.04.2021
Ľudovít Nastišin

O zlatom reze a jeho aplikáciách v dizajne

V dizajne ako takom je veľmi dôležité, aby bol výsledok práce jasný a každý mu chápal. Či už je to vo forme zalomenia textu, orezania fotografie alebo navrhnutia loga. Za týmto účelom sa okrem iných pomôcok často využíva aj aplikácia zlatého rezu, o ktorom si teraz niečo povieme.  Z angl. „Golden ratio“  hovoríme o konkrétnom matematickom pomere, ktorý sa veľmi často vyskytuje aj v prírode a dizajnové odvetvie sa nim inšpiruje. Zlatý rez nám pomáha dosiahnuť čo najprirodzenejšie pôsobiace proporcie, tvary či štruktúry. “Zlatý rez vznikol už v starovekom Grécku” Ide o veľmi špeciálne číslo – 1,618. Vychádza zo známej Fibonacciho postupnosti a jeho aplikáciu môžeme nájsť aj v prírode, napríklad v tvare morskej mušle či vo formácii oblakov pri hurikánoch. Táto postupnosť  je tvorená vždy sumou dvoch predchádzajúcich čísel (0-1-1-2-3-5-8-13-21-...). A práve z tejto sekvencie odvodili už v starovekom Grécku zlatý rez (golden ratio), aby vedeli lepšie vyjadriť rozdiely medzi číslami sekvencie. Ako používať zlatý rez v dizajne  Aplikácie zlatého rezu do dizajnérskej profesie vôbec nie je tak náročná, ako by sa mohlo na prvý pohľad zdať. Jeho využitím môžeme vytvárať napríklad proporcionálne layouty na web. Ak chceme navrhnúť web, ktorý má vedľa priestoru pre hlavný obsah aj sidebar, tak práve s využitím zlatého rezu vieme stanoviť ich presnú šírku.  Ak by sa jednalo povedzme o priestor so šírkou 960px, tak priestor pre hlavný obsah by mal mať šírku 593px (960px / 1,618) a sidebar šírku 367px (593px / 1,618). Samozrejme, že v praxi do toho vstupuje viacero ďalších faktorov (napr. padding), no logiku tohto pomeru to deklaruje vynikajúco.[Image]A keďže toto číslo vychádza zo sekvencie nekonečného množstva čísel, tak jeho opakovaným aplikovaním získame rôzne veľkosti (dĺžky, šírky,...), s ktorými môžeme v dizajne pracovať a vyskladať z nich funkčné a intuitívne UI.   Ako sme si už hovorili, zlatý rez sa dá aplikovať v podstate na všetky oblasti dizajnu či kreatívy. Ukážeme si k tomu niekoľko príkladov. Orezávanie obrázkov  Ak ide iba o orez prázdneho priestoru na kraji fotografie, vec je jednoznačná. Ale ak treba orezať aj samotný obsah fotografie či obrázku, situácia sa mení. Výsledok musí ostať vyvážený a tie najdôležitejšie veci na obrázku by mali mať svoje miesto. Práve s tým nám vie pomôcť zlatý rez.[(Zdroj: industrydev.com)] Typografia a hierarchia  Vieme si tiež pomôcť pri výbere správnej kombinácie veľkosti použitých fontov. Takto bude mať názov, podnázov a samotný text tú správnu veľkosť a hierarchia medzi nimi bude okamžite jasná.[(Zdroj: Invisionapp)] UI Webdizajn  Rozloženie jednotlivých elementov a plôch na webe rozhoduje o tom, ako intuitívne sa bude návštevník webu cítiť. A rovnako aj, či sa mu to bude páčiť. Ako sme už skôr písali v článku, napríklad šírka jednotlivých stĺpcov je vďaka zlatému rezu jasne stanovená.[(Zdroj: Apiumhub)] LogoA posledným príkladom je využívanie zlatého rezu pri tvorbe loga. Tu to možno na prvý pohľad nie je až tak očividné. No verte, že zlatý rez sa tu aplikuje veľmi často a aj tie najznámejšie logá boli vytvorené práve s jeho pomocou.[(Zdroj: Twitter, NatGeo)]Niekedy ho v logu nájdete jednoducho (National Geographic logo), inokedy je to trošku skryté (Twitter logo). Práve v tom druhom prípade bolo logo vytvárané za pomoci série kružníc s jasne danými veľkosťami. Tie pomáhali vytvárať všetky krivky a záhyby loga, až kým z neho nevzniklo ikonické logo, ktoré pôsobí prirodzene a pekne. A nie je to náhoda. Zlatý rez je nie je technika, je to skôr myšlienkový proces. Vedieť ho aplikovať efektívne chce svoj čas. Určite sa však oplatí pohrať sa s ním a skúšať podľa neho vytvárať nejaké layouty či orezávať dôležité fotografie. Šikovnú pomôcku v podobe špirály zlatého rezu nájdeš tu.
Študijný plán pre budúceho JavaScript programátora
Vzdelávanie
26.03.2021
Skillmea

Študijný plán pre budúceho JavaScript programátora

Ľudia sa nás často pýtajú, ako sa stať frontend developerom, aké technológie by mali ovládať, čo všetko vedieť, kde začať a aká je správna postupnosť jednotlivých online kurzov. Na základe našich skúseností, rád od lektorov ako Yablko a ďalších, sme v tomto článku dali dokopy študijnú cestu budúceho frontened developera. Frontend developer vs backend developer vs fullstack developerFrontend developer, frontenďák je človek, ktorý je zodpovedný za časti webovej aplikácie alebo webstránky, ktoré používatelia vidia a interagujú s nimi. Backend developer je človek, ktorá má na starosti všetko to, čo človek nevidí - infraštruktúra, dátový model, databáza. No a potom je tu full-stack developer, ktorý je zmesou frontendu aj backendu a zvládne celý proces návrhu webovej aplikácie od začiatku do konca. Pomôžme si týmto meme pre lepšiu vizualizáciu:[Programátorské meme]V dnešnej dobe sa dosť stiera hranica medzi frontendom a backendom. Je to kvôli tomu, že čoraz viac úloh, ktoré spadajú do oblasti backendu, majú na starosti frontend vývojári. Frontend developer robí najmä tieto úlohy: • rozhoduje o dizajne a štruktúre webstránok, • vyvíja funkcie na dosiahnutie dobrej používateľskej skúsenosti (user experience), • dbá na responzivitu webstránky, • optimalizuje webstránku pre rýchle načítanie a škálovateľnosť v budúcnosti, • volí správnu kombináciu webových technológií pre dosiahnutie najlepšieho výsledku. Zručnosti front-end developeraDobrý frontenďák je na nezaplatenie. Doslova. Pri vývoji webstránok či aplikácií je nesmierne dôležitý a musí preto mať komplexné znalosti nielen z oblasti vývoja webu: • ovládať technológie ako HTML, CSS, JavaScript a ďalšie (čítaj ďalej v článku), • ak vie pracovať s nejakým grafickým softwarom ako napr. Photoshop, Sketch alebo Illustrator, je to veľké plus, • základné znalosti SEO, • dobré komunikačné znalosti, lebo veľa komunikuje s kolegami (grafik, backend developer, projektový manažér, klient), • nezľakne sa problémov a vie ich riešiť. Mzda frontend developeraPodľa portálu platy.sk na Slovensku zarába JavaScript developer (prečo sme vybrali práve pozíciu JavaScript developer sa dozvieš nižšie v článku) od 1.300 Eur až po 2.900 Eur. Záleží od počtu rokov praxe, skúseností, projektoch na akých si už pracoval a tak ďalej. Dobrých JavaScript developerov firmy stále hľadajú, takže keď naskočíš na vlak frontend  developmentu, o prácu budeš mať postarané.[Image] JavaScript je aj extrémne populárny, podľa RedMonk rebríčka je JavaScript číslo 1 čo sa týka popularity na GitHube a Stack Overflow. Keď pohľadáš aj otvorené pozície napr. na Profesii, vyhodí ti to stovky pozícií JavaScript či frontend programátora. A keď si do svojho LinkedIn profilu doplníš, že ovládaš JavaScript a k tomu nejaký JavaScript framework, inbox ti vybuchne od ponúk rôznych IT recruiterov. Poď na to a pozri si návod, ako sa stať frontend programátorom. Ako sa stať frontend developerom?Nenechaj sa odradiť a choď za svojim cieľom. V texte nižšie sme vypichli podľa nás tie najdôležitejšie technológie, ktoré by si ako dobrý frontenďák mal ovládať. Poďme na to. “TL;DR: HTML, CSS a JavaScript sú chrbtovou kosťou frontend developmentu. Frontend development kombinuje práve tieto tri technológie a k tomu JavaScriptové frameworky (alebo knižnice).” Krok číslo 1: HTML a CSSToto je úplne prvá téma, ktorej by si sa mal venovať, pokiaľ máš v pláne byť frontend developerom. Je to alfa a omega celého frontend developmentu. HTML a CSS používajú všetky weby, všetky webové aplikácie. HTML a CSS ťa zadarmo naučí kurz Webrebel 1: HTML, CSS a JavaScript. Všetky videá o HTML a CSS sú k dispozícii zadarmo, stačí sa prihlásiť do kurzu. V tomto kurze sa naučíš aj dôležité veci o tom, ako vôbec internet funguje, ako fungujú prehliadače, čo je HTTP a HTTPS, DNS, JSON, XML a kopec ďalších skratiek, ktorým teraz možno nerozumieš, ale v procese tvorby webstránok sú to dôležité znalosti. A keď budeš pri CSS, venuj mu poriadne veľa času. Môže sa zdať, že je ľahké pracovať s CSS, ale na jeho zvládnutie je potrebného veľa času. Skús sa opýtať backend developera, prečo nie je frontendistom? Šanca, že ti odpovie, "Lebo neznášam CSS" je dosť vysoká. Sledovať videá nestačí a preto si určite počas ich sledovania rob domáce úlohy, ktoré v kurze sú. Urob si svoje vlastné portfólio, ponúkni sa svojim známym, že im spravíš webstránku, rob maličké projektíky len tak pre svoje potešenie a takto sa budeš zdokonaľovať a chytíš písanie kódu za pačesy.[Ukážka HTML, CSS, JavaScript |Zdroj: https://moz.com/blog/javascript-seo] Krok číslo 2: píš lepšie CSSLepšie CSS sa naučíš písať napríklad vďaka preprocesorom. Známymi preprocesormi sú Sass, Less alebo Stylus. Preprocesor je program, ktorý spracuje kód v jednom formáte (napr. Sass) a zmení ho na kód v druhom formáte (CSS). Vďaka Sass vieš písať menej kódu a bude prehľadnejší.  Keď budeš robiť na webových projektoch, je dobré ovládať aj nejaký ten CSS framework. Najväčšími frajermi na tomto poli sú pravdepodobne Bootstrap a Foundation. Bootstrap je iniciatíva Twitteru a zaslúži si veľkú pochvalu za zavedenie responzívneho dizajnu vo veľkom meradle. Bol to prvý framework, ktorý podporoval filozofiu 'mobile-first'. Pomocou Bootstrapu vieš relatívne rýchlo vytvárať responzívne weby.  Ak je pre teba Bootstrap zbytočne obmedzujúci v tom, ako tvoj dizajn bude vyzerať, vyskúšaj CSS framework Tailwind 2. Je pre ľudí, ktorí chcú mať flexibilitu a tvoriť vlastný dizajn. Tailwind je intuitívny a moderný CSS framework, ktorý sa dá rýchlo naučiť. Krok číslo 3: trošku prikúrime - JavaScriptJavaScript bude pre teba ako frontend developera bezpochyby najdôležitejšou zručnosťou. Ako sa naučiť JavaScript? Logická odpoveď: začni základmi. Nebuď povrchný, ale ani v úvode nechoď do úplných detailov. Learning by doing je naše odporúčanie, keď sa učíš JavaScript: 1. Nauč sa základy JavaScriptu, 2. Nauč sa React, Vue alebo Angular, 3. Pochopíš, že nemáš dobré základy JavaScriptu, 4. Vráť sa k bodu 1. a nauč sa poriadne JavaScript. JavaScript je už niekoľko rokov po sebe najpopulárnejším programovacím jazykom, pozície vyžadujúce JavaScript pribúdajú ako huby po daždi. Keď budeš vedieť JavaScript, o robotu máš postarané. Yablko pripravil parádny kurz o modernom JavaScipte. Tento kurz ťa naučí písať moderný JavaScript, budeš vedieť jeho syntax (ES6 a ES7), aby si nepísal spaghetti code a pravidlá jazyka. Okrem toho, zvládneš nástroje ako package managers (správa závislostí) npm a yarn, skrotíš DOM, budeš vedieť používať nástroje ako Webpack a tak ďalej. V kurze je takmer 23 hodín materiálu o modernom JavaScripte, bude to fuška, ale výsledok bude stáť za to. Krok číslo 4: vyber si svoj osud - Vue, React, AngularKeď si zvládol predchádzajúce tri kroky, si pripravný naučiť sa pracovať s mocnými nástrojmi v podobe JavaScript frameworkov alebo knižníc. Aktuálne v roku 2021 sú najviac v kurze Angular, React a Vue. Nemusíš vedieť všetky, radšej jeden a poriadne. Každá z týchto technológií má svoje pre a proti a sú určené na komplexný vývoj frontendových webových aplikácií. Tieto frameworky sú si podobné a pokiaľ sa naučíš jeden, prejsť na iný framework nie je až také náročné. Poďme si teraz veľmi stručne predstaviť spomínané tri frameworky. Angular je vývíjaný spoločnosťou Google, prvýkrát bol vydaný v roku 2010 a je postavený na TypeScripte. Otcom Angularu je Slovák Miško Hevery. V roku 2016 bol predstavený výrazný update tohto frameworku - Angular 2, v rámci ktorého došlo aj k vypusteniu "JS" z názvu. Okrem Googlu samotného používajú Angular weby ako PayPal, Upwork, Microsoft a ďalšie. React je vyvíjaný ďalším gigatnom - Facebookom, ktorý ho okrem iného používa v aplikáciách Instagram či WhatsApp, na Reacte fičia aj weby Netflixu či Uber. Prvý release bol v roku 2013 a ide o JS knižnicu pre vytváranie používateľských rozhraní (UI).  Vue je najmladším JS frameworkom v tomto výbere. Vue za sebou síce nemá žiadnu veľkú firmu, ale tiež je používaný veľkými firmami, napr. Alibaba, Behance alebo GitLab. S príchodom Vue 3 v septembri 2020 prešlo Vue na TypeScript.[JavaScript frameworks Angular, React, Vue] BONUSGitGit sa používa vo väčšine vývojárskych firiem, čím skôr sa naučíš s Gitom pracovať, tým lepšie pre teba. Git je verziovací systém, vďaka ktorému sa môžeš kedykoľvek vrátiť k pôvodnej verzii svojho kódu, zdieľaš kód s kolegami spolupracovníkmi, pracuješ v tíme. Git ovládaš cez príkazový riadok alebo si nainštaluješ nejaké GUI pre Git. Git ti vlastne ukladá celú históriu tvojho projektu do repozitára. Svoje repozitáre ukladáš na akomsi hostingu - čo môže byť GitHub, GitLab či Bitbucket. TestovanieAk chceš byť úplný kráľ, svoj kód určite aj testuj. Vyhneš sa tak mnohým problémom pri vývoji. Pri JavaScripte sú najpoužívanejšie knižnice pre testovanie Jest, Mocha, Chai. ZáverNezabúdaj, nemusíš dokonale ovládať všetko z vyššie uvedeného. V tomto článku sme sa snažili priniesť ti prierez technológií, ktoré by si mal ovládať, pokiaľ sa chceš stať frontend programátorom. Mohlo by sa zdať, že ich je priveľa a bojíš sa, že to nezvládneš. Pre dodanie sebadôvery si prečítaj tieto príbehy absolventov našich kurzov, ktorí sa rozhodli zmeniť kariéru. Alebo si pozri zopár rozhovorov s absolventami na našom YouTube. Nikdy nie je neskoro začať s programovaním. Keď sa rozhodneš pre vzdelávanie formou online kurzov, najdôležitejšie je vydržať. Držíme ti palce. Kódovaniu zdar!
Kotlin Raw String
Vzdelávanie
19.02.2021
Skillmea

Kotlin Raw String

String je základný dátový typ v programovacích jazykoch. Slúži na uchovanie textu. Ak chceme napísať String tak text vložíme medzi dvojité úvodzovky.  val cesta = "cesta";Vo väčšine prípadov je to dostačujúce. Čo ak do textu chceme nastaviť cestu na súbor ako text. C:\work\tools\__test Musíme ho vložiť do premennej typu String a všetky lomítka zdvojiť - escapnúť.  val cesta = "C:\\work\\tools\\__test";Kotlin má aj pomôcku a tou je Raw String. Na napísanie textu použijem trikrát dvojité úvodzovky na začiatku aj na konci. val cestaRaw = """C:\work\tools\__test"""Raw String nám umožňuje zapísať String na viac riadkov bez nutnosti spájania pomocou +.  Mám text, ktorý chcem napísať na viac riadkov. Čo musím spraviť ak to chcem v jednom Stringu? Všetky časti spojím pomocou + a pridám špeciálnu značku pre nový riadok \n. val text = "1 639,33\n" + "6 540,03\n" + "8179,36\n" + "+2500,04"Pri Raw Stringu len stlačím enter pre nový riadok a pokračujem v písaní. val textRaw = """1 639,33 6 540,03 8179,36 +2500,04"""Tento spôsob ale nie je pekne čitateľný – všetok text mám zasadený na ľavú stranu, lebo nechceme aby sme tam dali napr. taublátor – v pôvodnom textne nebol.  Čo môžeme spraviť je pridať nejaké špeciálnu značku na začiatok riadku, ktorý chcem odsadiť a potom poviem, že všetko na ľavo od značky spolu so značkou považujem len za odsadenie textu. Pridajme značku (hocijakú): val textRaw = """1 639,33 #6 540,03 #8179,36 #+2500,04"""Teraz povieme, že # je špeciálna značka pre odsadenie. val textRaw = """1 639,33 #6 540,03 #8179,36 #+2500,04""".trimMargin("#") A môžeme odsadiť pre lepšiu čitateľnosť: val textRaw = """1 639,33 #6 540,03 #8179,36 #+2500,04""".trimMargin("#")Alebo použijeme default znak oddeľovača, čo je pipe |. val textRaw = """1 639,33 |6 540,03 |8179,36 |+2500,04""".trimMargin()Teraz sa tieto dva Stringy budú rovnať. println("${text == textRaw}") //truePoužitie v reálnej aplikácii Určite by si rád videl príklad z reálnej aplikácie. Jedným z takýchto príkladov by bolo použitie pri písaní Android aplikácie. Presnejšie napríklad pri písaní príkazov pre dopyt na databázu v Room frameworku, ktorý sa používa na zjednodušený prístup k databázam. V Room píšeme takzvané Dao triedy na prístup k databáze. Vezmime si jeden príklad kde chcem napsíať SQL príkaz na vybratie filmov z databázy. @Query("SELECT id, movie_name, genres, directors year FROM MOVIES") suspend fun getAllMovies(): List<MovieShort>Príkaz by si rád napísal na viacero riadkov aby bol lepšie čitateľný. @Query("SELECT id, movie_name, genres, directors year " + "FROM MOVIES") suspend fun getAllMoviesInShortForm(): List<MovieShort>Alebo použiješ Raw String. @Query(""" SELECT id, movie_name, genres, directors year FROM MOVIES """)Určite si vieš predstaviť ako sa ti zlepší čitateľnosť, ak budeš mať zložitejšie select príkazy v kombinácii napríklad s join.
Ako na vlastný Virtuálny privátny server - časť 1.
Vzdelávanie
21.01.2021
Lubo Herkoo

Ako na vlastný Virtuálny privátny server - časť 1.

Každý týždeň jeden blog. Také som si dal predsavzatie do nového roka. Hneď prvý týždeň sa to nepodarilo, ale čo už 🤦🏻‍♂️ . V tomto texte (alebo seriáli?) budeme riešiť tvoj vlastný Virtuálny privátny server (VPS). Konkrétne: • zistíme čo to VPS vlastne je a aké sú výhody a prípadné nevýhody, • skúsime analyzovať naše potreby a vybrať vhodné parametre nášho servera, • VPS kúpime, nastavíme, zabezpečíme a pripravíme pre našu aplikáciu, • z GitHub repozitára nasadíme našu aplikáciu do produkcie pomocou GithubActions (CI), • kúpime doménu a nasadíme SSL certifikát pomocou letsencrypt. Je to veľa práce, pome na to.[Image] Načo mi je vlastný server?Hneď na začiatku si to vyjasnime: VPS je pre väčšinu projektov zbytočný. Pri dnešných možnostiach, ako svoju aplikáciu vieme nasadiť do produkcie a sprístupniť ju používateľom na pár klikov je často zbytočné riešiť komplikované nastavovanie vlastného servera. Hlavne údržba a riešenie prípadných problémov nám môže pripomenúť, ako zle sme sa rozhodli. Napriek tomu VPS má svoje miesto a niekedy sa naozaj môže hodiť, napríklad: • ak máš linux v malíčku, alebo svoj VPS už máš (si skúsený/á), • ak výkon zdieľaného hostingu viditeľne nestačí a už nevieš svoju aplikáciu ďalej optimalizovať, • ak nepostačujú dostupné technológie zdieľaného hostingu (potrebuješ doinštalovať vlastné knižnice, tooly), • ak má aplikácia extrémne nároky na výkon procesora, veľkosť pamäte, alebo potrebuješ ukladať gigabajty/terabajty dát, • ak sú dáta, s ktorými pracuješ príliž senzitívne na to, aby boli uložené na jednom mieste spolu s dátami iných používateľov zdieľaného hostingu. Asi by sme našli aj dalšie prípady, špecifiká, kedy sa hodí VPS, tieto nám však nateraz postačia. Ak teda spadáš do niektorého z kritérií, čítaj ďalej. Aký výkon servera potrebujem?Brzdi. Predtým, ako pristúpime ku kúpe servera by sme mali vedieť, aké sú naše požiadavky. Aspoň približne. Potrebujeme veľa jadier procesora? Alebo si vystačíme s jedným, prípadne dvoma jadrami? Potrebujeme veľa operačnej pamäte, alebo terabajty dát na disku? To sú ťažké otázky, ale poradím ti: • Ak aplikácia neexistuje a chceš VPS len vyskúšať, zvoľ najlacnejší server aký je v ponuke. Či máš 1 procesor, alebo 32 procesorov - terminál reaguje vždy rovnako rýchlo. • Ak je aplikácia nová a nepoznáš jej nároky, začni radšej s menej výkonným a lacnejším serverom. Napríklad CPU s jedným, alebo dvoma jadrami a 2G RAM. Väčšina providerov disponuje jednoduchým škálovacím nástrojom. Ak sa zvýšia nároky, pohneš v administračnom rozhraní nejakým sliderom a šup, máš o dve jadrá viac, prípadne dvojnásobok RAM - do pár sekúnd. • Ak si narazil na limity zdieľaného hostingu, pravdepodobne poznáš dôvod, prečo chceš vyskúšať VPS. Najlepšie ak si komunikoval s podporou svojho providera a potvrdili, že si narazil na limit ich CPU, alebo RAM. Kde kúpiť server?Takže, ak vieme aspoň približne čo chceme, urobme prieskum. Osobne mám vyskúšaných týchto predajcov VPS: • Linode, DigitalOcean, Hetzner, WebSupport Ubuntu Server a terminál bude u každého predajcu rovnaký. Riadiť sa teda môžeme podľa nasledovných kritérií: 1. cena 2. ešte raz cena 3. možnosti administračného rozhrania a prípadného navyšovania výkonu do budúcnosti 4. lokalita dátového centra (čo najbližšie k používateľom) Moja skúsenosťV poslednej dobe to u mňa osobne vyhráva Hetzner (hetzner.de). Frajeri majú vynikajúce ceny (vlastný server v čase písania tohoto textu vieš získať už za 3E/mesiac) a navyšovanie počtu CPU a RAM je riešené jednoduchým sliderom v administračnom rozhraní. Super vec 🎉. Dátové centrum môžeš zvoliť relatívne blízko - Falkenstein, Nemecko. TIP: V ľavom hornom rohu zmeníš jazyk webu z nemeckého na anglický. 😎 Vytvorenie konta HetznerAko sa už konečne teda dostaneme k vlastnému serveru? Takto: 1. Vytvor si konto na hetzner.de (klik) 2. Klikni na linku, ktorú ti Hetzner poslal na email zadaný pri registrácii 3. V sérii formulárov vyplň svoje iniciály (posledný formulár vyžaduje údaje o platbe, žiadna platba vopred však nie je potrebná) 4. Po vyplnení a odoslaní formulárov sa implicitne zobrazí formulár - nastavenia tvojich iniciál. Vpravo hore klikaj na štvorčeky a vyber z ponuky možnosť "Cloud": Ak máš po absolvovaní predchádzajúcich krokov pred sebou takúto obrazovku:[Image] Konzola cloudu Hetzner.de. je všetko v poriadku. Môj server!Už sme blízko. V zozname projektov (predchádzajúci obrázok) klikni na "Default" (tento názov vieš zmeniť cez ikonu troch bodiek v pravom hornom rohu karty produktu) a následne "Add server".[Image] Vytvorenie nového VPS. Parametre serveraTeraz zvolíme parametre servera. V tomto prípade zvolíme najlacnejší variant, ale niektoré možnosti popíšeme bližšie. Parametre servera teda nastavíme nasledovne: 1. Location (umiestnenie dátového centra): Falkenstein, pretože je najbližšie k Slovensku. 2. Image (operačný systém): Ubuntu 20.04, pretože s ním viem pracovať a tiež existuje obrovská komunita používateľov Ubuntu servera, čo uľahčí vyhľadanie návodov a riešení prípadných problémov. So serverom Ubuntu bude ďalej pokračovať aj tento tutoriál. 3. Type (typ servera): Štandardný, pretože nám nevadí, že spolu s našim VPS budú na fyzickom serveri bežať aj iné virutálne servery. Dedikovaný typ servera je vhodný len vtedy, ak potrebujeme naozaj veľký výpočtový výkon pre naše použitie. Z ďalších možností typu servera vyberme hneď prvý s označením CX11 a teda 1x VCPU, 2GB RAM, 20GB SSD v cene €2.99 za mesiac. 4. Volume (externý disk): Nevytvárame externý disk.  • TIP: Ak vytvoríme VPS s veľkosťou SSD 20GB a potrebujeme viac dát, nemusíme hneď meniť veľkosť SSD na serveri, ale môžeme pripojiť k serveru externý disk. Má to jednu veľkú výhodu a jednu menšiu. Veľkou výhodou je, že v prípade zvyšovania výkonu (napr. z 1CPU a 2GB RAM na 4CPU 8GB RAM) môžeme zvoliť možnosť, že nechceme navyšovať aj veľkosť SSD - teda SSD ostane na hodnote 20GB. Takéto rozhodnute nám v budúcnosti umožní aj krok späť a teda zníženie počtu VCPU a RAM. Takto môžeme ušetriť nemálo finančných prostriedkov, ak potrebujeme zvýšiť výkon VPS len dočasne, nie natrvalo (napr. ak je aplikácia preťažená len v období Vianoc). 5. Network (sieť): Nevytvárame sieť, pretože nevytvárame skupinu serverov, ktoré potrebujeme mať na jednej sieti (napr. ak by sme potrebovali zvlášť VPS pre webserver a databázový server). 6. Additional features (ďalšie možnosti): V prípade možnosti User data nešpekulujeme (zatiaľ). To sa nám môže hodiť vtedy, ak chceme niektoré činnosti automatizovať, napríklad automaticky pridať používateľov do systému, spustiť rôzne skripty po inštalácii a podobne. Backups sú pravidelné zálohy, čo je nutnosť na produkčnom serveri, kde beží ostrá aplikácia. Táto služba je však spoplatnená - 20% z ceny nášho servera. Ak teda vytváraš produkčný server, nafurt, tak odporúčam aj so zálohami. Ak len testuješ, tak je to na tebe 😉 . 7. SSH Key (SSH kľúč): Ak máš skúsenosti s *nix systémami, možno máš vytvorený svoj id_rsa.pub kľúč. Ak áno, tu ho môžeš použiť a tak sa autentifikovať pri pripájaní k serveru. V opačnom prípade (a to je náš prípad) ti bude zaslané heslo k root použivateľovi na tvoj email. Tu teda nešpekulujeme a zatiaľ nezaškrtneme túto možnosť.  • TIP: Povoliť vzdialený prístup pre root používateľa nie je bezpečné a používa sa len pre prvotné nastavenie servera (prvé prihlásenie do nového VPS). Jedným z prvých krokov po prihlásení sa do nového VPS by malo byť vytvorenie vlastného používateľa, ktorý sa bude prihlasovať pomocou kľúča (nie hesla) a zakázanie vzdialeného prístupu pre root používateľa. To bude aj náš postup. 8. Name (Názov): Toto je názov servera, ktorý je zobrazený v administračnom paneli hetzner, ale aj v konzole po pripojení k serveru cez SSH protokol.  • TIP: Spomeň si na nejaké názvy svetov, postáv z tvojich obľúbených počítačových hier, komixov alebo filmov 😎 . Veľa čítania kôli pár klikom. Nastavenie servera teda môže vyzerať aj takto:[Image] Nastavenie parametrov VPS. Prvé SSH spojenie Po potvrdení nastavení chvíľu počkáme na spustenie novej inštancie nášho VPS. Zároveň nám Hetzner doručí email s informáciami o IP adrese, na ktorú sa budeme pripájať a heslom pre root používateľa. Tak skontroluj email a poď sa prihlásiť na server cez SSH. Aký program použiť na prihlásenie cez SSH? Pre MacOS je to Terminal, alebo iTerm. V prípade linuxu (akéhokoľvek) je to veľmi podobné MacOS - čiže opäť Terminal. Používatelia Windows môžu použiť na SSH pripojenie program Putty, prípadne nainštalovať WSL doplnok a použiť WSL terminal. Napíš do komentára ak sa stretneš s nejakým problémom, poriešime. Z emailu som sa dozvedel, ze IP môjho servera je 78.47.244.57 a heslo k používateľovi root je ss3PgfWnHwxUhUaKEEr9 (ani neskúšaj, server v dobe čítania tohto textu už nebude existovať).[Image] Email s autorizáciou do nášho VPS. TerminalPríkaz ssh, ktorý použijeme v MacOS, Linux alebo WSL termináli má nasledovný syntax: ssh pouzivatel@ip_servera Teda v našom prípade: ssh root@78.47.244.57 Terminál si vypýta heslo, môžeme ho len skopírovať a prilepiť. Pri zadávaní hesla do terminálu sa nezobrazujú žiadne hviezdičky ani odozva. Preto len potvrdíme príkaz klávesou Enter. Ak sa na server pripájame prvýkrát, SSH sa opýta, či chceme server uložiť do zoznamu SSH serverov. Napíšeme yes a spojenie sa v prípade správneho hesla úspešne nadviaže:[Image] Prvé pripojenie k serveru cez SSH. Pri prvom prihlásení je nutné zmeniť heslo používateľa root. Zadáme staré heslo a vytvoríme nové. Hotovo. Náš nový VPS server Ubuntu 20.10 je vytvorený. Čo ďalej?V ďalšej časti blogu budeme pokračovať s nastavením nášho servera: 1. vytvoríme si na lokálnom počítači SSH kľúč 2. vytvoríme na serveri vlastného používateľa a nastavíme prihlasovanie cez SSH kľúč 3. zabezpečíme server pomocou firewallu, fail2ban a iných nástrojov 4. nainštalujeme a spustíme webový server (nginx) 5. nainštalujeme a spustíme databázový server (postgresql, ak budeš potrebovať tak aj MySQL) 6. nainštalujeme závislosti (git, nodejs, ...) V tretej časti budeme riešiť deploy našej aplikácie na VPS: 1. kúpime doménu a nasmerujeme ju na server 2. naklonujeme našu aplikáciu na server, spustíme ju pod doménou a vytvoríme k nej službu (systemd service aby sa automaticky spustila pri prípadnom reštarte servera) 3. pomocou certbot nastavíme doméne SSL certifikát a sprístupníme aplikáciu pod HTTPS 4. pomocou GithubActions nastavime continous integration tak, aby sa po push do main branche spustili automatizovane testy a v pripade bezchybnosti sa aplikacia rovno nasadi do produkcie Veľa roboty máme. Ale veľa sa aj naučíme. Štvrtá časť nie je.
Abstrakcia a zoraďovanie v kolekciách v Jave
Vzdelávanie
08.12.2020
Skillmea

Abstrakcia a zoraďovanie v kolekciách v Jave

Poďme sa porozprávať o abstraktných triedach v jave (abstract class in java). Abstrakcia slúži na schovanie zložitosti od používateľa a zobrazuje len relevantné informácie. Abstraktné triedy a metódy  V našom príklade vieme, že všetky zvieratá vydávajú zvuk. Je to niečo abstraktné – niečo, čo si vieme predstaviť a v kóde to zapíšeme nasledovne. Upravme metódu v triede Animal. public abstract void makeNoise(); Dáva to zmysel, lebo Animal nepredstavuje určité špecifické zviera a teda nevieme, aký zvuk vydá, ale vieme, že chceme aby všetko, čo bude dediť od Animal, vydávalo zvuk. Pomocou public abstract som povedal, že táto metóda nemusí mať vnútro – nemusí mať kód (implementáciu). Ak mám abstraktnú metódu, tak aj celá trieda musí byť abstract. public abstract class Animal{ public String name = "animal"; public abstract void makeNoise(); }Ak je trieda abstract, tak z nej nemôžem vyrobiť objekt. Načo by som aj robil objekt Animal, však je to len abstrakcia. Toto nebude fungovať: Animal animal = new Animal(); Ak je Animal abstract a obsahuje abstract metódu, tak som povedal, že potomk musí napísať implementáciu abstract metódy alebo bude potom tiež abstract.  Nám vyhovuje, aby Mamal bol tiež abstract. Tým pádom nemusíme vyrobiť implemntáciu. Z triedy Mamal zmažeme makeNoise a označíme ju za abstract. public abstract class Mamal extends Animal { public String name = "mamal"; }Teraz triedy, ktoré dedia od Mamal musia implementovať metódu makeNoise. Cat a Dog už danú metódu implementujú, teda nemusíme nič robiť. Ale Fox túto metódu nemá a preto ju musíme implementovať. IntelliJ IDEA nám v tomto pomôže skratkou. Stlačíme Alt + Insert a vyberieme Implement Methods. public class Fox extends Mamal { @Override public void makeNoise() { System.out.println("Ring-ding-ding-ding-dingeringeding!"); } } Zoraďovanie v kolekciáchPre zoraďovanie použijeme už existujúci algoritmus v triede Collections.sort(l). Písmeno l v tomto prípade bude List. Ak by tento List obsahoval sadu Stringov, boli by zoradené abecende, ak by obsahoval Dátum tak budú zoradene chronologicky. Ako je to možné? Je to preto, lebo tieto triedy implementujú rozhranie Comparable. Ak by si sa snažil takto zoradiť také triedy, ktoré neimplementujú toto rozhranie, tak program vyhodí výnimku.  Existuje ale možnosť, že v tvojej triede implementuješ toto rozhranie. Potom toto triedenie je teraz považované za prirodzené. Príklad: Máme Osobu, ktorá implementuje Comparable. Musíme implementovať metódu 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()); } } Čo ak chceš použiť úplne iné ako prirodzené triedenie, chceš to triediť napríklad podľa veku. Alebo chceš triediť objekty, ktoré neimplementujú Comparable rozhranie? Tak si ho vyrobíš. Na to použiješ rozhranie Comparator a potom ho požiješ Collections.sort(e, VEK_TRIEDENIE);. 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()); } };Vyskúšame 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 ďalších blogoch sa pozrieme na zopár zaujímavostí z Javy 13 a takisto sa budeme venovať aj Kotlinu. Ostaň nám verný a uč sa Javu 😊
Funkcie VLOOKUP
Vzdelávanie
16.11.2020
Skillmea

Funkcie VLOOKUP

Funkcia VLOOKUP sa používa vtedy, keď potrebujete nájsť údaje v tabuľke alebo rozsahu podľa riadka. Vyhľadajte napríklad cenu automobilovej časti podľa čísla časti alebo vyhľadajte meno zamestnanca na základe ID zamestnanca. Funkcia VLOOKUP patrí k najpraktickejším Excel funkciám. Funkcia VLOOKUP znamená: = VLOOKUP (čo chcete vyhľadať, kde ho chcete vyhľadať, číslo stĺpca v rozsahu obsahujúcom hodnotu, ktorá sa má vrátiť, vráťte približnú alebo presnú zhodu – označenú ako 1/TRUE alebo 0/FALSe). Vysvetlime si danú funkciu na jednoduchom príklade: • v databáze chceme pridať k ID klienta jeho priezvisko a mesto, z ktorého pochádza. • v jednej tabuľke (v ľavej, viď obrázok nižšie) nám chýbajú určité údaje o klientoch, konkrétne priezvisko a mesto • v druhej tabuľke (v pravej, viď obrázok) máme údaje o klientoch - jeho ID, priezvisko a mesto, z ktorého pochádza.[Image] Obidve tabuľky majú spoločný jeden identifikátor, a teda ID_klient. Na základe tejto spoločnej zhody vieme pomocou funkcie VLOOKUP vyhľadať údaje z jednej tabuľky a priradiť ich do druhej tabuľky. Riešenie: zadajme do bunky Priezvisko funkciu VLOOKUP a rozkliknime si ju. Argument funkcie Vyhľadávaná_hodnota je niečo, čo naše dve tabuľky spája, teda ID_klient. Argument funkcie Pole_tabuľky sú údaje z druhej tabuľky, z ktorej čerpáme (túto tabuľku si nezabudnite vo funkcii ukotviť pomocou klávesy F4). Ďalším argumentom fukcie VLOOKUP je Číslo_indexu_stĺpca, do ktorého napíšeme číslo stĺpca z našej druhej tabuľky - hľadáme Priezvisko, čo je druhý stĺpec, tak napíšeme číslo 2. Posledný argument funkcie je Vyhľadávanie rozsahu, ktorá môže byť približná alebo presná zhoda; TRUE (1) alebo FALSE (0). V našom prípade chceme presnú zhodu, teda použijeme 0 - FALSE. Funkcia bude zapísaná nasledovne:[Image] A tu je výsledok, podľa ID_klient sa nám zobrazia v našej prvej tabuľke priezviská zákazníkov Rovnako môžeme postupovať aj v prípade, že chceme doplniť MESTO klienta do prvej tabuľky.[Image] Krátke zhrnutie k funkcii VLOOKUP, obsahuje tieto 4 argumenty: 1. čo hľadám, 2. kde to hľadám, 3. v ktorom stĺpci je výsledok, 4. chcem hľadanú hodnotu presne alebo približne? Pokiaľ máš nejaké otázky k tejto funkcii, alebo je ti z článku niečo nejasné, napíš otázku do komentára. 
OOP v C++: trieda reprezentujúca valec a niečo viac
Vzdelávanie
05.11.2020
Skillmea

OOP v C++: trieda reprezentujúca valec a niečo viac

V úvode tohto blogu by som chcel pozdraviť všetkých nadšencov vyššieho programovacieho jazyka C++. V tomto blogu som si pre vás pripravil tému z objektovo orientovaného programovania. Z aplikačného hľadiska som si pre vás pripravil implementáciu triedy, ktorá reprezentuje valec ako 3D geometrický útvar. To znamená, že sa znova budeme baviť v intenciách analytickej geometrie. To nie je z toho dôvodu, že by som vás chcel zaťažovať vyššou matematikou, ale z toho dôvodu, že geometrické objekty sa dajú pekne reprezentovať triedami a objektami implementovanými v jazyku C++. Už v predchádzajúcom kurze som rozvinul myšlienku objektovo orientovaného programovania a okrem iného som tvrdil, že objekt v jazyku C++ odráža vlastnosti a schopnosti objektu reálneho sveta. Za takýto objekt môžeme považovať tiež valec, ktorý si nemusíte skutočne zostrojiť z nejakého materiálu, ale stačí sa naň pozerať z pohľadu analytickej geometrie.  Takže na začiatok si predstavíme trochu teórie, ktorú musíme dotiahnuť do konca práve preto, aby ste rozumeli zdrojovému kódu, ktorý som si pre vás pripravil. Potom vás ešte poverím vyriešením logickej úlohy, ktorú keď chcete úspešne splniť, musíte mať dobré poznatky zo základov analytickej geometrie. Ale o tom potom...  Je treba sa teda pripraviť a zvládnuť pojmy ako sú karteziánsky súradnicový systém, bod, vektor, priamka, rovina, ich algebrický popis, až po skalárny či vektorový súčin vektorov.  Poďme ale pekne poporiadku. Na začiatku vám položím otázku: Ako si ty predstavuješ valec v priestore? Určite by si vedel, ako vyzerá jeho tvar, poprípade by si ho vedel nakresliť. No dobre, z hľadiska geometrie môže byť, ale za tými čiarami sa skrýva aj konkrétny matematický popis. Začnime teda bodom.  Bod je základný geometrický útvar, ktorý je v 3D karteziánskom priestore reprezentovaný tromi súradnicami. Súradnice bodu môžu nadobúdať akúkoľvek hodnotu z oboru reálnych čísel. Prečo hovorím práve o bode ? Je to z toho dôvodu, aby som vám uľahčil prácu. Valec môžeme definovať práve dvoma bodmi. Konkrétne sú to body, ktoré ležia v strede dvoch podstáv valca. To znamená, že stred dolnej podstavy a stred hornej podstavy valca jasne vymedzujú výšku valca. Keď k tomu pridáme polomer podstavy, máme presnú predstavu, o ktorý valec sa jedná.  S tým uľahčením práce som to myslel naozaj vážne, asi by ste predsa nechceli, keby som vám definoval rovnicu dvoch kružníc, ktoré by reprezentovali podstavy valca, hoci aj táto reprezentácia by bola správna. K vysvetleniu reprezentácie valca, ktorá je vlastná analytickej geometrii, vám ponúkam nasledujúci obrázok:[Image] Na obrázku máte znázornený 3D karteziánsky súradnicový systém, ktorý je vlastný výpočtom v analytickej geometrie. Na okraj len podotknem, že sa jedná teda o systém, ktorý je ortogonálny a zároveň ortonormálny. V tomto súradnicovom systéme je zobrazený valec, ktorý je jednoznačne určený dvoma bodmi a polomerom podstáv valca. Spomínané dva body reprezentujú práve stredy podstáv valca.  Vráťme sa teraz na chvíľu do sveta objektovo orientovaného programovania. Už vieme, že chceme reprezentovať valec triedou. Definujme teda vlastnosti a schopnosti valca. Z kurzov viete, že vlastnosti objektu sú reprezentované dátovými členmi triedy. Ja som položil požiadavku na dátové členy triedy nasledovne:  • majme dátový člen, ktorý bude reprezentovať stred dolnej podstavy valca,  • majme dátový člen, ktorý bude reprezentovať stred hornej podstavy valca,  • majme dátový člen, ktorý bude reprezentovať polomer podstáv valca.  Uvedené tri atribúty sú dostatočné na to, aby bol valec reprezentovaný jednoznačne. Ja však kladiem ešte ďalšie požiadavky na dátové členy triedy valec. Napriek tomu, že ďalšie parametre valca sú jasne určené predchádzajúcimi tromi, chcem, aby boli explicitne dopočítané a uložené do dátových členov nasledovné údaje:  • výška valca, ktorá je jasne určená vzdialenosťou stredov podstáv,  • obsah povrchu valca, ktorý je determinovaný polomerom a výškou valca,  • objem valca, ktorý je tiež jasne určený polomerom a výškou valca.  Zatiaľ sme určili požiadavky na dátové členy. Budeme pokračovať kladením požiadaviek na druhú časť členov triedy, ktorými sú členské metódy reprezentujúce schopnosti triedy. Jednoducho povedané, požadujeme, aby mala trieda nasledujúce metódy:  • východiskový konštruktor, ktorý bude užitočný pri vytváraní novej inštancie triedy a bude inicializovať všetky dátové členy na nulové hodnoty,  • druhý používateľom definovaný konštruktor, ktorý sa tiež použije pri vytváraní novej inštancie triedy a bude inicializovať hodnoty dátových členov na argumenty odovzdávané cez parametre konštruktora. Tento konštruktor bude teda parametrický. Okrem inicializácie základných troch atribútov (stredy podstáv, polomer podstáv valca) bude dopočítavať atribúty výška, obsah a objem valca,  • deštruktor, ktorý bude dealokovať pamäť vyhradenú pre novú inštanciu tejto triedy,  • členskú metódu, ktorá bude slúžiť na prestavovanie hodnôt dátových členov, to znamená, že z valca z pôvodnými rozmermi a súradnicami vznikne iný valec, ktorý má nové súradnice a nové rozmery,  • členskú metódu, ktorá bude vracať hodnotu súradníc bodu, ktorý reprezentuje stred dolnej podstavy valca,  • členskú metódu, ktorá bude vracať hodnotu súradníc bodu, ktorý reprezentuje stred hornej podstavy valca,  • členskú metódu, ktorá bude vracať hodnotu polomeru podstáv valca,  • členskú metódu, ktorá bude vracať hodnotu obsahu povrchu valca,  • členskú metódu, ktorá bude vracať hodnotu objemu valca,  • členskú metódu, ktorá bude vracať informáciu o tom, či ľubovoľne zvolený bod definovaný tromi súradnicami patrí do priestoru (objemu valca) alebo nie.  Práve požiadavka na poslednú členskú metódu je analyticko-logická hádanka, ktorú treba vyriešiť, vyžaduje si však širšie znalosti z analytickej geometrie. Tejto úlohe sa budem teda podrobnejšie venovať a to z toho dôvodu, aby ste riešenie pochopili a nestratili sa v spleti matematických vzťahov a implementačných detailoch.  V úvode sme si teda vysvetlili, že uvediem príklad z objektovo orientovaného programovania, ktorý bude aplikovaný na oblasť analytickej geometrie a to konkrétne na geometrický objekt valec. Ďalej sme si ukázali obrázok pre jasnejšiu predstavu a pochopenie úlohy, definovali sme si požiadavky na triedu, ktorú ideme implementovať a ako posledné som zadal úlohu, ktorá rieši problém prieniku ľubovoľne zvoleného bodu a priestoru valca. Bez ďalších okolkov vám na nasledovných riadkoch ponúkam zdrojový kód, ktorý v sebe skrýva implementáciu triedy reprezentujúcu valec, triedu reprezentujúcu bod v 3D karteziánskom priestore, členskú metódu triedy valec, ktorá odpovedá na otázku, či ľubovoľný bod patrí do priestoru valca alebo nie. No a k tomu funkciu main(), v ktorej budeme novú inštanciu triedy valec používať. 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 riadku 001 je zavolaná direktíva preprocesora #include, ktorá pridáva hlavičkový súbor iostream do zdrojového kódu. Časť tejto štandardnej knižnice potrebujeme, pretože chceme používať objekt cout, pomocou ktorého budeme zapisovať informáciu do okna konzolovej aplikácie. Podobne je na riadku 002 opäť použitá direktíva preprocesora #include. Tentokrát však kvôli pridaniu hlavičkového súboru cmath. Tento hlavičkový súbor je tiež súčasťou štandardnej knižnice jazyka C++ a potrebujeme ho, pretože budeme používať funkcie pow() a sqrt(). Len pre ozrejmenie funkciu pow() budeme používať pre výpočet druhej mocniny nami zadaného argumentu a funkciu sqrt() pre výpočet druhej odmocniny zadaného argumentu.  Na riadku 003 pomocou kľúčového slova using definujeme, že budeme používať menný priestor std. Tento riadok som do kódu umiestnil preto, aby sme nemuseli ku objektom, triedam a funkciám, ktoré do tohto priestoru patria, pristupovať cez std a operátor prístupu :: . Okrem toho, že funkcie pow(), sqrt(), objekt cout a manipulátor endl prislúchajú nejakým hlavičkovým súborom, patria aj do menného priestoru std.  Na riadku 005 je definovaná konštanta s identifikátorom pi. Tá reprezentuje Ludolfovo číslo a má hodnotu 3,14159. Túto konštantu potrebujeme k výpočtu obsahu povrchu a objemu valca. Pokračujeme riadkom 007, na ktorom pomocou kľúčového slova class deklarujeme triedu s identifikátorom cPoint3D. Táto trieda nám bude v programe reprezentovať bod v 3D karteziánskom súradnicovom systéme. Deklaráciu spomínanej triedy začíname na riadku 008 ľavou programovou zátvorkou, za ktorou na riadku 009 nasleduje kľúčové slovo public, ktorým definujeme, že nasledovným členom bude pridelený verejný prístup.  Na riadku 010 až 012 sú teda deklarované tri členské metódy triedy cPoint3D, pričom sú to špeciálne členské funkcie a to konkrétne dva konštruktory a deštruktor.  Na riadku 010 je deklarovaný východiskový konštruktor, ktorému neprislúchajú žiadne parametre. Tento konštruktor slúži na vytvorenie novej inštancie triedy cPoint3D s tým, že inicializuje dátové členy na nulové (východiskové) hodnoty.  Na riadku 011 je deklarovaný používateľom definovaný konštruktor, ktorý slúži tiež na vytvorenie novej inštancie triedy, pričom pomocou svojich parametrov, cez ktoré sa odovzdávajú konkrétne argumenty (súradnice bodu), inicializuje dátové členy triedy. Rozdiel medzi prvým a druhým konštruktorom je ten, že prvý nepotrebuje parametre, pretože inicializuje dátove členy na 0, ktoré je možné potom prestaviť inou členskou metódou na konkrétne hodnoty, zatiaľ čo druhý konštruktor priraďuje dátovým členom nenulové hodnoty prostredníctvom argumentov odovzdávaných cez parametre konštruktora. K úplnosti textu uvádzam, že druhý konštruktor má tri parametre x, y, a z práve preto, že bod v 3D priestore má tri súradnice a k tomu prislúchajú tiež tri členské premenné triedy cPoint3D. Sú to premenné s tým istým identifikátorom ako parametre konštruktora, čiže x, y, z. Existujú informačné zdroje, ktoré spochybňujú a neodporúčajú totožnosť identifikátorov parametrov konštruktorov a členských premenných triedy. Ja však toto názvoslovie považujem za bežné a správne z toho dôvodu, že existuje kľúčové slovo this, ktoré reprezentuje vo vnútri objektu ukazovateľ na objekt a možno prostredníctvom neho pristupovať k dátovým členom. Týmto zápisom (syntaxou) sa dá odlíšiť identifikácia parametra a členskej premennej objektu. Je predsa jasný rozdiel medzi x a this->x. Prvé je parameter konštruktora a druhé dátový člen, ku ktorému pristupujeme pomocou ukazovateľa.  Na riadku 012 je deklarovaný deštruktor, ktorý nám bude slúžiť na dealokáciu pamäte  vyhradenej pre novú inštanciu triedy cPoint3D po jej vytvorení. Deštruktory sú špeciálne členské funkcie tried, ktoré slúžia práve na spomenutý účel, jednoducho povedané, majú za úlohu upratať po objekte v pamäti.  Na riadkoch 013 až 015 sú deklarované tri dátové členy x, y a z, ktorým je pridelený typ double. Tieto reprezentujú súradnice bodu v 3D karteziánskom súradnicovom systéme. Na riadku 016 sa uzatvára deklarácia triedy cPoint3D pravou programovou zátvorkou a bodkočiarkou. Len pripomeniem, že bodkočiarka tam musí byť uvedená, je to jeden z ojedinelých prípadov v jazyku C++, kedy sa používa bodkočiarka za programovou zátvorkou.  Na riadku 018 začína definícia východiskového konštruktora triedy cPoint3D. Jedná sa o bezparametrický konštruktor, ktorý inicializuje dátové členy na riadkoch 020 až 022 na nulu. Po tomto priradení sa konštruktor ukončuje pravou programovou zátvorkou na riadku 023.  Na riadku 025 začína definícia druhého používateľom definovaného konštruktora tej istej triedy, ktorý na rozdiel od prvého má tri parametre, prostredníctvom ktorého sa odovzdávajú argumenty reprezentujúce súradnice bodu v 3D karteziánskom súradnicovom systéme. Tieto sa na riadku 027 až 029 priraďujú jednotlivým dátovým členom. Konštruktor sa na riadku 030 končí pravou programovou zátvorkou.  Na riadku 032 až 035 je uvedená definícia deštruktora triedy cPoint3D. Jeho telo je prázdne a neobsahuje žiadny kód tak, ako to býva u väčšiny deštruktorov. Pre zopakovanie úlohou deštruktora je dealokovať (uvoľniť) pamäť, ktorá bola konkrétnej inštancii triedy vyhradená.  V zdrojovom kóde sa na riadku 037 ďalej pokračuje deklaráciou triedy cCylinder, ktorá nám bude reprezentovať práve geometrický objekt valec. Na riadku 038 je uvedená ľavá programová zátvorka, ktorá otvára spomínanú deklaráciu. Za ňou je uvedené kľúčové slovo public, ktoré slúži na pridelenie verejného prístupu k dátovým členom a členským metódam, ktoré sú ďalej deklarované. Zatiaľ čo trieda cPoint3D mala len verejné dátové členy a členské metódy, trieda cCylinder obsahuje aj členy súkromné. To znamená, že pri tejto triede budeme využívať techniku skrývania niektorých dátových členov. Obor platnosti verejného prístupu platí v zdrojovom kóde po kľúčové slovo private, čiže po kľúčové slovo, ktoré nastavuje iný typ prístupu k členom triedy. Pre úplnosť informácie dodám, že členom triedy môže byť pridelený ešte tretí typ prístupu protected, čo v preklade znamená chránený prístup. Tento typ prístupu však v tejto úlohe využívať nebudeme.  Vráťme sa ale naspäť ku zdrojovému kódu. Na riadkoch 040 až 050 sú deklarované všetky členské metódy, ktorým je pridelený verejný prístup. Tieto si postupne rozoberieme.  Na riadku 040 je uvedená deklarácia východiskového konštruktora, ktorý má za úlohu inicializovať všetky dátové členy triedy na nulové hodnoty. Ako poznámku uvediem, že nevidím veľmi zmysel týchto konštruktorov, ale v praxi sa volí práve spomínaný postup. To znamená, že sa vytvoria dva konštruktory, jeden bez parametrov, ktorého funkcionalita bola spomenutá vyššie a druhý konštruktor s parametrami, cez ktoré môžete dátovým členom priradiť už konkrétne nenulové hodnoty. Ku východiskovému konštruktoru je potrebné potom doprogramovať implementáciu metódy (tzv. setter), ktorá má rovnakú funkciu ako konštruktor s parametrami. Rozdiel oproti použitiu parametrického konštruktora je ten, že inicializujete dátové členy triedy v dvoch krokoch. V prvom kroku definujete objekt s inicializáciou dátových členov východiskovými nulovými hodnotami a v druhom kroku sa potom tieto členy inicializujú na používateľom zadanú hodnotu. Pre úplnosť doplním, že zmysel používania východiskových konštruktorov vidím pri pointrovej aritmetike, to znamená v prípadoch, kedy sú dátové členy deklarované ako smerníky základných vstavaných typov alebo typov, ktoré sú definované používateľom. Vtedy slúži východiskový konštruktor okrem vytvorenia objektu na alokáciu pamäti (konkrétne haldy) pre daný typ pomocou operátora new.  Na riadku 041 je deklarovaný druhý konštruktor, ktorý má tri parametre. Prvý a druhý parameter sú typu cPoint3D, tie reprezentujú súradnice stredov podstáv valca. Tretí parameter reprezentuje polomer podstáv valca. To sú tri parametre, pomocou ktorých je možné jednoznačne definovať valec.  Na riadku 042 je deklarovaný deštruktor triedy cCylinder. Takisto ako u predošlej triedy má za úlohu dealokovať pamäť, ktorá je vyhradená pre novú inštanciu tejto triedy.  Pokračujeme deklaráciou členskej metódy SetCylinder() na riadku 043. Jedná sa o tzv. setter, čiže metódu, ktorá má za úlohu nastaviť hodnoty členských dát triedy.  Na riadku 044 a 045 sú deklarované členské metódy GetV1() a GetV2(). Tieto metódy nemajú žiadne parametre a vracajú typ cPoint3D. Úlohou prvej z nich je vracať informáciu o súradniciach stredu dolnej podstavy valca, druhá z nich vracia informáciu o súradniciach stredu hornej podstavy valca.  Na riadkoch 046 až 049 sú deklarované členské metódy GetRadius(), GetHeight(), GetContent() a GetVolume(). Sú to getter-y, ktoré majú návratový typ double. V takom poradí ako boli vymenované, slúžia na to, aby vracali hodnotu členských dát, ktoré reprezentujú polomer, výšku, obsah a objem valca.  Na riadku 050 je deklarovaná členská metóda BelongToCylinder(). Ako návratový typ vracia bool. Táto metóda slúži na zistenie toho, či ľubovoľne zvolený bod v 3D karteziánskom súradnicovom priestore patrí do priestoru (objemu) valca alebo nie. Podotýkam, že vyriešenie tejto logickej úlohy je najnáročnejšie, pretože musíte poznať hlbšie súvislosti z analytickej geometrie. Ostatná implementácia triedy cCylinder je pomerne jednoduchá záležitosť oproti spomínanej úlohe.  Na riadku 052 je uvedené kľúčové slovo jazyka C++ private, ktoré zabezpečí, že ďalej deklarované dátové členy budú mať súkromný prístup. Na riadkoch 053 a 054 sú potom deklarované dátové členy V1 a V2, ktoré reprezentujú stred dolnej a hornej podstavy valca. Práve preto im bol pridelený údajový typ cPoint3D. Ďalej sú na riadkoch 055 až 058 deklarované dátové členy radius, height, content a volume. Je im pridelený dátový typ double a v tom istom poradí reprezentujú polomer, výšku, obsah a objem valca.  Na riadku 059 je uvedená pravá programová zátvorka a s bodkočiarkou, ktoré uzatvárajú deklaráciu používateľom definovaného typu (triedy) cCylinder. Implementačné detaily (definícia) tejto triedy pokračuje na ďalších riadkoch zdrojového kódu.  Na riadkoch 061 až 069 je uvedená definícia východiskového konštruktora cCylinder. Konštruktor nemá žiadne parametre, jeho úlohou je vytvárať novú inštanciu triedy cCylinder a inicializovať všetky dátové členy tejto triedy na nulové hodnoty. Na riadkoch 071 až 079 je uvedená definícia druhého používateľom definovaného konštruktora, ktorá má tri parametre. Prvé dva sú typu cPoint3D, pomocou nich sa odovzdávajú súradnice stredov dolnej a hornej podstavy valca. Cez tretí parameter, ktorý je typu double, sa odovzdáva hodnota polomeru valca. Dátovým členom V1, V2 a radius sú priamo priradené hodnoty prislúchajúcich parametrov konštruktora. Hodnota dátového člena height, ktorá reprezentuje výšku valca, je vypočítaná zo súradníc bodov podstáv. Výška valca sa totiž rovná vzdialenosti týchto bodov, ktorá je geometricky daná ako druhá odmocnina súčtu mocnín rozdielu jednotlivých súradníc dvoch bodov. Vzťah pre výpočet vzdialenosti dvoch bodov je nasledovný:[Image] Hodnota dátového člena content, ktorý reprezentuje obsah povrchu valca, je determinovaný výškou valca a polomerom podstavy valca. Vzťah pre výpočet obsahu povrchu valca je nasledovný:[Image] Podľa uvedeného vzťahu sa vypočíta obsah povrchu valca, ktorého hodnota je priradená do členskej premennej content na riadku 077. Na riadku 078 je vypočítaná hodnota objemu valca a priradená do členskej premennej volume. Objem valca je determinovaný tiež polomerom a výškou valca podobne, ako tomu bolo pri výpočte obsahu povrchu valca. Vzťah pre výpočet objemu valca je nasledovný:[Image] Na riadku 079 je uvedená pravá programová zátvorka, ktorá uzatvára definíciu používateľom definovaného konštruktora triedy cCylinder. Na riadku 081 až 084 je uvedená definícia deštruktora triedy cCylinder. Telo deštruktora je prázdne, jeho úlohou je dealokovať pamäť, ktorá bola vyhradená pre novú inštanciu triedy cCylinder.  Na riadku 086 až 094 je uvedená definícia členskej metódy SetCylinder, ktorá má návratový typ void, čiže vracia absenciu informácie. Táto metóda je tzv. setter, ktorý má za úlohu nastaviť (prestaviť) hodnoty dátových členov triedy cCylinder. Jeho funkcionalita je rovnaká ako u používateľom definovaného konštruktora s tým rozdielom, že táto metóda nie je volaná pri vytváraní novej inštancie. Môže byť však aplikovaná na inštanciu, ktorá už bola vytvorená. Pri jej volaní sa zmenia parametre valca, čiže možno ňou definovať iný valec v 3D karteziánskom priestore.  Na riadku 096 až 099 je definovaná členská metóda GetV1(). Má návratový typ cPoint3D, pričom je to getter, ktorý má za úlohu vrátiť súradnice stredu dolnej podstavy valca, ktorý je objektom triedy cCylinder reprezentovaný.  Na riadku 101 až 104 je definovaná členská metóda GetV2(). Má tiež návratový typ cPoint3D, a podobne ako predošlá metóda má za úlohu vrátiť súradnice stredu podstavy valca, v tomto prípade sa však jedná o hornú podstavu.  Na riadku 106 až 109 je definovaná členská metóda GetRadius(). Vracia návratový údajový typ double, ktorý reprezentuje polomer podstavy valca.  Na riadku 111 až 114 je definovaná členská metóda GetHeight(). Jej úlohou je vrátiť hodnotu dátového člena height, ktorý reprezentuje výšku valca.  Na riadku 116 až 119 je definovaná členská metóda GetContent(). Táto metóda má za úlohu vrátiť hodnotu dátového člena content, ktorý reprezentuje vypočítaný obsah povrchu valca.  Na riadku 121 až 124 je definovaná členská metóda GetVolume(). Táto metóda má za úlohu vrátiť hodnotu dátového člena volume, ktorý reprezentuje vypočítaný objem valca.  Na riadkoch 126 až 157 je definovaná členská metóda BelongToCylinder(). Úlohou tejto metódy je rozhodnúť o tom, či bod zadaný cez parameter patrí do priestoru (objemu) valca alebo nie. Návratový typ tejto metódy je bool, ktorý reprezentuje práve pravdivostnú hodnotu spomínaného rozhodnutia. Ak bod so súradnicami zadanými cez parameter metódy patrí do priestoru valca, metóda vracia hodnotu true, ak nie, vracia hadnotu false. Na prvý pohľad sa zadaná úloha zdá jednoduchá, nie je tomu však tak. Práve preto uvediem nasledovné predpoklady, ktoré budeme potom analytickým postupom (výpočtom dokazovať):  • ak bod patrí do priestoru valca, musí byť kolmá vzdialenosť tohto bodu od osi valca menšia nanajvýš rovná polomeru podstavy valca,  • ak bod patrí do  priestoru valca, musí byť kolmá vzdialenosť tohto bodu od jeho dolnej podstavy menšia nanajvýš rovná výške valca,  • ak bod patrí do  priestoru valca, musí byť kolmá vzdialenosť tohto bodu od jeho hornej podstavy menšia nanajvýš rovná výške valca.  K uvedeným predpokladom ešte dodám, že nestačí splnenie jedného alebo dvoch z nich. Ak chceme potvrdiť výrok, že konkrétny bod patrí do priestoru valca, musia byť splnené všetky tri uvedené podmienky. Úspešné vyriešenie úlohy, má nasledovný postup: 1. Vypočítame súradnice smerového vektora priamky, ktorá prechádza stredmi obidvoch podstáv valca. Tejto priamke hovoríme os valca, ktorá je jasne definovaná spomínanými dvoma bodmi (stred dolnej a hornej postavy valca). Súradnice vypočítame odčítaním dvoch bodov, čo znamená, že spravíme rozdiel príslušných súradníc bodov podľa nasledovných vzťahov:[Image] 2. Ďalej zostrojíme rovinu, ktorá je kolmá na os valca a zároveň prechádza bodom, o ktorom rozhodujeme, či patrí do priestoru valca alebo nie. Keďže smerový vektor osi valca je totožný s normálovým vektorom spomínanej roviny, vieme vyjadriť koeficienty a, b, c, ktoré sú súčasťou všeobecného tvaru rovnice roviny. Z uvedeného vyplýva, že potrebujeme dopočítať už len koeficient d všeobecného tvaru rovnice roviny. Všeobecný tvar rovnice priamky je teda nasledovný:[Image] Keď z uvedenej rovnice vyjadríme koeficient d, dostaneme nasledovný matematický vzťah: [Image] Po vypočítaní koeficientu d, pokračujeme nasledovným krokom, v ktorom počítame súradnice bodu, ktorý vznikne prienikom osi valca a rovinou, ktorá je na ňu kolmá a prechádza bodom, o ktorom rozhodujeme, či patrí do priestoru valca alebo nie. 3. Majme teda os valca (priamku), ktorá je daná nasledovným parametrickým vyjadrením[Image] Po rozvinutí pre jednotlivé súradnice, vzniknú nasledovné rovnice:[Image] Keďže počítame prienik priamky a roviny, dosaďme rovnice 3.2, 3.3 a 3.4 do rovnice 2.1, vznikne nám nasledovný matematický vzťah.[Image] Keďže koeficienty a, b, c sú súradnice smerového vektora osi valca, môžeme napísať:[Image] Po úprave rovnice 3.6 a vyjadrení parametra t, dostaneme nasledovný vzťah:[Image] 4. Po vypočítaní koeficientu t, môžeme vypočítať súradnice bodu, ktorý vznikne prienikom osi valca a spomínanej roviny podľa nasledovných vzťahov[Image] 5. Označme bod, o ktorom rozhodujeme, či patrí do priestoru valca identifikátorom A, ďalej označme bod, ktorý vznikne prienikom osi valca a spomínanej roviny ako bod B, vzdialenosť týchto dvoch bodov potom vypočítame podľa nasledovného vzťahu[Image] Ako už bolo povedané, ak je táto vzdialenosť menšia nanajvýš rovná polomeru podstavy valca, máme splnenú prvý predpoklad, že zadaný bod patrí do priestoru valca. 6. V tomto kroku budeme pokračovať analytickým spôsobom, ktorým budeme dokazovať, že bod spĺňa druhý predpoklad, to znamená, že vzdialenosť bodu od dolnej podstavy valca je menšia ako výška valca. Budeme vychádzať zo vzťahu 2.2 a vypočítame koeficient d pre rovinu, ktorá je kolmá na os valca, prechádza však stredom dolnej podstavy valca. Táto rovina má rovnaký normálový vektor ako rovina, ktorá prechádzala tým bodom, o ktorom rozhodujeme, či patrí do priestoru valca alebo nie. Koeficienty a, b, c, ktoré vystupujú vo všeobecnom tvare rovnice roviny, prislúchajú teda hodnotám súradníc smerové vektora osi valca. Z uvedené vyplýva, že keď poznáme súradnice normálového vektora roviny a poznáme bod, ktorý v nej leží (stred dolnej podstavy valca), vieme vyčísliť hodnotu koeficienta d. 7. Po predchádzajúcom kroku nám už stačí dopočítať vzdialenosť bodu od podstavy priamym vzťahom, ktorý je nasledovný:[Image] Ak je táto vzdialenosť menšia nanajvýš rovná výške valca, máme splnený druhý predpoklad, aby sme mohli tvrdiť, že bod patrí do priestoru valca. 8. Pokračujeme výpočtom vzdialenosti bodu od hornej podstavy valca. Zostrojíme teda rovinu, ktorá je kolmá na os valca a prechádza stredom hornej podstavy valca. K tomuto prídeme rovnakým spôsobom ako v kroku 6. Obdobne podľa vzťahu 7.1 vypočítame predmetnú vzdialenosť. Ak je táto menšia nanajvýš rovná výške valca, máme splnený posledný predpoklad, pre tvrdenie výroku, že zadaný bod patrí do priestoru valca. Práve tento postup je zachovaný pri implementácii riadkov zdrojového kódu 128 až 156. Na označenie jednotlivých parametrov, ktoré boli súčasťou priebežného výpočtu sa len použili v niektorých prípadoch iné identifikátory.  Na riadku 128 je deklarovaná premenná typu bool s identifikátorom flag. Do nej sa uloží informácia, ktorá bude reprezentovať pravdivostnú hodnotu výroku o tom, či bod do priestoru valca patrí alebo nie. Na začiatku ju inicializujeme hodnotou true.  Na riadku 130 je deklarovaná premenná u1, ktorá reprezentuje x zložku smerového vektora osi valca, vypočítaná je ako rozdiel x súradníc bodu V2 a V1.  Na riadku 131 je deklarovaná premenná u2, ktorá reprezentuje y zložku smerového vektora osi valca, vypočítaná je ako rozdiel y súradníc bodu V2 a V1.  Na riadku 132 je deklarovaná premenná u3, ktorá reprezentuje z zložku smerového vektora osi valca, vypočítaná je ako rozdiel z súradníc bodu V2 a V1. Pre doplnenie informácie, identifikátory V1 a V2 patria dátovým členom triedy cCylinder, ktoré reprezentujú súradnice stredov podstáv valca.  Na riadku 134 je vypočítaná hodnota premennej d1, ktorá reprezentuje koeficient d vo všeobecnom tvare roviny, ktorá je kolmá na os valca a prechádza bodom X (bod, o ktorom rozhodujeme). Tento koeficient je potrebný k tomu, aby bola kompletná rovnica roviny v priestore. Potom je možné vypočítať parameter t podľa vzťahu 3.7. Práve tento vzťah modeluje priraďovací príkaz na riadku 135.  Po výpočte parametra t môžeme definovať bod XT (bod, ktorý je kolmým priemetom bodu X na os valca), ktorý je typu cPoint3D. Ten je definovaný na riadku 137 tak, že sa zavolá konštruktor triedy cPoint3D, ktorému sa odovzdajú hodnoty argumentov. Tieto hodnoty sa vypočítavajú podľa vzťahov pre výpočet súradníc bodu ležiaceho na priamke, ktorá je daná svojim parametrickým vyjadrením (vzťahy 4.1 až 4.3).  Na riadku 139 je deklarovaná premenná dist_01, ktorej sa priraďuje výpočet vzdialenosti bodu X od osi valca. Tá sa vypočíta ako geometrická vzdialenosť dvoch bodov v 3D karteziánskom priestore, a to konkrétne bodu X a XT podľa vzťahu 5.1.  Na riadku 141 a 142 sú vypočítané hodnoty premenných d2 a d3, ktoré reprezentujú koeficient d rovín, ktoré prechádzajú stredmi podstáv valca a sú kolmé na os x. Z týchto koeficientov, smerového vektora a súradníc bodov X sa vypočítavajú vzdialenosti bodu od hornej a dolnej postavy valca. Tieto vzdialenosti sa v zdrojovom kóde počítajú na riadkoch 144 a 145.  Na riadku 147 je uvedený príkaz if, v ktorom je vyhodnotená pravdivosť výrazu, ktorý je tvorený tromi jednoduchými výrokmi. Prvý z nich tvrdí, že vzdialenosť bodu od osi valca je menšia alebo rovná polomeru valca. Druhý z nich tvrdí, že vzdialenosť bodu od dolnej podstavy valca je menšia alebo rovná výške valca. A posledný z výrokov obdobne tvrdí, že vzdialenosť bodu od hornej podstavy valca je menšia alebo rovná ako výška valca. Výroky sú pospájané logickým operátorom and, čo znamená, že ak sú súčasne všetky pravdivé, zložený výrok je tiež pravdivý a riadenie programu prejde na riadok 149, kde sa hodnote flag priradí pravdivostná hodnota true. Ak je čo len jeden z troch výrokov nepravdivý, zložený výrok je nepravdivý tiež, čo znamená, že bod nepatrí do priestoru valca a riadenie programu prejde na riadok 153 do klauzuly else, kde sa priradí hodnote flag pravdivostná hodnota false. Na riadku 156 sa vracia hodnota premennej flag pomocou kľúčového slova return.  Na riadku 159 sa začína definícia funkcie main(), ktorú volá operačný systém. V tele tejto funkcie sú na riadku 161 a 162 vytvorené nové inštancie triedy cPoint3D, ktoré reprezentujú stredy podstáv valca. Na riadku 163 je vytvorená nová inštancia triedy cCylinder, kde sa pomocou parametrov konštruktora odovzdávajú argumenty reprezentujúce stredy podstáv a polomer valca. Na riadkoch 165  až 173 sú do okna konzolovej aplikácie zapísané informácie o tom, či body, ktorých súradnice zadané ako argumenty členskej metódy BelongToCylinder(), patria do priestoru valca alebo nie. Celkovo sme volali túto členskú v zdrojovom kóde 8-krát. To znamená, že sme preverovali osem bodov. Len pre informáciu prvých päť patrilo do priestoru valca a ďalšie tri nie. Pre správnosť programu si výsledky môžete overiť analytickým postupom, ktorý je v predchádzajúcom texte uvedený.  Na riadku 175 sa len prechádza v okne konzolovej aplikácie na ďalší riadok. Na riadkoch 177 až 179 sú už len zavolané deštruktory definovaných objektov z dôvodu dealokácie pamäte. Na riadku 181 je vrátená hodnota 0 operačnému systému. Na riadku 182 sa ukončuje telo funkcie main() pravou programovou zátvorkou. V závere vám chcem poďakovať za prečítanie blogu. Dúfam, že vás článok, ktorý sa týkal objektovo orientovaného programovania a príkladu z analytickej geometrie zaujal. Podstatnou pridanou hodnotou zdrojového kódu bola členská funkcia, ktorá rozhodla o tom, či bod zadaný ako argument tejto funkcie patrí do priestoru valca alebo nie. Bola to skutočne náročnejšia úloha a preto som rád, že ste riešenie pochopili a spolu so mnou túto úlohu rozlúskli. Autorom tohto článku je Marek Šurka.
Digitálny svet v G-Suite
Vzdelávanie
13.10.2020
Skillmea

Digitálny svet v G-Suite

Žijeme v dobe, keď sú technológie už povinnou súčasťou našich životov. Postupne ako sme do tohto sveta vstupovali, tak sme si neboli ani vedomí, do akých rozmerov to narastie a stane sa to našou súčasťou. Pre naše pohodlie sme skúšali rôzne technológie, ktoré nám uľahčujú život a pomáhajú riešiť problémy. Dostali sme sa do stavu, že využívame radu programov, ktoré sú online alebo offline a odoberáme rozne novinky či newslettre od rôznych firiem. Zrazu sme sa ocitli v stave, keď nás začali tieto technológie a informácie zahlcovať a vyžaduje si to z našej strany viac času na ich organizáciu. Nie je dôležité, ako to bolo, ale je dôležité čo bude a ako s tým naložíme dnes. Z tohoto dôvodu vám chcem predstaviť G-Suite, mix najlepších aplikácií od Google, ktorý vytvoril rokmi tvrdej práce s ľuďmi. Predstavenie G SuiteG Suite nám ponúka radu nástrojov pod jednou strechou, pod jedným prístupom, všetko krásne pokope. Uľahčuje organizáciu dát, súborov, mailov a ostatných vecí. Kto G Suite nepozná, tu je krátke predstavenie:  G Suite je predplatné cloudových služieb a kancelárskych aplikácií. K tomuto musím spomenúť samozrejme samotný Gmail, ktorý ponúka základné služby G Suite.  G-suite je vhodný ako pre jednotlivcov, tak pre malé, stredné a veľké firmy.  Gmail a G Suite obsahuje:  • Gmail - Mailový server, mailová pošta • Hangouts / Meet - Videokonferencia • Kalendár • Google Disk • Google Dokumenty • Google Tabuľky • Google Formuláre • Google Prezentácie Toto všetko je v základnom balíčku pre Gmail a G Suite. Hlavný rozdiel je v tom, že v G Suite môžete mať vlastnú doménu emailu, v Gmaily máte príponu @gmail.com[Image] Prednosti G Suite sa objavujú pri nasadení vo firemnom prostredí. Obsahuje:  • Archivácia emailov a konverzácií • Google Sejf - Vault • Google Cloud Search • Správa prostedia • Správa mobilných zariadení Jednoducho všetko, čo je potrebné vo firemnom prostredí, v ktorom pracuje viac ľudí a je dôležité mať spoločné kalendáre, nastavenie prístupov do pracovných zložiek, zdieľanie jednotlivých dokumentov, plánovanie, kontrola. Najväčšie výhody G SuiteSpolupracovanie v reálnom čase V dokumentoch či tabuľkách môže pracovať naraz viac ľudí a to zároveň upravovať dokument, písať k nemu komentáre, opravovať ho, editovať.  Ukladať a zdieľať súbory Ukladáte súbory na Google Disk, ktorý je zálohovaný a zabezpečený a zdieľate súbory iba s tým, ským potrebujete, všetko máte presne pod kontrolou.  Zabezpečenie dát Obsahuje bezpečnostné opatrenia, dvojfázové overenie, jednotné prihlásenie. Pri strate zariadenia neprídete o dáta. Archivácie emailov. a veľa dalšieho. Implementácia G SuiteG Suite je ideálne riešnie pre každého, kto má rád jednoduchosť a potrebuje pracovať v digitálnom svete. Vytvárať dokumenty, byť prepojený s kolegami a zdieľať súbory a to všetko je možné z akéhokoľvek miesta na svete, kde máte pripojenie na internet. Ak by ste si chceli takéto riešenie vybudovať sami, stálo by Vás to omnoho viac peňazí ako platíte mesačne Google produktom G Suite. G Suite posúva svoje hranice ďalej a vždy sa snaží dodať to, čo je potrebné. Vzniká veľa ďalších nástrojov ako napriklad:  • Apps Script, čo je vytváranie vlastných príkazov, ktoré sa majú spracúvať či na úrovni makra v tabuľkách alebo iných častí, • Weby, • Google Cloud Platform, ktorý sa postará o chod aplikácií napojených na mobilné zariadenia alebo webové stránky, • Google AI, ktorý pomáha automatizácii, technológia budúcnosti, • a veľa ďalšieho. Pozrite si naše videotutoriály a naučte sa základy práce s G Suite, ak máte otázky napíšte nám. Ak uvažujete o implemetácii G Suite, oslovte nás a sme schopní vám pomôcť od začiatku po úplnú implemetáciu G Suite do vášho prostredia. Vyškolíme vás, ako s G Suite najlepšie pracovať.
Java Files, Path, čítanie zo súboru
Vzdelávanie
17.09.2020
Skillmea

Java Files, Path, čítanie zo súboru

File I/O (Featuring NIO.2)Vo verzii 7 prišiel nový balík java.nio, v ktorom je nanovo urobené to, čo bolo v java.io. Chceš vedieť, ako čítať súbory (java read file)? Tak musíš vedieť, čo je to Path a Files. Môžeš používať obidva balíky. Musíš si ale dávať pozor na to, že ak pracuješ na projekte, kde sa používa java 6 a prípadne nižšie, tak ti nepôjdu tieto nové veci. Ale uvažujme, že na takýchto starých projektoch nepracujeme a budeme si vysvetľovať veci s použitím tohto nového balíka.  Budeme si hovoriť o základných triedach Path a Files, budeme manipulovať so súbormi a priečinkami a tak podobne. Tu je zaujímavý link porovnania funkcionality spomenutých balíkov a aké chyby mala java.io: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping PathJednoducho povedané je to linka na súbor alebo na priečinok v danom operačnom systéme. Súbory sú hierarchicky uložené. Vo windowse je na vrchu označenie disku napríklad C:\home\skuska. V linuxových systémoch je root začínajúci lomítkom / napríklad /home/skuska. Tu môžeme vidieť, že vo windowse a v linuxe sa používajú úplne iné oddeľovače. Na to treba pamätať. Relatívna a absolútna cestaAbsolútnu cestu môžeme chápať ako úplnú celkovú adresu alebo cestu na súbor alebo priečinok.  C:\home\skuska je absolútna cesta, ktorá vždy obsahuje root, teda v tomto prípade označenie disku C:. Ak by som ale napísal len home\skuska\text.txt – tak vidím, že sa snažím pristúpiť na súbor text.txt, ktorý je umiestnení v priečinku home a skuska. Ale kde sa nachádza priecinok home? Bez ďalších informácii to neviem a to je relatívna cesta.  Trieda PathZákladná trieda v tomto balíku – používa sa aby uchovávala informácie o názve súboru, priečinkoch ktoré sú použité na skonštruovanie cesty aby bolo možné lokalizovať dané dokumenty alebo priečinky. Path na windowse je bude odlišná od Path na unixe.  Ak hovoríme o triede Path, tak môžeme v jednoduchosti povedať, že môžeme manipulovať s cestou, ktorá vedie k priečinkom alebo súborom.  Trieda FilesTáto trieda slúži na manipuláciu s priečinkami a súbormi. Používa triedu Path.  Keď pristupujeme k súborom alebo celkovo ku zdrojom na disku – tak sú „otvorené“. Potom s nimi pracujeme a keď už s nimi nepracujeme tak musíme zavolať „uzatvorenie“ práce s týmito zdrojmi aby ich mohol používať niekto iný.  Na automatické uzatvorenie môžeme použiť try-with-resources.  Práca so súbormiMáš Path inštanciu, ktorá reprezentuje súbor alebo priečinok. Teraz ale ešte stále nevieš, či reálne tento súbor alebo priečinok existuje, či sa dá z neho čítať, či sa dá do neho zapisovať a podobne. Existuje subor alebo neexistuje, môžem k nemu pristúpiť? 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) Sú to rovnaké súbory? isSameFile(Path, Path)  mazanie súboru Files.delete(path);  Vyhodí to výnimku prečo sa to nepodarilo ak sa to nepodarilo. Metoda deleteIfExists(Path) tiež zmaže súbor ale ak súbor neexistuje tak sa nevyhodí výnimka.     kopírovanie súboru Files.copy(source, target, REPLACE_EXISTING);Do metody sa dajú dať varargs options. StandardCopyOption a LinkOption enums sú podporované. Všimni si, že ak dáš ctrl a click na copy metodu, tak je tam CopyOption... options. Potom klikni ctrl na copy option a zistíš že je to len interface ale v popise máš napísane, že vieš použiť StandartCopyOption čo implementuje CopyOption.[Image] Tu si môžeš pozrieť implementácie CopyOption rozhrania.  Ak kopíruješ súbor na miesto kde sa takýto súbor už nachádza, tak sa súbor neprepíše ak nezadáš option REPLACE_EXISTING.  Priečinky sa dajú tiež kopírovať ale skopírujú sa prázdne  aj keď v nich bol nejaký súbor.  Čítanie sú súboru (read from file)Konečne sme prišli na kus kódu, vďaka ktorému môžeš čítať zo súboru (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é operácie v Exceli
Vzdelávanie
28.07.2020
Skillmea

Matematické operácie v Exceli

Funkcie a vzorce sú možno najvyužívanejšou časťou Excelu a v tomto blogovom príspevku sa pozrieme na najdôležitejšie matematické operácie. Pomocou matematických operácií vieme vypočítať napríklad priemer, maximálne či minimálne hodnoty, súčty. Funkcia SUM (Súčet)Je to pravdepodobne najpoužívanejšia matematická funkcia, ktorá jednoducho spočíta hodnoty vo vybraných bunkách, viď obrázok nižšie. Funkciu SUM môžeme použiť aj na spočítanie normálnych čísiel, napr.  =SUM(9;2;8)funkcia nám dá výsledok 19.[Image] Funkcia SUMIF (Súčet na základe podmienky)Zaujímavou súčtovou matematickou funkciou je SUMIF, ktorá spočíta hodnoty s nejakou podmienkou. Napríklad z tabuľky nižšie chceme spočítať "Cenu po zlave" spolu za všetky objednávky z mesta Martin. V argumentoch funkcie SUMIF nás samotný Excel navádza na to, čo máme zadať. Boldom sú zvýraznené argumenty Kritériá a Rozsah, ktoré spolu súvisia. Kritériom je to, čo je našou podmienkou - teda konkrétne Martin. Rozsah sú tie bunky, v ktorých viete nájsť svoje kritériá. Čiže označíme stĺpec Mesto. Rozsah súhrnu je to, čo chcem spočítať - označíme teda stĺpec 'Cena po zlave'. Klikneme OK a dostaneme výsledný súčet. [Image] Funkcia ROUND (Zaokrúhľovanie)Funkcia Round zaokrúhľuje matematicky.  Argumentami funkcie je číslo, ktoré chceme zaokrúhliť a druhý argument je na koľko desatinných miest chceme dané číslo zaokrúhliť.[Image] Funkcia SUBTOTAL (Súčtový riadok)Táto funkcia sa využíva pri tvorbe súčtových riadkov v tabuľkách. Jedná sa o praktickú funkciu, ktorá dokáže nahradiť niekoľko ďalších funkcií, napr. SUM, COUNT, MIN, MAX a pod. Jej veľkou výhodou je, že pokiaľ použijete napr. filter, umožní ti rozhodnúť sa, čo so skrytými riadkami. Pozrime si obrázky nižšie, v prvom nemáme použité žiadne filtrovanie a výsledky funkcií SUM aj SUBTOTAL sú zhodné. Keď sa však pozrieme na obrázok číslo dva, v ktorom sú už použité filtrovania, výsledky funkcií SUM a SUBTOTAL sú rozdielne a správny výsledok nám dáva práve funkcia SUBTOTAL. Je to práve kvôli tomu, že spočítava len viditeľné hodnoty v bunkách, nie hodnoty v bunkách, ktoré sú skryté.[Image][Image] Funkciu subotal si vyvoláme ako každú inú funkciu a jej argumenty sú nasledovné:  • Číslo funkcie: pokiaľ nepoznáte presné číslo funkcie, je vhodné si otvoriť pomocníka a vyhľadať si tú správnu funkciu. V našom prípade je to číslo funckie 109, pretože ide o funkciu SUM a ignorujeme skryté hodnoty. • Odk1: rozsah, s ktorým má naša funkcia pracovať, čiže označíme všetký bunky, ktoré má funkcia spočítať alebo urobiť inú matematickú operáciu. Čísla funkcií pre funkciu SUBTOTAL: Číslo funkcie (zahŕňa skryté hodnoty)Číslo funkcie (ignoruje skryté hodnoty)Funkcia1101AVERAGE 2102COUNT3103COUNTA4104MAX5105MIN6106PRODUCT7107STDEV8108STDEVP9109SUM10110VAR11111VARP  Average (Priemer)Matematická funkcia Average (Priemer) vypočíta priemernú hodnotu z rozsahu buniek. Vyvoláme si funkciu a do syntaxe označíme všetky hodnoty, z ktorých chceme vypočítať priemer. [Image] Aj túto funckiu môžeme modifikovať pomocou IF a teda použiť funckiu s podmienkou AVERAGEIF. OdmocninaV Exceli viete veľmi rýchlo a jednoducho odmocňovať. Existuje na to matematická funkcia SQRT, ktorá má len jeden argument a teda číslo, z ktorého chceme druhú odmocninu vypočítať. Funkciu SQRT je možné použiť len pre druhú odmocninu. Ak chcete vypočítať inú, je potrebné použiť matematický vzorec Y(1/x) prípadne funkciu POWER(). Pokiaľ sa chceš zdokonaliť v Exceli, pozrite si niektorý z našich Excel online kurzov pre začiatočníkov alebo pokročilých. Ak sa chceš naučiť používať Excel ešte efektívnejšie, prečítaj si aj náš článok o klávesových skratkách v Exceli. V ďalšom blogovom príspevku sa pozrieme na ďalie zaujímavosti z Excelu, zameriame sa na vyhľadávacie funkcie VLOOKUP a HLOOKUP.
Už 4 000 detí sa zúčastnilo webinárov STEM Kindloteka
Vzdelávanie
30.06.2020
Skillmea

Už 4 000 detí sa zúčastnilo webinárov STEM Kindloteka

Spoločnosť Amazon začala ponúkať v spolupráci so združením Learn2Code v apríli, počas pandémie a povinnej karantény, bezplatné online webináre STEM Kindloteka pre deti. Táto iniciatíva prebiehala súčasne v Česku i na Slovensku. Amazon chcel touto iniciatívou pomôcť deťom, ich rodičom a učiteľom v náročnom období, počas ktorého boli školy zatvorené. Od konca apríla až do konca júna združenie Learn2Code s podporou spoločnosti Amazon pripravilo 39 bezplatných webinárov, ktorých sa v obidvoch krajinách zúčastnilo 4 000 detí v priamom prenose. Dodatočne mali webináre na kanáli YouTube takmer 6 500 videní. Odozva od rodičov i detí bola veľmi pozitívna. „Syn je nadšený, Scratch-u sa venuje každý deň a vaše webináre sú super. Nestíha ich síce pozerať naživo ale na druhý deň ich pozerá na youtube a veľmi ho to baví!“ Hovorí pani Lenka, mama 9 ročného účastníka. Vyjadrenie syna bolo veľmi stručné ale výstižné: "Je to zábava a chcem sa prihlásiť aj na ďalší kurz." Webináre prebiehali dvakrát týždenne až do konca júna. Počas webinárov sa deti učili programovať v programovacom jazyku Scratch aj veľké hry ako napr. Flappy Bird, Pacman, Super Mario a ďalšie. Deti sa na nich učili všetko od začiatku až po zložitejšie príkazy. Po každom webinári dostali účastníci jeho videozáznam, zdrojové kódy, obrázky aj riešenia. Naše webináre sledovali aj učitelia, pre ktorých sa stali pomôckou. „Ja som bola veľmi spokojná s webinármi, veľa som sa naučila a účasťou na nich som získala nové zručnosti a cenné metodické materiály,“ hodnotí webináre Mária Vitikáčová, učiteľka zo ZŠ Bukovecká v Košiciach. „Super je archív a videonahrávky, ku ktorým sa môžeme kedykoľvek vrátiť,“ dodáva.      Účastníci mali možnosť pripojiť sa cez nástroj Zoom, v prípade, že sa chceli aktívne zapájať, alebo cez YouTube, ak chceli webinár len online sledovať. Všetky webináre si môžu aj naďalej pozrieť na YouTube kanáli Learn2Code. „Spolu bolo zrealizovaných takmer 40 webinárov, ktoré si deti hneď obľúbili. Aktívne sa do našich online stretnutí zapájali. Kládli veľa zvedavých otázok,“ povedal Marián Kristeľ marketing & operations z Learn2Code. „Každej lekcie sa zúčastnilo priemerne vyše 100 detí.” Spolupráca medzi Learn2Code a spoločnosťou Amazon zahŕňala tiež poskytnutie všetkých online kurzov pre deti od Learn2Code od polovice apríla do konca júna bezplatne. Aj táto aktivita zaznamenala veľký úspech. Na tieto kurzy sa od spustenia spolupráce prihlásilo viac ako 2000 používateľov.  Keďže spolupráca medzi Learn2Code a Amazonom zaznamenala úspech, pripravili spoločne aj ďalší formát, tentokrát pre rodičov a učiteľov. V špeciálnom videu s Luciou Šickovou, spoluzakladateľkou svetovo úspešnej slovenskej firmy Pixel Federation, ktorá tvorí počítačové hry vysvetlili, aký význam môže mať programovanie vo výchove a rozvoji detí. Lucia Šicková je zároveň mamou troch malých detí. Zaoberali sa teda aj témami, akú školu a prečo navštevujú jej deti, či a koľko sa s deťmi učí a ako sa to zmenilo počas domácej karantény, či overené tipy, čo vo výchove funguje. „Keďže koronakríza odhalila rôzne nečakané otázky ohľadne vzdelávania a výchovy detí, rozhodli sme sa podporiť aj takýto formát pre rodičov a učiteľov. Veríme, že to bude pre rodičov užitočné,“ povedala Miroslava Jozová, PR manažérka Amazon pre ČR a Slovensko.
Študijný plán pre budúceho Java programátora
Vzdelávanie
19.06.2020
Skillmea

Študijný plán pre budúceho Java programátora

Rozhodol si sa, že sa staneš Java programátorom. Dobrá voľba. V nasledujúcich riadkoch si prečítaj, kde začať, čo budeš potrebovať a ako dosiahnuť svoju vysnívanú métu. V tomto článku sa nebudeme venovať definícii programovania ani tomu, ktorý programovací jazyk si zvoliť. Budeme predpokladať, že si sa z istých dôvodov rozhodol práve pre Javu. Tými dôvodmi môže byť napríklad: • popularita Javy v programátorskom svete • dopyt po Java programátoroch na trhu práce • chceš naprogramovať Javovskú webovú alebo desktopovú aplikáciu • počul si, že Java je vhodná pre začiatočníkov v programovaní Popularita jazyka JavaPodľa indexu PYPL je Java druhým najpopulárnejším jazykom na svete. Rebríček PYPL je zostavovaný podľa toho, ako často sú tutoriály daného programovacieho jazyka vyhľadávané na Googli. Aj podľa iného indexu, TIOBE je Java druhá v rebríčku popularity, takže vybral si si správne.[Popularita jazyka Java podľa PYPL] Dopyt po Java programátorochDopyt po Java programátoroch zistíš z pracovných portálov, napr. na Profesia.sk, robime.it alebo ďalších. V čase písania tohto článku bolo na Profesii viac ako 120 ponúk pri zadaní pozície "Java programátor" (z celkových 480 programátorských pozícií). Keď si teda vyberáš programovací jazyk, je dôležité, aby aj firmy v ňom robili svoje projekty, aby si mal z dlhodobého hľadiska dostatok príležitostí. Java túto podmienku bez problémov spĺňa. V tomto rozhovore sa dočítaš, ako vyzerá práca Java developera v praxi. Čo chceš programovať?V Jave sa dajú programovať desktopové aj serverové aplikácie, vytvárať dynamické webové stránky, dá sa používať na prístup k dátam, umožňuje realizovať zložité distribuované výpočty a veľa ďalšieho. Javu využiješ aj pri programovaní Android aplikácií, takže jej využitie je takmer neobmedzené. Je Java vhodná pre začiatočníkov?Java je tu s nami už pekne dlho, takže existuje veľa zdrojov na štúdium, či už vo forme online kurzov, kníh alebo iných možností. Java programátorov je takisto dostatok, takže pravdepodobne nebudeš mať problém zohnať niekoho na mentoring, ak sa rozhodneš ísť touto cestou. Java odvodzuje svoju syntax z jazyka C a mnoho ďalších jazykov takisto odvodzuje svoju syntax z jazyka C. Takže keď sa naučíš Javu, ovládnuť jazyky ako C#, C++ alebo JavaScript bude jednoduchšie. Java je objektovo orientovaný jazyk, tieto základné koncepty teda vieš preniesť aj do iných jazykov. V Jave existuje kopec rôznych knižníc - grafika, sockety, a mnoho ďalšieho.  Naučiť sa Javu je relatívne jednoduché, vieš ju využívať vo svete desktopových alebo webových Java aplikácií, ale aj vo svete mobilných Android aplikácií. Javovský kód raz skompiluješ a beží všade (vďaka JVM!).  Java má aj svoje nevýhody, ako napr. to, že píšeš veľmi veľa kódu. Príklad, keď chceš niečo vypísať, v Jave to zapíšeš:  System.out.println(“Hello”); V Pythone by stačilo napísať len print(“Hello”). PeniazeKoľko zarábajú Java programátori? Podľa portálu platy.sk je to v rozmedzí 1350 až 2765 Eur. Záleží od tvojich znalostí, rokov praxe, projektov za sebou, regiónu a ďalších premenných.  Študijný plán Java programátora Základy programovania v JaveNajskôr sa nauč úplné základy jazyka Java. Potrebuješ vedieť, čo je to trieda, čo je to metóda, čo je premenná, ako sa píšu príkazy, čo je terminál, výpis, podmienka, cyklus, ako pracuje Java s pamäťou a iné základné znalosti. S týmito základmi vieš písať jednoduché príkazy a trénovať. Odporúčame ti vyskúšať náš online kurz Java pre začiatočníkov, ktorý máš k dispozícii zdarma. Java pre pokročilýchPo zvládnutí základov pristúpiš k pokročilým častiam jazyka ako sú výnimky, OOP (objektovo orientované programovanie), práca s Java triedami, rozhrania, rekurzia, funkcionálne programovanie pomocou Lambda výrazov, stream API, anotácie, reflexia, kolekcie, generické programovanie a podobne. Je toho dosť, pre úspešné zvládnutie zákutí Javy si namixuj tento koktail našich kurzov: 1. Java a OOP pre začiatočníkov 2. Java pre pokročilých SQLVeľké množstvo aplikácií pracuje sa databázami. Aby si aj ty v aplikáciách vedel správne používať databázu, musíš sa naučiť základy jazyka SQL. Pomocou SQL príkazov vieme z databázy čítať dáta, zapisovať dáta, meniť dáta, alebo ich mazať. Keď budeš študovať ako pracovať v aplikáciách s databázami, stretneš sa s pojmom CRUD. To nie je nič iné ako create, read, update a delete. Teda základné operácie. Yablko spravil online kurz na SQL databázy MySQL a SQLite, sú v ňom vysvetlované aj základy samotného SQL-ka, tak si to naštuduj. GitPri práci na projektoch musíš mať prehľad o zmenách v tvojom alebo kolegovom kóde. V priebehu času budeš mať určite množstvo verzií svojho programu. Ako programátor budeš pracovať v tíme. Každý bude pracovať na svojej časti programu a potom si tieto svoje verzie zlúčite dokopy. Nielen na tieto úlohy budeš používať Git. Git je najrozšírenejší verzionovací nástroj a určite stojí za to naučiť sa ho používať. Každý programátor musí vedieť pracovať s Gitom, nauč sa to aj ty pomocou tohto online kurzu. Java junior programátorNa záver tvojho vzdelávania v Jave nesmieš vynechať témy ako Maven, Servlety a ORM - JPA (Hibernate). Keď sa ti do hlavy dostanú aj tieto pojmy, je z teba junior programátor. Online kurz pre ašpirujúcich Java junior programátorov nájdeš tu. Bonus: Spring framework + Spring BootAby sa ti zo všetkým pracovalo jednoduchšie a chceš preskočiť pár krokov v príprave aplikácie, chceš mať po ruke množstvo pomocných technológií, tak určite siahneš po Spring frameworku. Spring je najpoužívanejší javovský vývojársky framework súčasnosti. Ak si otvoríš pracovné ponuky zamerané na Javu, tak tam takmer určite nájdeš požiadavku, aby si ovládal Spring. Spring uľahčuje enterprise java vývoj, čo ho robí prvou voľbou pri projektoch ľubovoľnej veľkosti. Vývoj Springu začal, keď bolo veľmi komplikované začať vyvíjať enterprise aplikácie v enterprise edícii javy. Tvorcovia Springu toto využili a vytvorili nástroj, ktorý je vysoko používaný a uľahčuje množstvo vecí. ZáverTento článok mal za cieľ predstaviť ti programovací jazyk Java a ukázať, čo všetko potrebuješ ako budúci Java programátor vedieť. Okrem Javy je to SQL, Git a ideálne aj Spring framework. Stať sa Java programátorom sa ti môže javiť ako nedosiahnuteľná méta, opak je ale pravdou. Java je od začiatku navrhovaná tak, aby tvoja krivka učenia bola pokiaľ možno čo najstrmšia.