Vzdelávanie

Sekcia vzdelávania ponúka články o rôznych vzdelávacích programoch, vrátane Data science kurzov a kurzov ako kurz Excel, ktoré vám pomôžu získať praktické zručnosti. Objavte najlepšie spôsoby, ako sa vzdelávať online a posunúť svoje schopnosti na vyššiu úroveň.

Izometrický dizajn: 3D objekty zobrazené v 2D priestore
Vzdelávanie
10.06.2021
Ľudovít Nastišin

Izometrický dizajn: 3D objekty zobrazené v 2D priestore

Vo svojej podstate predstavuje izometrický dizajn spôsob, akým zobrazujeme trojrozmerné objekty v dvojrozmernom priestore. Izometria však nie je to isté ako perspektíva, ktorá je zvyčajne úzko spojená s realistickým umením. Hlavným dôvodom je to, že nemá žiadny „miznúci bod“ (vanishing point). Práve to umožňuje izometrickým tvarom zachovať si kompozíciu bez ohľadu na to, kde človek stojí alebo sedí pri pozorovaní izometrického dizajnu. Možno si si všimol izometrické reklamy, v digitále alebo infografikách, či vo svojich obľúbených videohrách a ilustráciách. Izometrické umenie dáva dizajnérom nečakane široké spektrum možností. A pretože je založené na tvaroch, izometrické kresby sa vytvárajú prekvapivo jednoduchým procesom. Je to tiež veľká sranda! Väčšinou...  Ako vytvárať izometrické dizajny Dizajn je izometrický iba vtedy, ak kopíruje izometrickú mriežku. Tú tvoria vertikálne čiary, ktoré zostávajú pri postupe zvislé a všetky vodorovné čiary sú sklonené o 30 stupňov. Toto sa tiež nazýva pravidlom 120 stupňov. To hovorí, že uhol medzi osami X, Y a Z musí byť spolu 120 stupňov.  • Dizajn sa musí sa riadiť izometrickou mriežkou  • Dizajn nemôže obsahovať zbiehajúce sa čiary  • Zvislé čiary zostávajú zvislé, zatiaľ čo vodorovné čiary majú 30 stupňový sklon  • Os X, Y a Z spolu tvoria spolu až 120 stupňov[Image] Kedy použiť izometrický dizajn Izometrická projekcia je pre dizajnérov veľmi užitočná - najmä architektov, priemyselných a interiérových dizajnérov, pretože je ideálna na vizualizáciu miestností, produktov či infraštruktúry. Je skvelým spôsobom, ako rýchlo otestovať rôzne dizajnérske nápady.  Existuje množstvo ďalších situácií, v ktorých je izometrická projekcia užitočná. V systémoch orientácie napríklad v múzeách alebo galériách môžu izometrické nástenné mapy ukázať návštevníkom, kde sa v budove nachádzajú, čo sa deje inde a ako sa tam dostať.  Niektoré z najlepších infografík používajú izometrickú projekciu, ktorá im umožňuje zobraziť viac informácií, ako by bolo možné na 2D výkrese. A dokonca aj logá používajú tento prístup na vytvorenie efektu priestorového efektu.[Image] Isometric case study: Monument Valley Keďže pohľad v tejto hre má jediný bod, ktorý sa nikdy nepohybuje, objavili sa tu zaujímavé problémy týkajúce sa manipulácie perspektívy. Aj keď sa zdá, že chodník alebo most vedie na prvý pohľad do slepej uličky, rýchle otáčanie mapy ukazuje cestu vedúcu na nové miesto. Vďaka tomu je v hre veľa hlavolamov, ktoré sa zdajú buď nemožné alebo príliš jednoznačné. No ani jedno nie je pravda. Je to len komplikovanejšie, ako sa na prvý pohľad zdá.  A aby tento efekt mohli dosiahnuť, všetko sa muselo presne zoradiť v rôznych uhloch. Preto sa vývojári rozhodli položiť hru do 30-stupňovej izometrickej mriežky. To znamená, že každý uhol, ktorý vidíte, je buď 30 stupňov, 120 stupňov alebo úplne zvislý, čo sme si už vysvetlili vyššie. Izometrický dizajn je skvelá technika na oživenie 2D flat dizajnu. Prirodzenou výhodou je, že grafiku pomocou izometrickej projekcie vnímame jasnejšie a veľmi dobre sa v nej vieme orientovať. Izometrické vzory vytvárajú realitu, v ktorej môžeme vnímať veci také, aké sú. Divné, ale funkčné. A práve to z nej robí vynikajúci doplnok k alternatívam dizajnu, ktoré už máš vo svojom portfóliu.
Podmienené formátovanie v Exceli
Vzdelávanie
14.05.2021
Skillmea

Podmienené formátovanie v Exceli

V tomto článku ti popíšeme, ako využívať podmienené formátovanie v Exceli. Podmienené formátovanie je dobré využívať vtedy, keď potrebuješ zmeniť formát vybraných buniek, pokiaľ sú splnené isté kritériá (podmienky). Formátovať je možné viacero atribútov, môže to byť farba, percentá, dátumy a podobne. Čo je to podmienené formátovanie?Podmienené formátovanie (alebo conditional formatting) je Excel nástroj, pomocou ktorého môžeš nastaviť automatické formátovanie buniek. Podmienené formátovanie slúži na vyznačenie údajov, ktoré spĺňajú nejakú tebou zadanú podmienku. Uvediem jeden príklad: máš databázu produktov (môže ich byť 100, 1000 alebo 10000) a chceš v tejto databáze vyznačiť zelenou farbou len produkty, ktorých cena je nižšia ako 50 Eur. Teraz prichádza na pomoc podmienené formátovanie. Keď si to rozbijeme na drobné, najskôr: 1. Formát: vyznač zelenou farbou. 2. Podmienka: cena nižšia ako 50. Príklad podmieneného formátovania cez "ROVNÁ SA"Mám Excel tabuľku s údajmi o zamestnancoch a oddelení, v ktorom pracujú. Tabuľku si môžeš stiahnuť odtiaľto, prípadne si použi akýkoľvek vlastný Excel súbor. V mojom súbori chcem formátom farebne odlíšiť všetkých zamestnancov, ktorí pracujú v oddelení HR.[Image] Ako budem postupovať?Najskôr si označím všetky bunky, ktoré plánujem formátovať. Môžem to urobiť potiahnutím myškou, alebo v prípade väčšieho počtu údajov použi klávesovú skratku CTRL+SHIFT+⬇ (pre MacOS používateľov je to CMD+SHIFT+⬇). Následne na záložke DOMOV (HOME) tvojho Excelu vyhľadaj Podmienené formátovanie (Conditional Formatting) a následne Pravidlá zvýrazňovania buniek (Highlight Cells Rules) a potom nástroj Rovná sa (Equal to), vid obrázok nižšie.[Image] Teraz vpíšeš hodnotu HR do políčka, ktoré som vyznačil farebne na obrázku nižšie a použiješ buď niektorý z prednastavených formátov, alebo si vytvoríš vlastný. Po odkliknutí sa ti farebne odlíšia všetky polia obsahujúce HR. “Je dobré spomenúť, že Excel nerozlišuje veľké a malé písmená, takže keby do daného filtra vpíšeš aj "hR", "hr" alebo "Hr", tak Excel bude vedieť, čo od neho chceš. Pokiaľ by si však už použil diakritiku, s tým si Excel neporadí.[Image]” Výsledok nášho podmieneného formátovania bude teda vyzerať nasledovne:[Image] Zrušenie podmieneného formátovaniaNa zrušenie podmieneného formátovania môžeš použiť dva spôsoby. Prvým z nich je vymazanie podmieneného formátovania len pre tebou označené bunky alebo zmažeš podmienené formátovanie z celého Excel hárku. Obidva spôsoby spravíš opäť cez záložku Podmienené formátovanie a Vymazať pravidlá. Následne už len zvolíš, či chceš zmazať pravidlo z označených buniek alebo z celého Hárku.[Image] Podmienené formátovanie môžeš využiť aj pri práci s kontingenčnými tabuľkami, s grafmi a pod. Práca s Excelom je vďaka podmienenému formátovaniu rýchlejšia a kvalitnejšia. Možností na prácu a filtrovanie vďaka podmienenému formátovaniu je mnoho, stačí sa s touto možnosťou len pohrať. Vyskúšaj to sám aj pre ďalšie možnosti podmieneného formátovania - Väčší a menší ako; Medzi; Text obsahujúci; Vyskytujúci sa dátum a pod.
Agilný vývoj - úvod do problematiky
Vzdelávanie
10.05.2021
Skillmea

Agilný vývoj - úvod do problematiky

Čo je agilný vývoj? „Agilné metodiky pre riadenie vývoja software sú také metodiky, ktoré využívajú agilný prístup, teda pružne reagujú na zmenu, priebežne rozvrhujú prácu v priebehu vývoja a overujú výstupy s užívateľmi. Agilné metodiky obsahujú základné princípy, ktorými by sa mal úspešný projekt vývoja software riadiť. Proces vývoja je vďaka agilnému prístupu postavený na tímovej spolupráci, otvorenej komunikácii tímu, zapojenie zákazníka a celkovej flexibilite a otvorenosti zmenám. Využitie agilných metodík pre vývoj softvéru v praxi: Agilný prístup k vývoju sa uplatňuje predovšetkým u zložitého, komplexného alebo inovačného softvéru, u ktorého je veľmi ťažké spísať detailné požiadavky na začiatku projektu. Tie sa postupne upresňujú alebo tvorí priebežne na základe skúseností s prototypmi z jednotlivých iterácií vývoja na základe spätnej väzby od užívateľov. Agilné metodiky sú zamerané na efektívnosť práce, kvality výsledkov a spokojnosť užívateľov. Nesnaží sa potláčať zmeny oproti pôvodnému plánu, ale naopak je pre ne charakteristické upresňovanie a prispôsobovanie výsledného softvéru.“ (zdroj: managementmania.com) Následne keď vieme, že budeme používať agilný vývoj, potrebujeme nejaký tool – nástroj kde budeme riadiť úlohy. Jedným z najznámejších nájstrojov je Jira. Agilné prístupy a metodikyAgilných prístupov a metodík je veľa. Záleží, čo v projekte potrebujete. Najznámejšia metodika je Srum. V Jire si vieme zvoliť najmä medzi Scrum a Kanban. Čo vybrať? Záleží od projektu. Vo firme budeš pravdepodobne používať Srum. Aký je rozdiel? Kanban je o hlavne o vizualizácií práce. Kanban používa kolonky, ktoré predstavujú rôzne štádiá vývoja. Zoberiem si úlohu – je pridelená. Daný človek na nej začne robiť – je v kolonke in progress (pracuje sa na nej). Potom je úloha posunutá na test, alebo dokončená. Kolonky si môžete prispôsobiť. Tu si o tom vieš prečítať obšírnejšie. Scrum tímy pracujú v stanovených intervaloch nazývaných šprinty. Šprint je približne týždeň alebo dva. Počas šprintu pracujú ľudia na úlohách, ktoré im boli pridelené na začiatku šprintu na takzvanom plánovaní šprintu. Srum vedie jedna osoba a tou je takzvaný Srum master. Počas Srum vedenia týmu sa ciele projektu upravujú – zbierajú sa informácie od klientov, od používateľov a potom sa aplikujú zmeny. Tu si o tom vieš prečítať obšírne. JiraJira je zdarma pre jednoduchý projekt a tým. Na tejto stránke si vieš založiť svoju Jiru. Jira je tool na manažment úloh a tieto úlohy musia byť priradené do projektov. Teda ako prvý krok je vytvorenie projektu. Si prihlásený v Jire a v pravom hornom rohu budeš mať tlačidlo na vytvorenie projektu. [Image] Vytvoríš si projekt:[Image] Ako Template je vybratý Kanban. Toto vieme zmeniť po stlačení Change template. Čo zvolíš je na tebe. Poďem si ukázať Scrum. Vyberiem Scrum a vytvorím projekt.  Momentálne nemáme žiaden sprint. Musíme ho vytvoriť, aby sme začali vývoj. Ideme do Backlogu, čo je miesto kde máme vytvorené úlohy.[Image] Bez úloh nebude šprint. Vytvor si úlohy. Máš na výber viacero miest kde vytvoriť úlohy, ale princíp je stále ten istý – mať úlohy, na ktorých sa môže pracovať. [Image] Keď máme vytvorené úlohy, tak vieme spustiť šprint.[Image][Image]  Vytvoril si šprint. Teraz je prázdny. S týmom sa dohodnete, čo sa má spraviť a dané úlohy sa pretiahnu z backlogu do šprintu.  Dohodli sme sa, že spravíme dve úlohy a jednu ponecháme v backlogu. Následne spustíme šprint.[Image] Pri spustení určíme ako dlho má šprint prebiehať. Teraz je šprint aktívny a vieme si pozrieť nástenku šprintu. V tejto nástenke vidíme, v akom sú úlohy štádiu. [Image]  Samozrejme nesmieš zabudnúť danú úlohu niekomu prideliť. Otvoríš si úlohu a assigneš (pridelíš) ju niekomu.[Image] Daný používateľ si vie vypísať len jeho úlohy v danom šprinte.[Image] Autorom článku je Jaroslav Beňo.
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.
Ako sa stať front end developerom. Plán pre budúceho JavaScript programátora
Vzdelávanie
26.03.2021
Skillmea

Ako sa stať front end developerom. 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 frontend developera. Kurzy cez úrad práce alebo špecializované IT online kurzy môžu byť vynikajúcim odrazovým mostíkom. Frontend developer vs backend developer vs fullstack developerFrontend developer je človek, ktorý je zodpovedný za časti webovej aplikácie alebo webstránky, ktoré používatelia vidia a interagujú s nimi. Backend developer rieši všetko na pozadí – infraštruktúru, dátový model, databázy. Potom je tu fullstack developer, ktorý zvláda frontend aj backend a pokrýva celý proces návrhu webovej aplikácie. Na lepšiu predstavu sa môžeme pozrieť na programátorské meme.[Programátorské meme] Dnes sa hranica medzi frontendom a backendom stále viac stiera, čo znamená, že veľa úloh spadajúcich do backendu môže preberať front end developer. Preto je dôležité vedieť nielen základy, ale mať širší pohľad na technológie a funkcie. Úlohy frontend developeraFrontend developer sa venuje najmä týmto oblastiam: • rozhoduje o dizajne a štruktúre webstránok, • vyvíja funkcie na dosiahnutie vynikajúcej používateľskej skúsenosti, • dbá na responzivitu webstránky, • optimalizuje web pre rýchle načítanie a škálovateľnosť, • volí kombinácie technológií pre dosiahnutie najlepšieho výsledku. Zručnosti front-end developeraDobrý front end developer musí mať komplexné znalosti v oblasti vývoja webu. Mal by ovládať technológie ako HTML, CSS, JavaScript a ďalšie nástroje (čítaj ďalej v článku). Grafické zručnosti, ako práca s Photoshopom, Sketchom alebo Illustratorom, sú veľkým plusom. Základné znalosti SEO sú užitočné pri optimalizácii webstránok, a tiež dobré komunikačné schopnosti, pretože vývojári často spolupracujú s grafikmi, backend developermi, projektovými manažérmi či klientmi. Ak sa chceš naučiť viac o jednotlivých technológiách, web developer kurz je skvelou príležitosťou, ako naštartovať kariéru. Mzda frontend developeraPodľa portálu platy.sk na Slovensku zarába JavaScript programátor (prečo je táto pozícia vyhľadávaná, sa dozvieš nižšie) od 1.300 Eur do 2.900 Eur v závislosti od skúseností a praxe. Dobrí JavaScript programátori sú na trhu stále žiadaní, čo znamená, že ak sa rozhodneš stať frontend developerom, práca ťa určite neminie.[Mzda Front-end developera.] JavaScript je nesmierne populárny. Podľa rebríčka RedMonk je JavaScript na GitHube a Stack Overflow technológia číslo jedna. Ak na Profesii vyhľadáš pozície pre JavaScript alebo frontend programátorov, nájdeš stovky možností. A ak na LinkedIn uvedieš, že zvládaš JavaScript spolu s niektorým JavaScript frameworkom, môžeš očakávať správy od IT recruiterov. Tak sa pusť do toho a zisti ako sa stať programátorom s pomocou našich rád a kurzov cez úrad práce alebo iných IT kurzov. 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 [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. [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);