Náš blog

Tipy a triky
21.05.2022
Marian Kristel

Nejpoužívanější Linuxové příkazy

Když se řekne Linux, většina lidí si představí komplikovaný operační systém, který používají pouze programátoři. Není to ovšem tak, jak se na první pohled může zdát. Co je Linux?Linux je celá rodina unixových operačních systémů s otevřeným zdrojovým kódem, které jsou založeny na Linuxovém jádru. To zahrnuje všechny nejpopulárnější systémy založené na Linuxu, jako jsou Ubuntu, Fedora, Mint, Debian a další. Přesněji řečeno, nazývají se distribuce. Celosvětový tržní podíl Linuxu na desktopových počítačích je 2,49 %, avšak když se podíváme na cloudovou infrastrukturu, zde Linux dominuje s podílem přibližně 90 %. Při práci s operačním systémem Linux musíš použít shell – rozhraní, které poskytuje přístup ke službám operačního systému. Většina distribucí Linuxu používá grafické uživatelské rozhraní (GUI) jako svůj shell, hlavně proto, aby svým uživatelům usnadnila používání. Je běžnou praxí používat je při správě VPS. Jakékoliv grafické uživatelské rozhraní (GUI) je jen abstrakcí programů příkazového řádku. Například když zavřete okno kliknutím na „X“, za touto akcí se spustí příkaz. Doporučuje se používat rozhraní příkazového řádku (CLI), protože je výkonnější a efektivnější. Úlohy, které vyžadují vícekrokový proces přes GUI, lze provést během několika sekund zadáním příkazů do CLI. V tomto článku se naučíš 26 základních příkazů Linuxu, které ti jako nováčkovi nepochybně pomohou při navigaci v Linuxu. Co je Linuxový příkaz?Linuxový příkaz je program nebo pomůcka, která se spouští na příkazovém řádku. Příkazový řádek je rozhraní, které přijímá řádky textu a zpracovává je do pokynů pro tvůj počítač. Příznak je způsob, jak můžeš předat možnosti příkazu, který spustíš. Většina příkazů Linuxu má stránku nápovědy, kterou můžeš vyvolat příznakem -h. Argument nebo parametr je vstup, který dáváme příkazu, aby mohl správně běžet. Ve většině případů je argumentem cesta k souboru, ale může to být cokoli, co zadáš do terminálu. Příznaky lze vyvolat pomocí pomlček (-) a dvojitých pomlček (--), zatímco provedení argumentů závisí na pořadí, ve kterém je odešleš funkci. Nejpoužívanější Linuxové příkazyPředtím, než se podíváme na nejpoužívanější Linux příkazy, nezapomeň spustit terminál. Ve většině distribucí Linuxu lze použít klávesovou zkratku Ctrl+Alt+T. Pokud to nefunguje, příkazový řádek najdeš v části Utilities. 1. pwdPomocí příkazu pwd zjistíš cestu k aktuálnímu pracovnímu adresáři (složce), ve kterém se nacházíš. Příkaz vrátí absolutní (úplnou) cestu, což je v podstatě cesta všech adresářů, která začíná lomítkokem (/ ). Příkladem absolutní cesty je /home/username. 2. cdNa navigaci v souborech a adresářích Linuxu použiješ příkaz cd. Vyžaduje buď úplnou cestu nebo název adresáře, v závislosti na aktuálním pracovním adresáři, ve kterém se nacházíš. Například si v /home/username/Documents a chceš přejít do adresáře Photos, který je podadresářem Documents. Jednoduše zadáš následující příkaz: cd Photos. Jiná situace by byla, kdyby si chtěl přejít do zcela nového adresáře, například /home/username/Movies. V tomto případě zadáš cd a za ním absolutní cestu k adresáři: cd /home/username/Movies. Existuje několik zkratek, které vám pomohou při rychlé navigaci: • cd .. (se dvěma tečkami) pro posun o jeden adresář nahoru, • cd k přejetí přímo do domovského adresáře, • cd- (s pomlčkou) pro přesun do předchozího adresáře “Shell Linuxu je case sensitive a rozlišuje velká a malá písmena. Takže musíš zadat název adresáře přesně tak, jak je.” 3. lsPříkaz ls se používá k zobrazení obsahu adresáře. Ve výchozím nastavení tento příkaz zobrazí obsah tvého aktuálního pracovního adresáře. Pokud chceš vidět obsah jiných adresářů, zadej ls a potom cestu k adresáři. Například zadáním ls /home/username/Documents zobrazíš obsah adresáře Documents. Existují tyto verze, které můžete použít s příkazem ls: • ls -R zobrazí seznam všech souborů v podadresářích, • ls -a zobrazí skryté soubory, • ls -al zobrazí seznam souborů a adresářů s podrobnými informacemi, jako jsou oprávnění, velikost, vlastník atp. 4. catcat (zkratka pro concatenate) je jedním z nejčastěji používaných příkazů v Linuxu. Používá se k výpisu obsahu souboru na standardním výstupu (sdout). Pokud chceš spustit tento příkaz, zadej cat a za ním název souboru a jeho příponu. Například: cat file.txt. Zde jsou další způsoby použití příkazu cat: • cat povodnysubor > názevsouboru obsah z původního souboru zkopíruješ a uložíš do souboru názevsouboru, • cat názevsouboru1 názevsouboru2>názevsouboru3 spojí dva soubory (1 a 2) a uloží jejich výstup do nového souboru (3), • ke změně souboru na velká nebo malá písmena použij cat názevsouboru | tr a-z A-Z >output.txt 5. cpPro zkopírování souborů z aktuálního adresáře do jiného adresáře použij příkaz cp. Například příkaz cp skillmea_logo.jpg /home/username/Pictures vytvoří kopii skillmea_logo.jpg (z tvého aktuálního adresáře) do adresáře Pictures. 6. mvPříkaz mv se primárně používá k přesunu souborů, přestože jej lze použít také k přejmenování souborů. Argumenty u mv jsou podobné příkazu cp. Musíš zadat mv, název souboru a cílový adresář. Například: mv hello.txt /home/username/Documents. Pokud chceš přejmenovat soubory, příkaz je mv starýnázev.txt novýnázev.txt 7. mkdirK vytvoření nového adresáře použiješ příkaz mkdir — pokud zadáš mkdir Music, vytvoří se adresář s názvem Music. Existují i další příkazy mkdir: • pro vygenerování nového adresáře v jiném adresáři, použij příkaz mkdir Music/Novyadresar • použijte volbu p (parents) k vytvoření adresáře mezi dvěma existujícími adresáři, například mkdir -p Music/Metallica/Novyadresar vytvoří Novyadresar v adresáři Metallica. Pokud adresář Metalilca neexistuje, tak jej zároveň i vytvoří. 8. rmdirPokud potřebuješ vymazat adresář, použij příkaz rmdir. rmdir však umožňuje mazat pouze prázdné adresáře. 9. rmPříkaz rm se používá k odstranění adresářů a obsahu v nich. Pokud chceš odstranit pouze adresář, jako alternativu k rmdir použijte rm -r. “U tohoto příkazu musíš být velmi opatrný a vždy zkontroluj, ve kterém adresáři se nacházíš. Příkazem se vše vymaže a nelze jej vrátit zpět.” 10. touchTento příkaz umožňuje vytvořit nový prázdný soubor. Zadejte například touch /home/username/Documents/Index.html a vytvořte soubor HTML s názvem Index v adresáři Documents. 11. locateTento příkaz můžeš použít k vyhledání (locate) souboru, stejně jako příkaz k vyhledávání v systému Windows. Při použití argumentu -i spolu s tímto příkazem se nerozlišují malá a velká písmena, takže je možné hledat soubor, i když neumíš jeho přesný název. Pokud potřebuješ vyhledat soubor, který obsahuje dvě nebo více slov, použiješ hvězdičku (*). Například příkaz locate -i meeting*notes vyhledá jakýkoli soubor, který obsahuje slovo „meeting“ a „notes“, a je jedno, zda se jedná o velká nebo malá písmena. 12. findPodobně jako u příkazu locate, pomocí find se také vyhledají soubory a adresáře. Rozdíl je v tom, že k vyhledání souborů v daném adresáři použiješ příkaz find. Například příkaz find /home/ -name notes.txt vyhledá soubor s názvem notes.txt v domovském adresáři a jeho podadresářích. 13. grepDalší ze základních Linuxových příkazů, který je užitečný pro každodenní použití, je grep. Umožňuje prohledávat celý text v daném souboru. Příklad použití: grep deadline notes.txt vyhledá v souboru notes.txt slovo deadline. Řádky, které obsahují hledané slovo, se zobrazí celé. 14. sudoZkratka pro „SuperUser Do“, tento příkaz umožňuje provádět úkoly, které vyžadují oprávnění správce nebo oprávnění root. Nedoporučuje se však používat tento příkaz ke každodennímu použití, protože se může snadno stát, že dojde k chybě, pokud uděláš něco nesprávného. 15. dfPomocí příkazu df získáš zprávu o využití místa na disku v procentech a kB. Pokud potřebuješ zobrazit přehled v megabajtech, zadej příkaz df -m. 16. duPokud chceš zkontrolovat, kolik místa zabírá soubor nebo adresář, použiješ k tomu příkaz du (Disk Usage). Souhrn využití disku však namísto obvyklého formátu velikosti zobrazí čísla bloků disku. Pokud ho chceš vidět v bajtech, kilobajtech a megabajtech, přidej do příkazové řádky argument -h. 17. headPříkaz head se používá k zobrazení prvních řádků libovolného textového souboru. Ve výchozím nastavení se zobrazí prvních deset řádků, ale toto číslo lze změnit dle vlastního uvážení. Například pokud chceš zobrazit jen prvních pět řádků, zadej příkaz head -n 5 název souboru.ext. 18. tailTento má podobnou funkci jako příkaz head, ale místo zobrazení prvních řádků příkaz tail zobrazí posledních deset řádků textového souboru. Například tail -n název_souboru.ext. 19. tarPříkaz tar je nejpoužívanějším příkazem k archivaci více souborů do tarballu – běžného formátu souborů v systému Linux, který je podobný formátu zip, přičemž komprese je volitelná. Tento příkaz je poměrně složitý s dlouhým seznamem funkcí, jako je přidávání nových souborů do stávajícího archivu, seznam obsahu archivu, extrahování obsahu z archivu a mnohé další. 20. killPokud máš nereagující program, můžeš ho ukončit manuálně pomocí příkazu kill. Vyšle určitý signál nesprávně se chovající aplikaci a přikáže aplikaci, aby se sama ukončila. 21. pingPomocí příkazu ping zkontroluješ stav připojení k serveru. Jednoduchým zadáním příkazu ping google.com příkaz zkontroluje, zda se dokážete připojit ke službě Google, a také změří čas odezvy. 22. wgetPříkaz wget je velmi užitečný, pomocí něhož lze dokonce stahovat soubory z internetu. Pokud to chceš udělat, jednoduše zadej wget a za ním odkaz ke stažení. 23. topPříkaz top zobrazí seznam spuštěných procesů a kolik procesoru každý proces využívá. Monitorování využití systémových prostředků je užitečné, je dobré zejména vědět, který proces je třeba ukončit, protože spotřebovává příliš mnoho zdrojů. 24. manNejsi si jistý ohledně funkcí určitých Linux příkazů? Žádné obavy, můžeš se snadno naučit, jak je používat přímo z prostředí Linuxu pomocí příkazu man. Například příkaz man tail zobrazí manuální pokyn pro příkaz tail. 25. echoTento příkaz se používá k přesunu některých dat do souboru. Například, pokud chceš přidat text „Ahoj, jmenuji se Karel“ do souboru s názvem name.txt, napíšeš echo Ahoj, jmenuji se Karel >> name.txt. 26. useradd, userdelProtože Linux je systém pro více uživatelů, znamená to, že se stejným systémem může současně pracovat více osob. useradd se používá k vytvoření nového uživatele, zatímco passwd přidává heslo k účtu tohoto uživatele. Pokud chceš přidat novou osobu s názvem Karel napíšeš: useradd Karel a poté přidej jeho heslo příkazem passwd Karel a systém tě vyzve k zadání a potvrzení hesla. Odstranění uživatele je velmi podobné jako přidání nového uživatele, stačí napsat userdel UserName. ZávěrZákladní Linuxové příkazy ti pomohou provádět úkoly jednodušší a efektivnější. Může chvíli trvat, než si zapamatuješ základní příkazy, ale praxí a neustálým zkoušením získáš jistotu. Znalost a zvládnutí těchto základních Linuxových příkazů bude přínosem pro správu tvého linuxového stroje, ať už desktopu nebo VPS řešení. Hodně štěstí!
Tipy a triky
07.03.2022
Skillmea tím

8 najlepších pluginov pre After Effects

V tomto článku prinášame prehľad 8 najlepších After Effects pluginov a ich funkcií, o ktorých by mal vedieť a pracovať s nimi každý seriózny motion designer. Adobe After Effects je skvelý softvér, no prichádza bod, kedy by vás mohlo zaujímať, ako môžete zlepšiť svoj workflow, zvýšiť svoju kreativitu a produktivitu a naučiť sa nové zručnosti. V tomto momente vstupujú do hry úžasné pluginy do After Effects. Pluginy existujú od výmyslu sveta: od úpravy postáv, korekcie farieb, glitch efekty, a mnohé ďalšie. Výhody a nevýhody používania After Effects pluginovEšte predtým ako sa pozrieme na jednotlivé pluginy podrobnejšie, prejdime si klady a zápory After Effects pluginov,  Výhody After Effects pluginov: • umožňujú novú úroveň kreativity, • mali by zlepšiť váš pracovný workflow v After Effects, • vytvárajte efekty oveľa rýchlejšie ako používaním iba predvolených efektov After Effects, • možňuje vám pracovať s 3D objektmi a prvkami priamo v After Effects, • vytvorte nádherné pozadia iba niekoľkými kliknutiami, • nevyžadujú znalosť programovania, skriptovania. Nevýhody After Effects pluginov: • niektoré pluginy zaberajú veľa pamäte a značne spomaľujú After Effects počas ich používania, • vykreslenie niektorých pluginov zaberie veľa času, • niektoré pluginy môžu počas používania aplikácie After Effects spadnúť, • cena pluginov môže byť relatívne vysoká. 1. OrbPlugin Orb je navrhnutý tak, aby pomáhal pri vytváraní 3-rozmerných gúľ. Používa sa predovšetkým pri vytváraní planét. Orb používa podobný 3D engine ako vynikajúci doplnok Element 3D od Video Copilot a zameriava sa na vytváranie realistických planét a ponúka celý rad jedinečných nástrojov na jednoduché vytváranie planét. Môže sa zdať, že vytvorenie planéty v After Effects je také jednoduché ako vytvorenie gule s nejakými textúrami. Ak však chcete vytvoriť pôsobivú, profesionálne detailnú planétu, Orb je najlepší nástroj, ktorý máte. Nehovoriac o tom, že doplnok je bezplatný a má bezplatný návod, ktorý môžete využiť. Orb bude fungovať pre 90 percent z nich a je neoceniteľným nástrojom pre previs. To platí najmä v kombinácii s inými zásuvnými modulmi After Effects alebo v kombinácii s 3D kamerou z 3D aplikácie, ktorú je možné importovať do After Effects spolu s doskami v popredí pre objekty, ako sú vesmírne lode. 2. Animation ComposerPovedzme, že sa ponáhľate a chcete animovať svoju vrstvu After Effects v zlomku sekundy? Najlepším riešením môžu byť predvoľby pohybu animácií - motion presets. Niekoľkými kliknutiami môžete doslova získať super plynulé odrazy a jednoduchú animáciu. Balík obsahuje viac ako 1000 presetov, takže si určite nájdete pohyb, ktorý sa vám páči. Bonus: za týmto pluginom stoja Slováci z Mister Horse. 3. DuikAfter Effects má dobrý základný systém rozhýbania postáv (rigging), ale Duik posúva rigging na úplne novú úroveň. Klienti stále častejšie požadujú Duik pre akúkoľvek pokročilú prácu s animáciou a plugin sa stáva kľúčovým prvkom animácie pre širokú škálu projektov. Tento doplnok je úplne zadarmo spolu so zvyškom doplnkov Rainbox After Effects. Určite sa oplatí naučiť pracovať s Duik pluginom. Ak sa vám plugin páči, podporte jeho tvorcov. Ak vás zaujíma tento plugin a chcete sa venovať charakterovým animáciám a rozpohybovaniu postáv, pozrite si náš online kurz Character Animations, v ktorom sa venujeme práve DUIK pluginu. 4. Motion Boutique - Newton3Newton3 je jedným z pluginov, ktorý by motion dizajnéri mali mať nainštalovaný. Je to v podstate 2D fyzika alebo matematický engine integrovaný do After Effects, ktorý vám umožňuje presúvať vrstvy realistickým spôsobom, pretože všetko je vypočítané za vás. Či už chcete ukázať hustotu, trenie, odskok, rýchlosť alebo gravitáciu, Newton3 toto všetko a ešte oveľa viac dokáže.  Ďalšia vec, ktorú môžete urobiť, je vytvoriť realistické spoje medzi objektmi, takže môžete ľahko vytvárať zložité pohyby. Po dokončení simulácie sa animácia znova vytvorí v After Effects so štandardnými kľúčovými snímkami, takže si môžete prispôsobiť načasovanie podľa svojich predstáv. Cena tohto pluginu je však pomerne vysoká.  5. Red Giant Trapcode ParticularAsi neexistuje zoznam najlepších pluginov pre After Effects, v ktorom by sa nenachádzal nejaký od Red Giant. A najväčším frajerom medzi ich After Effects pluginmi je určite Trapcode Particular. Plugin Red Giant Trapcode Particular funguje podobne a a podľa nás aj oveľa lepšie ako plugin Particular World od After Effects. Tento plugin je pravdepodobne jedným z najstarších doplnkov After Effects, ktorý zostal veľmi aktívny a efektívny, keď motion dizajnéri potrebujú animovať častice, ktoré môžu byť založené na rôznych vzoroch, tvaroch alebo veľkostiach. To je veľmi užitočné pri vytváraní prvkov počasia, ako je dážď, sneh, oblaky alebo dokonca dym. Plugin sa vo veľkom sa používa vo filmovom priemysle. Ďalšie informácie a vizuálny toho, čo je možné vytvoriť pomocou pluginu, nájdete vo videu nižšie. 6. Motion Boutique - PasticheTento plugin využijete vtedy, keď máte na časovej osi veľa malých vrstiev. Pastiche vám umožňuje presúvať, preskupovať a umiestňovať tieto vrstvy do jedného tvaru. Pastiche tiež poskytuje intuitívne ovládače na jemné doladenie polohy, mierky, rotácie a nepriehľadnosti vrstiev koláže. Stiahnite si skúšobnú verziu tohto pluginu a vyskúšajte pracovať s ním aspoň nejaký čas. Vyskúšajte tiež  skombinovať Pastiche s pluginom Newton3. 7. Video Copilot Element 3DĎalší úžasný plugin od spoločnosti VideoCopilot sa nazýva Element 3D. Umožňuje vám importovať 3D objekty do aktuálneho pluginu a animovať ich a textúrovať. Mnoho motion dizajnérov používa Element 3D na vytváranie krásnych filmových videí a výstupy vyzerajú veľmi profesionálne. Cena tohto pluginu je 189,95 USD cez Toolfarm. 8. DOF PROVývojár Richard Rosenman sprístupnil DOF PRO (Depth Of Field Generator PRO), svoj populárny doplnok na generovanie hĺbky poľa vo Photoshope, pre After Effects. Od svojho prvého vydania v roku 2005 sa DOF PRO stal profesionálnou voľbou v motion design odvetví. Najmodernejšie funkcie DOF PRO poskytujú inovatívne a špičkové technológie, ktoré inde nie sú dostupné, výsledkom čoho je jeden z najvýkonnejších a najpokročilejších procesorov hĺbky poľa. Medzi pokročilé funkcie patrí podpora chromatickej a achromatickej aberácie, diferenciácia bokehu ohniskovej roviny, astigmatizmus a efekty vinetácie, podpora vlastných máp clony a obnovenie hluku. K dispozícii je tiež plná podpora alfa kanála/priehľadnosti alebo podpora 32-bitových farieb. Cena pluginu je 199,99 USD. Ďalšie zaujímavé pluginyMedzi ďalšie veľmi zaujímavé pluginy, ktoré určite stoja za zmienku, patria Plexus 3, Boris Fx alebo Saber. Plexus 3 umožňuje používateľom spájať bodky/trojuholníky s čiarami a animovať ich v 3D priestore. Okrem toho vám Plexus 3 umožňuje vytvárať, manipulovať a vizualizovať dáta procedurálnym spôsobom. Zjednodušene to znamená, že častice môžu byť animované a môžu mať medzi sebou vzťah. Boris Fx má 3 hlavné pluginy: Sapphire, Mocha a Continuum. Všetky sú veľmi dobre známe v komerčnom a celovečernom filmovom priemysle. Ak máte chvíľu času, odporúčame pozrieť a vyskúšať skúšobnú verziu. Saber je mimoriadne výkonný nástroj na osvetlenie a efekty pre širokú škálu účelov. Nielenže sa dá použiť na vytváranie lúčov svetla (napríklad svetelné meče), ale prichádza aj so širokou škálou prednastavení a možnosťou pracovať s maskami vrstiev. ZáverDúfame, že ste sa dozvedeli niekoľko zaujímavostí a nových vecí o vyššie uvedených pluginoch pre After Effects. Poznáte a používate zaujímavé pluginy pre After Effects? Podeľte sa o ne v komentároch nižšie. 
Tipy a triky
02.11.2021
Skillmea tím

5 zdrojov pasívneho príjmu pre dizajnérov

V tomto článku ti ukážeme možnosti, ako zarábať viac a generovať pasívny príjem. Diverzifikácia zdrojov príjmu je dobrá stratégia. Dnes ti priblížime 5 spôsobov, vďaka ktorým môžeš ako kreatívec popri svojom hlavnom zamestnaní zarábať viac. Každý pasívny príjem zahŕňa úvodnú investíciu. Tou môže byť čas, námaha a úsilie, peniaze alebo kombinácia všetkých prvkov. Začnime pekne poporiadku. 1. Vytváraj a predávaj dizajnové templaty / šablónyJednou z najpopulárnejších stratégií pasívneho príjmu, ktorú dizajnéri radi využívajú, je predaj rôznych hotových dizajnových vzorov online. Ak o tom premýšľaš, veľa nedizajnérov alebo začínajúcich dizajnérov pravidelne hľadá hotové šablóny na rôzne využitie od social media, cez newslettre až po dizajn webstránok. Skús vytvárať šablóny, ktoré sú univerzálne a využiteľné širokospektrálne, napríklad: • vizitky, • rôzne mockupy, • dizajn webstránok s rôznym zameraním, • prezentácie, • fotografie a ilustrácie, • životopisy, • ďalšie. Templaty môžeš predávať na rôznych portáloch (marketplace) ako sú napríklad Shutterstock, Adobe Stock, iStock, ale aj Canva nedávno spustila svoj marketplace. 2. Zdieľaj svoje znalostiAko dizajnér máš určite mnoho vedomostí a skúseností, o ktoré sa môžeš podeliť. Určite budeš mať dobrý pocit, keď pomôžeš začínajúcim dizajnérom zdieľaním svojich cenných poznatkov a zároveň tým vieš zarobiť peniaze navyše. Ako zdieľať svoje znalosti? Môžeš zorganizovať workshop či školenie, napísať knihu (ebook), vytvoriť online kurz alebo mentorovať dizajnérov začiatočníkov. Samozrejme, budeš musieť investovať čas do prípravy a vytvoreniu týchto vzdelávacích zdrojov, ale keď ich sprístupníš, z dlhodobého hľadiska sa môžu stať zaujímavým zdrojom príjmu. 3. Predávaj vlastné nástroje a assetyMedzi tieto nástroje a assety môžeme zaradiť napríklad ilustrácie, PSD zdrojáky, fonty, textúry, gridy, UI kity a mnoho ďalšieho. Iní dizajnéri sa môžu zaujímať o tieto zdroje a budú ich chcieť použiť vo svojich vlastných dizajnových výtvoroch. Pre teba pôjde o ideálny pasívny príjem, nakoľko síce vynaložíš čas na vytvorenie digitálnych produktov, ale potom ich budeš predávať znovu a znovu. Začať je jednoduché, existuje viacero stránok, kde môžeš svoje diela predávať, napríklad Envato Market, Vecteezy, Creative Market a ďalšie. 4. Navrhuj a predávaj merchPredaj vlastného tovaru je zaujímavý zdroj príjmu najmä ak už máš dostatočne veľké publikum, ktoré ťa sleduje. Najskôr sa teda povenuj budovaniu svojho brandu a followerov. Predaj merchu je v súčasnosti pomerne jednoduchý, využi medzinárodnú službu ako Printify alebo lokálny GoMerch. Ak už máš veľa sledovateľov, za zváženie stojí aj rozbehnúť Patreon či iné formy monetizovania obsahu, napríklad cez affiliate marketing alebo rôzne referral programy. 5. Vytvor členskú webstránkuAk to s budovaním dlhodobého online podnikania myslíš vážne, skvelou možnosťou je vytvorenie členskej webovej stránky. Môže to byť výhodné najmä vtedy, ak už máš napríklad blog a hľadáš spôsob, ako ho speňažiť. Členská webstránka bude účtovať poplatok (zvyčajne je na mesačnej alebo ročnej báze) za prístup k prémiovému obsahu. Obsahom môžu byť čokoľvek od dizajnových návodov, zdroje na stiahnutie alebo iný zaujímavý obsah pre dizajnérov. Prípadne sa zameraj na úplne iný typ používateľov a ponúkni im pridanú hodnotu, za ktorú sú ochotní platiť. Nie je ľahké začať a chvíľu trvá, kým sa stránka rozbehne a vybuduješ ju, ale ak sa tomu budeš venovať dlhodobo, môže to byť skvelá voľba. Tipy na záverJe dobré vedieť, čo je tvojou motiváciou pri tvorbe týchto vedľajších projektov. Ak sú to len peniaze, pristupuj k tvorbe organizovanejšie a s obchodným myslením, vyber si vedľajší projekt s potenciálom tvorby príjmu.  Mysli aj na časovú stránku veci a snaž sa spraviť si realistický odhad času, ktorý môžeš vedľajším projektom venovať. Máš na to pár hodín každý týždeň, alebo je to skôr sporadický voľný čas? Pred začatím projektu je teda dobré zvážiť množstvo času, ktoré máš k dispozícii.  Určite ber do úvahy aj priebežné požiadavky, ktoré tiež môžu zhltnúť nejakú porciu času a námahy. Vo všeobecnosti by sa dalo povedať, že grafika, tlačoviny či e-knihy sú dobré pre dizajnérov, ktorí neočakávajú, že budú musieť investovať veľa času na priebežnú podporu a servis. A veci ako šablóny, pluginy, blogy, komunitné webové stránky alebo online kurzy majú síce potenciál vysokého príjmu, ale na druhej strane vyžadujú aj potrebu intenzívnejšej podpory.
Tipy a triky
11.03.2021
Ľudovít Nastišin

Zmena oblohy na fotkách vo Photoshope jediným klikom

Štandardný postup pri zmene oblohy na fotkách si vyžaduje istú zručnosť vo výberoch a maskovaní. Avšak s novým Photoshopom je na scéne aj veľmi zaujímavá funkcia, ktorá tieto časovo náročné postupy zlúčila v podstate do jediného kliknutia. Hovoríme o „Sky Replacement Tool“, ktorý nájdeme vo Photoshope 2021.  V tomto článku sa na túto funkciu pozrieme a ukážeme si to aj na príklade. Sky Replacement nájdeme v edit>Sky Replacement. Ihneď po otvorení tejto funkcie začne softvér automaticky analyzovať obrázok. Okamžite potom si sám vytvorí na danom obrázku masku oblohy a vymení ju za inú. Jediným klikom. Tento nástroj využíva Adobe Sensei (umelú inteligenciu spoločnosti Adobe). Je to niečo podobné ako funkcia „Select and Mask“, ktorá je v posledných verziách Photoshopu taktiež veľmi kvalitná. Asi to nebudeš využívať každý deň, no čas od času sa takáto úloha objaví. A vtedy je dobré o tomto nástroji vedieť, lebo si ušetríš čas. Nastavenie nástroja "Sky Replacement"Je to síce výmena oblohy na jeden klik, no väčšinou to treba trošku doladiť. Najprv si zvolíš obrázok oblohy z ponuky nástroja, ktoré sú v troch priečinkoch: Blue Skies, Spectacular a Sunsets. Máš samozrejme možnosť importovať si tam svoju vlastnú oblohu. Stačí kliknúť na ozubené koliesko v pravom hornom rohu a nájsť možnosť „Import Skies“ alebo cez ikonku + a nahrať si oblohu ako .jpeg súbor. Máme tu aj ďalšie nastavenie, o ktorých si treba niečo povedať. Shift Edge – cez tento slider si vieš doladiť okraje výberu a zbaviť sa tak prípadných nedotiahnutých miest, ktoré Photoshop až tak dobre nezvládol. Refine Edge Brush – pre prípad, že si tvoju pozornosť vyžaduje len nejaká malá časť výberu, máš k dispozícii aj známy nástroj z balíka „Select and mask“, ktorým tiež  vieš dotiahnuť prípadné nedokonalosti. Fade Edge – tento nástroj umožňuje vytvoriť jemnejší prechod pri horizonte obrázka. Photoshop ale väčšinou urobí robotu veľmi dobre a ďalšie úpravy okrajov nie sú zvlášť potrebné. Temperature, Brightness a Scale – tieto nástroje upravujú už samotnú oblohu. Väčšinou treba doldiť  je farebnosť, prípadne je príliš tmavá či svetlá. Alebo je nutné oblohu zväčšiť aby sedela s horizontom fotky. Všetko to sa dá upraviť v týchto Sky Adjustments  úpravách. Foreground Adjustments – máme možnosť doladiť farebne aj samotný obrázok mimo oblohy tak, aby sme celú kompozíciu čo najviac zjednotili. Keď si s výsledkom spokojný, je treba si ešte stanoviť, akým spôsobom sa má táto úprava aplikovať do obrázka. Je tu možnosť duplikovať vrstvu alebo output do nových vrstiev. Skvelé je, že tento nástroj je nedeštruktívny. Ak si vyberieš si vyberieš output do nových vrstiev, celá úprava sa zobrazí vo klasickej vrstve s maskou a spolu s adjustment vrstvami. Takto máš plnú kontrolu nad výsledkom a prípravu pre ďalšie modifikácie tejto kompozície. Sú však situácie, kedy ti Sky Replacement pomôže len čiastočne. Jednou z takých môže byť situácia, kedy sa snažíš vymeniť oblohu na obrázku s vodnou hladinou. A tá bude stále odrážať pôvodnú oblohu. V takom prípade bude potrebné tento odraz vyriešiť manuálne. Výhodou však je, že väčšinu potrebných masiek vrstiev už z tohto nástroja máš. Sky replacement tool je podľa nás skvelý nástroj a aj keď ho nebudeš používať každý deň, v tej pravej chvíli ti pomôže. Jeho ukážku si pozri aj na tomto videu, v ktorom sme sa pohrali so známou bratislavskou scenériou. Vymenili sme oblohu a odstránili všetky postavy. A všetko nám to zabralo len pár minút.
Tipy a triky
30.10.2019
Skillmea tím

Lambda výrazy v Jave - časť IV.

Funkcionálne rozhraniaAk chcem používať lambda výraz, tak potrebujem na to rozhranie s jednou abstraktnou metódou. Daná metóda musí odpovedať popisu nášho lambda výrazu. Ak sa nad tým zamyslíš, tak v skutočnosti sa dané rozhranie môže volať hocijako. Na názve nezáleží. A aj metóda v tom rozhraní môže mať hocijaký názov, pre logiku lambda výrazu to nemá žiaden zmysel. Jediné, čo je dôležité je, aby metóda sedela s lamba výrazom v tom, čo vracia a to, čo je na vstupe metódy ako parameter. Bolo by úplne super, keby sme nemuseli vždy pri písaní lambda výrazu riešiť vytvorenie nového rozhrania, ktoré nám bude slúžiť ako typ daného lambda výrazu. Čo povieš? Povedali sme, si, že java nevytvorila nový typ pre lambdy. Pri písaní, sme si mohli všimnúť, že metódy sú často podobné. Vraciam nejaký typ alebo vraciam void a mám tam názov metódy tam sú alebo nie sú parametre. Sú tu nejaké paterny, nejaké vzorce, ktoré sa opakujú častejšie. Java nám ponúka niekoľko takých rozhraní, ktoré môžeme kľudne použiť. Tieto rozhrania sú v balíčku java.util.function. V tomto balíku je mnoho pred pripravených rozhraní, ktoré môžeš používať. Tieto rozhrania používajú generiká, tak si tam vieš dosadiť objekty aké potrebuješ. Napríklad Predicate je presne stvorený na to, ak potrebujeme zobrať na vstupe objekt a vrátiť boolean ako návratovú hodnotu. Takto môžeme použiť toto rozhranie namiesto toho rozhrania, čo sme si sami napísali, keď sme riešili predchádzajúcu úlohu. Ako ošetriť výnimky Spravme si príklad, ktorý bude obsahovať zoznam osôb, ktoré budem spracovávať – vypíšeme ich mená a dáme ich na veľké písmená. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby); } private static void processOsoby(ArrayList<Osoba> osoby) { for (Osoba osoba : osoby){ System.out.println(osoba.getMeno().toUpperCase()); } } } Prepíšeme si to na lambda výraz. Náš kód, ktorý chceme metóde predať ako argument je System.out.println(osoba.getMeno().toUpperCase()). Pracujem teda len s objektom osoba. Výsledok napíšem na konzolu. Tým pádom mám jeden argument a tento kus kódu nevracia žiadnu hodnotu. Budeme na to potrebovať funkcionálne rozhranie, ktoré má metódu s jedným parametrom a nevracia nič. Takým je Consumer s jeho metódou accept. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } } Teraz si náš zoznam osôb zmením tak, že namiesto mien dám do zoznamu null. Pri spracúvaní lamba výrazu nám program spadne na NullPointerException. osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28));Musíme si ošetriť túto výnimku. Ako na to? Jedným zo spôsobov je obaliť volanie consumer.accept do try catch bloku. private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ try { consumer.accept(osoba); }catch (NullPointerException e){ //... } } }Ale to je škaredé riešenie. To čo príde do consumer môže byť všeličo možné a nemusí to dať NullPointerException, možno to bude iná výnimka. Náš kód chceme mať jednoduchší. Druhou možnosťou je, aby bola výnimka spracovaná priamo v lamba výraze. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, osoba -> { try { System.out.println(osoba.getMeno().toUpperCase()); }catch (NullPointerException e){ e.printStackTrace(); } }); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } }Dosiahol som to, že metóda processOsoby je krajšia, ale náš lambda výraz je teraz viacriadkový a nie pekný - jednoriadkový. Na jednej strane chceme mať pekné jednoduché lambda výrazy, na druhej strane chceme, aby bolo postarané o výnimky. V našom kóde sa vráťme k riešeniu, ktoré nepoužíva try catch blok. Na odchytenie výnimky použijeme wrapper metódu. Try catch blok si vyvedieme do osobitnej metódy a potom obalíme náš lambda výraz, ďalším lambda výrazom, ktorý má try catch blok. Urobme to, čo som teraz napísal. Vytvoríme si novú metódu, ktorá bude akceptovať lambda výraz. V našom prípade sme na to použili Consumer rozhranie. A keďže je to wrapper, tak to čo mi príde na vstup tak dám aj na výstup. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; }V metóde processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); zavolám namiesto lambda výrazu, wrapper metódu, ktorej argument bude lambda výraz. Urobí to to isté, ale použil som wrapper metódu. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, wrapperLambda(osoba -> System.out.println(osoba.getMeno().toUpperCase()))); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; } }Tu môžem spraviť nasledujúcu vec. Namiesto toho aby som lambdu prehnal cez wrapper metódu, tak ju ani nepoužijem, ale použjime len jej vstupný parameter, čo je osoba. Môžem spraviť niečo takéto: private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> System.out.println(osoba.getPriezvisko()); }Namiesto toho, aby som využil vstupnú lambdu, ktorá mi prišla cez parameter consumer, som na ňu zabudol a len som využil vstupný parameter danej lambdy a vytvoril som novú lambdu. Pri volaní consumer.accept(osoba); v metóde processOsoby sa vykoná lambda výraz z wrapper metódy. Toto nie je skutočný wrapper. Skutočný wrapper, zoberie vstupnú lambdu a vykoná čo požaduje. Teraz máme istotu, že sa zavolá presne náš požadovaný lambda výraz a zároveň môžeme pridávať kód okolo. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> consumer.accept(osoba); }Tu prichádza narad try catch blok v wrapper metóde. Upravíme si kód, aby nám hádzal výnimku. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, wrapperLambda(osoba -> System.out.println(osoba.getMeno().toUpperCase()))); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> { try{ consumer.accept(osoba); }catch (NullPointerException e){ System.out.println("Null pointer exception in wrapper lambda"); } }; } }Ak sa zastavuješ pri myšlienke, že sme nič nezjednodušili, len sme presunuli kód na iné miesto, tak máš pravdu, ale! Ak si danú metódu spravíš generickú, tak si do tejto metódy môžeš zabaliť hocijakú lambdu, ktorej typ je Consumer rozhranie. Škoda, že tvorcovia javy nespravili takéto wrapper metódy pre všetky funkcionálne rozhrania z balíku java.util.function. private static<T> Consumer<T> wrapperLambda(Consumer<T> consumer){ return osoba -> { try{ consumer.accept(osoba); }catch (NullPointerException e){ System.out.println("Null pointer exception in wrapper lambda"); } }; } Pokračovať s Lambda výrazmi budeme opäť v ďalšom článku. Moje meno je Jaro Beňo a naučím ťa programovať v Jave. Ahoj.
Tipy a triky
16.10.2019
Skillmea tím

Ako zistiť, či je číslo zadané zo vstupu prvočíslom?

V 15. kapitole online kurzu vyššieho programovacieho jazyka C++ úrovne Elementary II nájdete medzi zadaniami praktických príkladov na domáce precvičenie aj úlohu, v ktorej máte nájsť najväčší spoločný deliteľ dvoch čísel a taktiež úlohu, v ktorej máte nájsť najmenší spoločný násobok dvoch čísel alebo ich najväčší spoločný deliteľ. Ak siahnete do osnov matematiky druhého stupňa základnej školy niekde do 6. alebo 7. ročníka, zistíte, že kľúčom k vyriešeniu týchto dvoch úloh je rozklad obidvoch čísel na súčin prvočísel. Úlohy patria z hľadiska logiky a analytického myslenia medzi začiatočnícke. Napriek tomu viem, že sú náročnejšie. Práve preto som sa rozhodol napísať tento blog. V tomto blogu nechcem riešiť túto úlohu za vás, ale aspoň by som vám rád podal návod, ako zistiť, či je načítané číslo zo vstupu prvočíslom. Táto úloha je jedna z čiastkových úloh, ktoré je potrebné riešiť pri dvoch spomenutých príkladoch, ktorých riešenie ste dostali za úlohu nájsť. Tí, ktorí zabudli, čo je prvočíslo, ozrejmím aj tento pojem. Prvočíslo je celé kladné číslo, ktoré je deliteľné len jednotkou a svojou vlastnou hodnotou. Budeme sa teda pohybovať iba v množine kladných celých čísel. Príkladom prvočísla môže byť napr. číslo 5, pretože je deliteľné len číslom 1 a 5. ďalšími príkladmi sú 2, 3, 7, 11, 13, 17 atď. Samotné číslo 1 sa za prvočíslo nepovažuje. Povedzme, že máme číslo 60, jeho rozklad na súčin prvočísel je 2 x 2 x 3 x 5. Už z rozkladu je zrejmé, že ho môžeme vynásobiť číslom 1, nič by to totiž nezmenilo na výsledku, stále by ste dostali číslo 60. Vidíte, a práve preto sa matematici dohodli, že 1 prvočíslom nebude, nemá totiž už žiadny vplyv v súčine prvočísel, ktorého výsledkom je nejaké číslo. Takže bez zbytočných ďalších prázdnych fráz prejdem rovno k veci. Nasleduje teda zdrojový kód v jazyku C++, ktorý rieši titulok tohto blogu: 01: #include <iostream> 02: using namespace std; 03: 04: int main() 05: { 06: int iNumb; 07: 08: cout << "Zadaj lubovolne cele kladne cislo: "; 09: cin >> iNumb; 10: cout << endl; 11: 12: bool flag = true; 13: 14: if (iNumb == 1) 15: { 16: flag = false; 17: } 18: else 19: { 20: for (int i = 2; i <= iNumb / 2; i++) 21: { 22: if (iNumb % i == 0) 23: { 24: flag = false; 25: break; 26: } 27: } 28: } 29: 30: if (flag) 31: { 32: cout << "Cislo " << iNumb << " je prvocislo !" << endl; 33: } 34: else 35: { 36: cout << "Cislo " << iNumb << " nie je prvocislo !" << endl; 37: } 38: 39: cout << endl; 40: 41: cin.get(); 42: cin.get(); 43: 44: return 0; 45: } Na riadku 01 je uvedená direktíva preprocesora #include, ktorej parametrom je štandardná knižnica iostream. Potrebujeme ju z dôvodu používania objektov cout, cin a manipulátora endl. Na riadku 02 uvádzame do platnosti menný priestor std pre celý zdrojový súbor .cpp. Spomenuté objekty cout, cin a manipulátor endl je zároveň súčasťou tohto priestoru. Na riadku 04 je uvedená funkcia main aj so svojim návratovým typom, ktorým je int (integer). Túto funkciu volá operačný systém. Na riadku 05 je uvedená ľavá programová zátvorka, ktorou sa začína telo funkcie main. Na riadku 06 je deklarovaná premenná iNumb na údajový typ int. Táto premenná reprezentuje hodnotu celého kladného čísla, o ktorom chceme zistiť, či patrí medzi prvočísla. Na riadku 08 je pomocou objektu cout zapísaný na výstup konzolovej aplikácie textový reťazec, ktorý vyzve používateľa na zadanie hodnoty kladného celého čísla, ktorého vlastnosť prvočísla testujeme. Na riadku 09 je prostredníctvom objektu cin načítaná táto hodnota do premennej iNumb. Na riadku 10 je prostredníctvom objektu cout a manipulátora endl presunutý kurzor konzolovej aplikácie na ďalší riadok. Na riadku 12 je deklarovaná premenná flag a zároveň inicializovaná na hodnotu true. Táto premenná nám bude po otestovaní načítaného čísla ukladať informáciu, či je číslo prvočíslom alebo nie. Z hľadiska logiky algoritmu je nutné premennú flag inicializovať pred testovaním na hodnotu true. Algoritmom budeme totiž testovať, či načítané číslo medzi prvočísla nepatrí. Používa sa tu teda postup vylučovací. Na riadku 14 je testovaná podmienka, či v premennej iNumb nie je hodnota 1. Ak áno, program pokračuje kladnou vetvou a do premennej flag sa na riadku 16 zapíše hodnota false, ktorá reprezentuje stav, kedy načítané číslo prvočíslom nie je. Na riadku 13 a 15 sú len uvedené programové zátvorky, ktoré uzatvárajú blok kódu uvedený v kladnej vetve. Ak spomínaná podmienka splnená nie je, pokračuje sa zápornou vetvou. Blok kódu v zápornej vetve uzatvorený programovými zátvorkami na riadkoch 19 a 29. Na riadku 20 až 27 je uvedené jadro algoritmu, ktorý testuje vlastnosť prvočísla u čísel väčších ako 1. A v čom spočíva idea jadra algoritmu ? V každej iterácii cyklu zisťujeme, či je číslo deliteľné hodnotou v premennej i. Najmenšie číslo, ktorým môže byť načítané testované deliteľné, je číslo 2 (viď. riadok 20 – for slučka) a preto iterujeme od tejto hodnoty. Premennú i postupne inkrementujeme (viď. riadok 20 – for slučka) a testujeme, či je hodnota premennej iNumb deliteľná bez zvyšku pomocou operácie modulo na riadku 22, ktorá je umiestnená v príkaze if. Ak je číslo deliteľné hodnotou v premennej i bez zvyšku, tak sa na riadku 24 uloží do premennej flag hodnota false, čo reprezentuje stav, kedy načítané číslo nie je prvočíslom. Premenná i sa inkrementuje po iNumb / 2 (viď. riadok 20 – for slučka). Dôvodom je fakt, že žiadne celé kladné číslo nemôže byť predsa deliteľné bez zvyšku číslom väčším ako je jeho polovica. Ak sa teda nenájde číslo, ktorým je načítaná hodnota testovaného čísla deliteľná bez zvyšku, neuloží sa do premennej flag hodnota false, čiže po ukončení v nej bude uložená hodnota true, čo reprezentuje stav, kedy je načítané testované číslo prvočíslom. Na riadku 25 je uvedené kľúčové slovo break a to z toho dôvodu, že v prípade nájdenia jedného čísla, ktoré delí načítané testované číslo bez zvyšku, nie je nutné hľadať ďalšie delitele. Testované číslo už prvočíslo totiž byť nemôže a preto násilne ukončíme slučku for, urýchlime program, ktorý následne prejde až na riadok 30. Tu sa už len testuje hodnota v premennej flag. Ak je v tejto premennej uložená hodnota true, tak sa zapíše na výstup konzolovej aplikácie pomocou objektu cout informácia o tom, že je načítané testované číslo prvočíslom (viď. riadok 32), ak false tak informácia, že prvočíslom nie je. Na riadku 41 a 42 je už len načítavaný vstup z konzolovej aplikácie pomocou objektu cin, čo slúži na to, aby sa hneď program neukončil a bol zobrazený výsledok v okne konzole, pokým používateľ nezatlačí ľubovoľná kláves. Na riadku 44 vracia funkcia main operačnému systému hodnotu 0, ktorá indikuje stav správneho ukončenia aplikácie. Na riadku 45 je ukončené telo programu pravou programovou zátvorkou. Algoritmus, ktorý som navrhol a implementoval v jazyku C++ nie je ešte optimálny. Je však pre účely kurzu úrovne začiatočník postačujúci. Medzi prvočíslami sa dajú ešte sledovať určité vlastnosti, nebudem ich však tomto bloku spomínať, aby som príliš poslucháča úrovne začiatočník zbytočne nadmerne nezaťažil. Optimálny algoritmus však budem ešte publikovať a rozoberať v ďalšom bloku a v kurze, ktorý bude zameraný aj na matematiku. Autorom blogu je Marek Šurka, lektor online kurzov jazyka C++ na Learn2Code
Tipy a triky
03.10.2019
Skillmea tím

Lambda výrazy v Jave - časť III.

Lambda a vnútorné anonymné triedyVeľmi sa nám žiada povedať, že lambda výrazy sú len skratky ako napísať vnútorné anonymné triedy. Ale pamätaj si, nie je to tak. Vyzerá to podobne ale lambda nie je implementácia rozhrania. Lambda je sama osobe nezávislá iná vec. Pozrime sa na príklad. Namiesto toho aby sme použili implementačnú triedu nášho rozhrania IHelloWord, vytvoríme si vnútornú anonymnú triedu. IHelloWord helloWord3 = new IHelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } };Všetky 3 možnosti, ktoré majú ako návratovú hodnotu rozhranie IHelloWord môžeme podsunúť do metody printHelloWord(IHelloWord helloWord). helloWord.printHelloWord(helloWord1); helloWord.printHelloWord(helloWord2); helloWord.printHelloWord(helloWord3);Ako to, ako to? Ako java vie, aký má použiť typ pre lamba výraz? Aby sme tomu porozumeli, vytvoríme si novú triedu, kde budeme pracovať s lambda výrazom. Vytvorme si rozhranie, ktoré bude mať jednu metódu, ktorá bude vracať int a na vstupe bude tiež int. interface Nasob{ int nasob(int a); } Ako by vyerala implementácia tohto rozhrania? class NasobPiatimi implements Nasob{ public int nasob(int a){ return a*5; } }Teraz si navrhnime lambda výraz, ktorý zodpovedá danej metóde. Nepotrebujeme návratovú hodnotu int, lebo java vie na ňu prísť sama a nepotrebujeme ani názov metódy a ani modifikátor prístupu public. Náš lambda výraz bude vyzerať takto: (int a) -> a*5;Teraz použime tento lambda výraz: public static void main(String[] args) { Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10)); }Na výstupe bude 50. V tomto príklade sa lambda tvári ako instancia rozhrania Nasob. V predchádzajúcich príkladoch, keď sme používali HelloWord sme takúto premennú vkladali ako parameter metódy printHelloWord (HelloWord3 v IDEi). Namiesto toho sme mohli túto lambdu vložiť priamo do metódy. helloWord.printHelloWord(() -> System.out.println("HelloWord impls lambda"););Java kompilátor vezme tento lambda výraz a pozrie sa kam ide. Ide to metódy printHelloWord a pozrie sa, čo akceptuje na vstupe. Akceptuje rozhranie HelloWord. Ak lambda sedí s požiadavkou, že dané rozhranie obsahuje len jednu metódu a tá vracia void a na vstupe nemá žiaden parameter, tak java povie, že daná lambda je typu HelloWord. Toto sa volá Type inference. Java si sama zistí typ. Teraz, keď vieš ako java dokáže zistiť typy, vrátime sa ku príkladu, ktorý sme začali písať v tejto kapitole. V našom príklade vieme ešte viacej skrátiť zápis nášho lambda výrazu. Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10));Keďže naša lamba ide do metódy rozhrania, ktorú poznáme interface Nasob{ int nasob(int a); } Tak vieme presne povedať aký typ má vstupný paramter metódy. Je to int. interface Nasob{ int nasob(int a); }Keď to vieme, tak nemusíme pri písaní lambda výrazu znovu špecifikovať typ vstupného parametru. Nasob nasobPiatimi = (a) -> a*5;A keďže máme len jeden parameter, nemusíme písať ani zátvorky. Nasob nasobPiatimi = a -> a*5; Už nebudeme nič mazať, lebo by nám už nič neostalo 😃 Teraz môžeme napísať metódu, ktorá bude na vstupe očakávať rozhranie Nasob a keď ju použijeme, tak do nej vložíme na vstup náš lambda výraz. public static void printNasob(Nasob nasob){ System.out.println(nasob.nasob(10)); } public static void main(String[] args) { printNasob(a -> a*5); }V jave mohli kľudne vytvoriť nový typ pre tieto lambda výrazy. Ale nespravili to a jedným z dôvodov je aj spätná kompatibilita so starším kódom. Ako už vieme, tak lambda výrazy môžeme použiť všade tam, kde máme vyhovujúce rozhranie. Vo vnútorných anonymných triedach, v metódach kde je na vstupe interface a podobne. Príklad: HelloWord helloWord3 = new HelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } }; HelloWord helloWord3 = () -> System.out.println("HelloWord impls inner anonymous class");Pri tomto musíme pamätať, aby rozhrania boli jedno metódové alebo aby ostatné metódy rozhrania boli default. A dané metódy v rozhraniach, aby sa zhodovali s lambda výrazom. Takéto rozhranie s jednou abstraktnou metódou (metóda, ktorá poskytuje opis nie implemntáciu) sa nazýva Functional interface. Predstav si, že používaš rozhranie, ktorý má len jednu metódu a používaš ho pre lambda výrazy. Teraz by niekto cudzí prišiel a do tohto rozhrania by pridal ďalšiu abstraktnú metódu, presnejšie jej opis bez implementácie. Takéto rozhranie by už viac nebolo functional interface a preto by sa nemohlo použiť pre lambda výraz a nastala by chyba – napriek tomu, že rozhranie by bolo v poriadku. Treba na to myslieť a ak chceme niečo pridať do functional interfac, tak len ako default metódy. Aby sme upozornili kohokoľvek, kto by chcel niečo pridať do nášho rozhrania, tak máme možnosť pridať anotáciu @FunctionalInterface. K anotáciam sa ešte dostaneme, tak sa nebojte. Teraz je dôležité vedieť, že je to pomôcka – táto pomôcka nám spraví to, že hneď ako napíšeme ďalšiu metódu do nášho rozhrania, tak nastane chyba. Danú anotáciu nemusíme písať, ale je to super. @FunctionalInterface public interface HelloWord { void sayHello(); }Príklady na vyskúšanie: 1. vytvor si zoznam miest 2. zotrieď zoznam 3. napíš metódu, ktorá vypíše všetko zo zoznamu miest 4. urob si metódu, ktorá vypíše len tie mestá, ktoré sa skladajú z jedného slova nepoužívaj pri tom lambda výrazy Pokračovanie nabudúce 👋 Články a online kurzy o Jave pre teba pripravuje Jaro Beňo.
Tipy a triky
23.08.2019
Skillmea tím

Lambda výrazy v Jave - časť II.

Typy lambda výrazovTento článok je pokračovaním prvej časti tutoriálu o Lambda výrazoch. Vráťme sa k nášmu príkladu na začiatku, kde sme do metódy vložili implementáciu rozhrania a zavolali sme metódu. Toto si teraz skúsime spolu prerobiť, tak aby sme použili lamba výraz.  HelloWord2. Prepíšme metódu implementácie na lambda výraz. public void sayHello() { System.out.println("HelloWord impls"); } () -> System.out.println("HelloWord impls"); Znovu tá istá otázka, aký typ má lamba výraz ak ho chcem priradiť do premennej? lambdaFunkcia = () -> System.out.println("HelloWord impls");Počkať! V Jave predsa máme možnosť ako deklarovať, vymenúvať metódy a tú použijeme. Tou možnosťou je použiť rozhrania. 1. vytvorenie rozhrania s jednou deklaráciou metódy 2. vytvorenie metódy, ktorá odpovedá našemu lambda výrazu 1. v našom prípade nemá žiadne argumenty a návratová hodnota je void Ak by sme vytvorili rozhranie, kde budeme uvádzať viacero metód, tak to bude chyba. Jedine ak budú default – teda implementované. Viď sekciu o rozhraniach. ILambda lambdaFunkcia = () -> System.out.println("HelloWord impls"); … public interface ILambda { void metoda(); // void metoda2(String s); // bude error }Použime lambda výraz s bezpečným delením. Napíšme si k tomu interface a premennú: bezpecneDelenieFunkcia = (int a, int b) -> { if(b==0) { return 0 ; } return a/b; }; public static void main(String[] args) { Hocijako hocijako = (int a, int b) -> { if(b==0){ return 0; } return a/b; }; double d = hocijako.hocico(10, 2); System.out.println(d); } interface Hocijako{ double hocico(int x, int y); }Tu si môžeme povedať, že názov rozhrania a názov metódy v rozhraní nie je dôležitý. Dôležité je, aby sedeli vlastnosti. Teda rozhranie má len jednu metódu (mimo default metód) a metóde sedí typ návratovej hodnoty a parametre metódy. Implemetačnú triedu už teda nepotrebujeme, lebo akoby implementáciou je lambda výraz. Môžem si to nechať, ak to potrebujem takto používať, ale v našom prípade nepotrebujem implementačnú triedu. Lambda výraz sa správa ako implemtnácia rozhrania. Ale nie je to implementácia. Tento príklad bude fungovať: HelloWord3 helloWord = new HelloWord3(); IHelloWord helloWord1 = new HelloWordImpl(); IHelloWord helloWord2 = () -> System.out.println("HelloWord impls lambda"); helloWord1.sayHello(); helloWord2.sayHello();Na výstupe bude: HelloWord impls HelloWord impls lambda Pokračovanie nabudúce 😗 Mrkni zatiaľ moje kurzy o Java programovaní alebo videá, ktoré máme na Youtube o Lambda výrazoch: https://www.youtube.com/watch?v=tzSFOgnDZZo&list=PL5dKLQR6-HyU7jyoTuZGFmPLAEFpIumi4
Tipy a triky
04.08.2019
Skillmea tím

Tipy, triky a chyby v jazyku C++ pre začiatočníkov

Týmto článkom by som vám chcel predstaviť zaujímavé tipy a triky v jazyku C++, ktoré by ste mohli použiť vo vašom kóde. Sú veľmi jednoduché, pretože sú určené pre začiatočníkov. Navyše by som vás chcel upozorniť na niektoré často sa opakujúce chyby, ktoré sa vo vašom kóde môžu na začiatku vyskytovať. Nejedná sa o chybu v pravom zmysle slova, teda nie takú, po ktorej by bol váš kód nepreložiteľný, skôr sa jedná o obrúsenie vášho programátorského štýlu, či vytvorenie takého kódu, ktorý bude rýchlo vykonávaný. Poslednú spomínanú vlastnosť dosiahnete s C++ ľahko, pretože kódy, ktoré navrhnete v C++ sa vykonajú oveľa rýchlejšie ako tie, ktoré navrhnete v iných jazykoch. Viem programovať vo viacerých jazykoch a preto to mám skutočne odskúšané. Pamätajte, že C++ to však nevykoná za vás, pretože aj tam sa dá vytvoriť veľmi špatný kód. Zámerne so použil termín špatný, hoci nie je odborný. Myslím tým kód, v ktorom zlým štýlom a technikou nedosiahnete požiadavky, ktoré sa na kód kladú. Príkladom môže byť práve rýchlosť vykonávania spustiteľného kódu, jeho prehľadnosť, či ľahká udržiavateľnosť. V nasledujúcich riadkoch vám to na pár príkladoch ozrejmím. Príklady tipov, trikov a chýbUrčite ste sa už v programovaní pokúšali naprogramovať jednoduché matematické operácie. Majme teda nasledovný kód: #include <iostream> int main() { int a; int b = -1; int c; int d = 4; int e = 2; int f = 3; int g; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Najprv by som sa vás chcel spýtať, či sa vám takto napísaný kód na prvý pohľad páči. Myslím tým po koncepčnej stránke. Prvou chybou je, že začínajúci programátori neodsadzujú bloky kódu. Tak napríklad tento kód by sa dal pekne odsadiť pomocou nasledujúcich pravidiel. Oddeľte direktívy preprocesora od hlavičky funkcii main(). Oddeľte deklarácie a definície premenných od zvyšku kódu. Niekedy, keď budete používať veľa premenných, môžete aj jednotlivé deklarácie premenných usporiadať do logických celkov. Môžete vytvoriť bloky kódu podľa typu premennej. Navyše, jazyk C++ vám umožňuje deklarovať a inicializovať premennú namieste, kde to skutočne potrebujete, čiže predtým, ako ju použijete. Ďalej, v tomto kóde oddeľte nosnú časť kódu a to vytvorte blok kódu, kde sa vykonávajú jednotlivé matematické operácie. Nakoniec, oddeľte zápis na obrazovku a tiež načítanie zo vstupu klávesnice. Potom už len oddelíte kľúčové slovo return s jeho návratovou hodnotou. Po spomenutých úpravách vám vznikne čitateľný kód, ktorý vyzerá nasledovne: #include <iostream> int main() { int a; int b = -1; int c; int d = 4; int e = 2; int f = 3; int g; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Keď sa ďalej pozrieme na kód, môžeme niektoré deklarácie umiestniť na jeden riadok. Konkrétne prevedenie nechám na vás, ale ja by som odporúčal deklarovať na jednom riadku premenné, ktoré sa neinicializujú hneď na začiatku súčasne s deklaráciou. Na druhý riadok by som umiestnil premenné, ktoré sa inicializujú súčasne s deklaráciou. Takto získate ešte väčší prehľad v kóde a ušetríte 4 riadky kódu. Kód bude vyzerať nasledovne: #include <iostream> int main() { int a, c, g; int b = -1, d = 4, e = 2, f = 3; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Teraz prejdeme k spomínanej rýchlosti. Je mi jasné, že pri tak krátkom kóde ušetríme relatívne málo času, ale keby sa nosná časť kódu, čiže tri matematické operácie s priraďovaním, vykonávali v cykle napr. 1 000 000 krát, videli by ste zaručene rozdiel. V uvedenom príklade nie je nutné použiť 7 premenných a výsledok vyhodnocovať na trikrát. Výsledky  b + c a  e - f  sa vynásobia a priradia do ďalšej premennej. Tak, ako to je naprogramované, je to zbytočné. Skúste všetko vyhodnotiť ako jeden výraz a priradiť na jednom riadku. Vznikne nám kód, ktorý bude mať o dva riadky menej a bude vykonávať to isté. A v čom je vlastne problém. No v operátore priradenia. Táto operácia je príliš časovo náročná. V podstate sa musí presunúť hodnota premennej uložená na jednom pamäťovom mieste do pamäťového miesta, ktoré je určené pre inú premennú. A po kurze už viete, že počítač pozná len 0 a 1. Organizačne existuje najmenej jeden bajt. Nespomínal som síce, čo je zásobník, ale keď sa pohybujeme v jeho pamäti, trvá to ešte dlhšie. Vráťme sa ale späť, po úprave bude kód vyzerať nasledovne: #include <iostream> int main() { int g; int b = -1, d = 4, e = 2, f = 3; g = (b + c) * (e - f); std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }A poďme ešte ďalej. Na čo vôbec v tomto kóde používame premenné, keď ich nenačítavame s vstupu. Výsledok kombinácie matematických operácií môžeme predsa zapísať rovno na obrazovku, bez toho, aby sme hodnoty priraďovali do premenných. Odstránime tým aj deklarácie. Po konečnej úprave, bude kód vyzerať nasledovne: #include <iostream> int main() { std::cout << "res = " << (-1 + 4) * (2 - 3) << std::endl; std::cin.get(); std::cin.get(); return 0; }Záverom by som teda znovu chcel zdôrazniť, aké sú programátorský štýl a technika dôležité. Vidíte, že z 18 riadkového kódu, ktorý sme získali odsadením pôvodného kódu, nám po niekoľkých úpravách zostal kód, ktorý má 8 riadkov.  A tento kód, hoci je malý, je laicky povedané, pekný. To znamená, že sa jeho spustiteľný kód vykoná rýchlo, je prehľadný a ľahko udržiavateľný. Autorom blogu je Marek Šurka, ktorý má na Learn2Code online kurz C++ pre začiatočníkov.