Tipy a triky

V tejto sekcii nájdete praktické rady a odporúčania, ako efektívne využívať kurzy cez úrad práce na získanie nových zručností. Tipy a triky sú navrhnuté tak, aby vám pomohli zvládnuť bežné úlohy rýchlejšie a efektívnejšie. Táto kategória je skvelým miestom pre tých, ktorí hľadajú spôsob, ako sa neustále zlepšovať.

8 najlepších pluginov pre After Effects
Tipy a triky
07.03.2022
Skillmea

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.[Image] 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.[Image] 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. 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áver Dú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. 
5 zdrojov pasívneho príjmu pre dizajnérov
Tipy a triky
02.11.2021
Skillmea

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.[Image] 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.[Image] 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.[Image] 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.[Image] 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.[Image] 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.
Zmena oblohy na fotkách vo Photoshope jediným klikom
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.[Image] 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. [Image]  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.[Image] 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. 
Lambda výrazy v Jave - časť IV.
Tipy a triky
30.10.2019
Skillmea

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.
Ako zistiť, či je číslo zadané zo vstupu prvočíslom?
Tipy a triky
16.10.2019
Skillmea

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
Lambda výrazy v Jave - časť III.
Tipy a triky
03.10.2019
Skillmea

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.
Lambda výrazy v Jave - časť II.
Tipy a triky
23.08.2019
Skillmea

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, triky a chyby v jazyku C++ pre začiatočníkov
Tipy a triky
04.08.2019
Skillmea

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.
Lambda výrazy v Jave - časť I.
Tipy a triky
21.07.2019
Skillmea

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

V tomto a v nasledujúcich článkoch sa pozrieme na zúbok lambda výrazom. Budeme si ich vysvetľovať úplne dopodrobna, aby sme ich pochopili a využívali. Obsahovo sa zameriame na tieto oblasti: 1. porozumenie lambda výrazom, 2. použitie lambda výrazov, 3. funkcionálne rozhrania (functional intefaces), 4. referencie metód (method references), 5. vylepšenia na kolekciách. Prečo použiť lambda výrazy? Povieme si pár odrážok, prečo ich používať.  • povoľuje použiť takzvané funkcionálne programovanie, čo je doteraz niečo, povedal by som čudné, keďže Java je objektovo orientovaný jazyk, • sprehľadňujú kód, lepšia čitateľnosť v niektorých prípadoch, kde by sme použili viacero zbytočných riadkov, aby sme napísali to isté. Možno sa zamýšľaš, prečo používať funkcionálne programovanie v jazyku, ktorý je objektovo orientovaný. Už nie je OOP tak dobré? Už zanikne? Nie, nezanikne a java je a myslím si, že stále bude objektovo orientovaný jazyk. Toto funkcionálne programovanie ber len ako ďalší nástroj, ktorý ako vývojár máš vo svojej ruke.  Pri OOP sú vývojári zvyknutí rozmýšľať v podstatných menách, v objektoch, v triedach. Napríklad Pes šteká. Štekanie je súčasťou Psa. Tým pádom metóda, ktorá bude zabezpečovať psie štekanie, je súčasťou triedy Pes.  Niekedy ale potrebujem kus kódu, metódu – alebo inak povedané funkciu, ktorá nepatrí do žiadnej triedy špeciálne.  Podsunutie chovania do metódyUvažuj nad tým, že máš metódu, ktorá na konzolu vypíše nejaký text. Napríklad staré známe Hello World. Pre tento účel by sme si vytvorili triedu, ktorej by bola metóda na vypísanie Hello Word. Túto metódu by sme potom vypísali na konzolu v main metóde. Príklad v idea Lambda2.  Našou úlohou bude teraz prerobiť tento kód tak, aby som danej metóde podsunul správanie a vo vnútri tej metódy sa len vykoná to správanie. Ukážme si na príklade.  Takže sme spravili, čo sme chceli. Do metódy sme podsunuli správanie ako argument a potom sme ho vykonali.  Ale nie tak presne. Do metódy sme podsunuli niečo, čo má v sebe správanie. Podsunuli sme implementáciu rozhrania, ktorá má v sebe metódu, ktorá vykoná očakávané správanie sa.  Práve tomuto chcú lambda výrazy zabrániť. Chcú zabrániť tomu, aby sme podsúvali objekty, ale chcú, aby sme podsúvali funkcie.  Namiesto tohto:  public void printHelloWord(IHelloWord helloWord){ helloWord.sayHello(); } chceme do metódy vložiť nejakú akciu, nejakú funkciu. Tento prístup umožňuje správať sa k funkciám ako k hodnotám. public void printHelloWord(funkcia){ funkcia(); } Ak napíšem String meno = “Jaro”;  tak som hodnotu Jaro pridelil do premennej meno. Teraz sme ale načrtli, že do nejakej premennej by sme chceli vložiť blok kódu, ktorý prezentuje našu funkciu. Takže blok kód by sa stal hodnotou a tá by sa dala vložiť do premennej. Takže tam, kde používam danú premennú, tak tam používam aj danú funkciu, ktorá je v nej.   Pre predstavivosť, chceme dosiahnuť toto:  premennaSFunkciou = public void sayHello() { System.out.println("HelloWord impls"); } Toto je možné pomocou lambda výrazov. Najprv sa ale pozrime na tento kus kódu a povedzme si, čo nepotrebujeme: • public – označuje mi, či je niečo verejne dostupné mimo triedy, dáva zmysel v kontexte triedy, tu ale prideľujeme do premennej, tak to nepotrebujeme, lebo funkcia je dostupná tomu, kto pracuje s danou premennou. premennaSFunkciou = void sayHello() { System.out.println("HelloWord impls"); } • názov sayHello = ak pristupujeme k hodnote, ktorá je v premennej, tak ku nej pristupujme názvom premennej, v našom prípade je názov premennej premennaSFunkcou, takže ani druhé meno nepotrebujeme. premennaSFunkciou = void () { System.out.println("HelloWord impls"); } • typ návratovej hodnoty – pri písaní lambda výrazov nemusím písať, aký je návratový typ, prekladač vie, podľa vnútra metódy, čo sa vracia. premennaSFunkciou = () { System.out.println("HelloWord impls"); } Toto ale ešte nie je labmda výraz. Ak napíšem šípku (pomlčka - a znamienko väčšie >) medzi zátvorky a blok kódu, tak vtedy sme vytvorili labmda výraz.  premennaSFunkciou = () -> { System.out.println("HelloWord impls"); } Ak metóda obsahuje len jeden riadok, teda nie viac riadkov, tak je možné ďalej upraviť tento výraz a to tak, že odstránime zložené zátvorky. Ak je viac riadkov, tak zložené zátvorky ponecháme.  premennaSFunkciou = () -> System.out.println("HelloWord impls"); Teraz si už vieme predstaviť, spraviť, to, že pošleme funkciu ako parameter metódy a vo vnútri spustíme danú funkciu.  public void printHelloWord(------){ -----(); }Do metódy môžeme vložiť ako argument pri volaní metódy priamo lambda výraz.  printHelloWord(() -> System.out.println("HelloWord impls")){ PríkladyNapíš metódu, ktorá zoberie ako parameter číslo a vynásobí ho 5timi. nasobokPiatichFunkcia = public int nasobokPiatich(int i){ return i*5; }Prepíšeme to na lambda výraz, vyškrtám všetko, čo nepotrebujem. Teda názov, návratovú hodnotu a modifikátor prístupu.  nasobokPiatichFunkcia = (int i){ return i*5; }Napíšeme tam šípku a keďže riadok je tam len jeden, tak vieme odmazať kučeravé zátvorky.  nasobokPiatichFunkcia = (int i) -> return i*5;Tu máme ďalšiu pomôcku, alebo možnosť škrtať. Keďže java kompilátor pozná vnútro metódy a vie, čo má vrátiť, môžem vymazať aj return.  nasobokPiatichFunkcia = (int i) -> i*5;Keď máme jednoriadkový lambda výraz bez zložených zátvoriek, tak je nevyhnuté nepoužívať return.  SčítaniescitanieFunkcia = (int a, int b) -> a+b;  OdčítanieodcitanieFunkcia = (int a, int b) -> a-b; Bezpečné deleniebezpecneDelenieFunkcia = (int a, int b) -> { if(b==0) { return 0 ; } return a/b; };Spojenie reťazcovstringJoin = (String x, String y) -> x.concat(y);  Stále sme v Jave. Teda v typovom jazyku. Aké sú typy týchto premenných, ktoré v sebe držia lambda výrazy?  Video:Ak ťa viac baví počúvať a pozerať, tak si môžeš pozrieť sériu videí o lambda výrazoch v kurze Java pre pokročilých.  ZáverAk by si sa chcel dozvedieť o Jave viac alebo si nepochopil všetko, tak som aj pre teba pripravil online kurzy o Jave na https://skillmea.sk. Ak sa chceš o mne dozvedieť viac, tak klikaj na jaroslavbeno.sk alebo ma sleduj na sociálnych sieťach – youtube, facebook, instagram, linkedin.  Zakomponujem aj malú reklamu. V spolupráci s tvorcami stoličky Neseda.com ti ponúkam s kódom/kupónom JaroslavBeno 10% zľavu (aplikovateľná aj na zľavnenú stoličku).  Ja som Jaro a my sa vidíme, počujeme ak Boh dá nabudúce.  Čaves.
Tipy, ako ušetriť čas pri práci v Sketchi, Photoshope, Illustratore a InDesigne
Tipy a triky
19.06.2019
Katarína Kučáková

Tipy, ako ušetriť čas pri práci v Sketchi, Photoshope, Illustratore a InDesigne

Práca v grafických programoch sa niekedy podobá na cirkusový chaos. Ikonky, záložky, nekonečný počet nástrojov, pluginov. Vieme, je ťažké sa v tom zorientovať. Preto sme pre teba v spolupráci s lektormi vybrali tipy, ktoré aj nám zjednodušujú život a hlavne šetria čas. Konkrétne sa pozrieme na programy Sketch, Adobe Photoshop, Illustrator a inDesign.  Sketch Sketch je profesionálny ilustračný program pre prácu s vektorovou grafikou, ktorý je dostupný pre užívateľov Mac OS X. Sketch je intuitívny a užívateľsky nenáročný, jeho zvládnutie na profi úrovni však spočíva najmä v malých trikoch. Tu sú niektoré z nich. [Image] • Rotate copies (rotovanie kópií)                                                                                                       Nástroj Rotate Copies ti umožní rotovať kópie určitej vrstvy okolo konkrétneho bodu. Vezmi si napríklad kvet. Stačí vytvoriť jeden lupeň a desiatky jeho kópií môžeš rotovať okolo stredu. Voilá. Tento nástroj sa štandardne nenachádza v paneli nástrojov, ale môžeš si ho pridať cez control-click a “Customize toolbar”, prípadne v menu cez Layer > Path > Rotate Copies. • Convert to outlines (previesť na obrysy) Ako a kedy previesť text na obrysy je nevyhnutnou znalosťou z hľadiska vektorovej kresby. Fonty totiž dokážu narobiť pri tlači veľa problémov. Na druhej strane, ak sa rozhodneš previesť text na obrysy, text sa stane grafikou a po konverzii ho už nebude možné upraviť. Pre konverziu textu na obrysy zvoľ v menu Layer > Convert to Outlines (prípadne stlač Shift-Command-O). • Obnovenie stratených dát Mac má skvelú funkciu, ktorá je kompatibilná aj so Sketchom. Môžeš si tak pozrieť históriu súboru a obnoviť stratené dáta cez File > Revert To > Browse All Versions. • Vnorenie symbolov Vnorený symbol môžeš vytvoriť tak, že inštanciu (kópiu) symbolu umiestniš do iného symbolu na stránku symbolov. Pri vykonaní zmeny rodičovského symbolu sa zmenia všetky jeho inštancie, bez ohľadu na to, či sú súčasťou iného symbolu, alebo nie. Neexistuje limit na to, ako hlboko je možné symbol vnoriť, symbol však nesmie obsahovať inštanciu seba samého. • Zdieľanie súborov cez appky (napríklad Slack) Jednoducho zdieľaj súbory cez appku tak, že potiahneš vybraný file zo sekcie Export - file a vložíš na plochu vybranej appky.  • Export Presets Týmto nástrojom ušetríš nesmierne mnoho času, môžeš si totiž kopírovať prvky zo svojho designu. Vytvorenie jednotlivých presets urobíš pomocou Presets preference panel. • Klávesové skratky Prehľad všetkých užitočných klávesových skratiek nájdeš tu! • Pluginy Užitočné pluginy sú Stark na kontrolu kontrastu, Runner na rýchlejší prístup k funkciám a Rename it + Styles Generator na stavbu knižníc. Adobe Photoshop Photoshop je veľmi obľúbeným nástrojom v oblasti úpravy fotografií a grafiky. Máš už v malíčku všetky jeho zákutia? [Image] • Kopírovanie farby z akéhokoľvek obrázka, vzoru a podobne.  Pomocou nástroja Eyedropper tool máš možnosť vybrať farbu zo zdroja mimo prostredia photoshopu a palety farieb. Jednoducho klikni a podrž nástroj kvapadlo a so stlačeným tlačidlom prejdi na vybranú stránku alebo obrázok. Namier kurzor na plochu s farbou, uvoľni myš a máš k dispozícii novú zadefinovú farbu. • Zmena veľkosti (a tvrdosti) štetca Asi ťa zdržiava neustále meniť veľkosť a tvrdosť štetca pomocou nástrojovej lišty. Najmä pri úpravách ako je retuš, či práca s maskami oceníš klávesovú skratku Alt+pravé tlačidlo myši (Ctrl+Alt+ľavé tlačidlo na Mac). Stačí podržať tlačidlo myši a pri pohybe vpravo-vľavo môžeš meniť veľkosť štetca, pri pohybe hore-dolu zase jeho tvrdosť. • Zmena prelínacích módov (blend modes) Práca s prelínacími módmi je vždy tak trochu experimentovaním, výsledok je totiž ťažké odhadnúť. Ty sa však nechceš zdržiavať dlho, čaká ťa kopec ďalšej práce, preto by si si mal osvojiť zaujímavú skratku Shift+plus. Táto skratka slúži na rýchle testovanie efektov na fotke. • Izolácia konkrétnej vrsty Niekedy môže projekt obsahovať toľko vrstiev, že sa zdá nemožné zobraziť len jednu konkrétnu. Vtedy stačí jednoducho podržať Alt (Option na Mac) a kliknúť na ikonku oka na vybranej vrstve.  • Bird's-eye-view Táto funkcia ti umožní ľahko sa orientovať v jednotlivých častiach obrázka pri detailnom priblížení. Ak si práve použil zoom a chceš prejsť na inú časť bez toho, aby si musel view zmenšovať, klikni a podrž H a potom ľavé tlačidlo myši. Teraz pohybuj kurzorom myši a prejdi na požadovanú oblasť. Uvoľnením tlačidla myši sa vrátiš k štandardnému náhľadu. • Exportovanie všetkých vrstiev do jednej  Potrebuješ exportovať všetky vrstvy do jednej? Aj na to poznáme skratku. Pomocou Control+Shift+Alt+E. (Command+Shift+Option+E pre Mac) spojíš všetky vrstvy do jednej.  • Prehľad klávesových skratiek[Image] Zdroj: www.digitalsynopsis.com • Užitočné pluginy Ak si dizajnér, alebo grafik, určite oceníš plugin RH Hover Color Picker. Ponúka prehľadnú prácu s farbami a  moderné rozhranie, ktoré konečne nevyzerá ako palubná doska v lietadle. Kopec efektov a filtrov ti umožní ON1 Effects, obrázky zase získaš prostredníctvom pluginu Pexels alebo Shutterstock.   Adobe Illustrator Illustrator je veľmi obľúbený pre svoje široké využitie, vytvoríš v ňom všetko od firemného loga, webových ikon, až po knižné ilustrácie. Ak si chceš osvojiť užitočné tipy a triky pre prácu s ním, si na správnom mieste. [Image] • Výber podobných objektov Ak už v Illustratore kreslíš zložitejšie tvary, je užitočné sa naučiť, ako vyhľadať podobné objekty. Ak napríklad chceme zmeniť vlastnosti viacerým objektom, nemusíme prácne objekty vyhľadávať, navyše môžu byť čiastočne zakryté inými objektmi. Stačí vybrať vybrať jeden z objektov, prejsť na Select>Same a vybrať požadované kritérium vyhľadávania objektov (napríklad Fill Colour). Všetky objekty s požadovanou farbou výplne potom systém vyberie a zmení pomocou vzorkovníka farieb. • Nauč sa správne používať Pen Tool Zvládnutie tohto nástroja v Illustratori by malo byť tvojím prvým krokom. Nie je to žiadne umenie a pomocou nástroja Pen Tool získaš väčšiu kontrolu nad tým, čo vytváraš. Výhodou je i jeho univerzálne použitie, keďže napríklad vo všetkých Adobe programoch funguje rovnako. • Použitie Pathfinder na vytvorenie komplexných tvarov Po zvládnutí Pen Tool by si mal upriamiť pozornosť aj na nástroj Pathfinder. Pathfinder umožňuje kombinovať objekty do nových tvarov. Môžete napríklad vrstviť jednoduché tvary a potom pomocou ukazovateľa pohybu ich transformovať na jednotnejší, zložitejší tvar. Existuje niekoľko tutoriálov na použitie Pathfinder na transformáciu základných tvarov na niektoré úžasné umelecké diela.  • Vyrob si vlastné štetce Ilustrátor milujeme, ale je potrebné si v ňom vytvoriť vlastný priestor. Nie všetky jeho základné funkcie sú pre vytvorenie vlastnej grafiky dostačujúce. To platí napríklad i o štetcoch. V Adobe Illustrator existujú 4 základné druhy štetcov: kaligrafické, rozptylové, umelecké a vzorkové. Ty máš ale možnosť pridať si svoje vlastné. Vyber si všetky tvary, z ktorých chceš urobiť štetec. V palete štetcov klikni na malú šípku vľavo vyber "new brush".  • Použi Color CC Ak chceš, aby tvoje ilustrácie vyzerali profesionálne, mali by obsahovať kombinácie farieb, ktoré oku lahodia. To je nie vždy jednoduché a ak nechceš strácať čas ich porovnávaním, určite využi Color CC. Tento nástroj ti umožní vybrať pekné, vkusné kombinácie farieb, navyše ich pridaním do palety farieb budeš mať hneď poruke. • Prehľad základných klávesových skratiek[Image] Zdroj: www.digitalsynopsis.com • Užitočné pluginy Prevezmi kontrolu nad svojimi vektormi pomocou VectorScribe v3, ktorú tvorcovia opisujú ako vektorový švajčiarsky nôž. Ak si začínajúci dizajnér, ktorý sa chce ponoriť do sveta 3D grafiky, určite neobíď plugin Cineware, efektný je aj Gold Rush a Phantasm v3.  Adobe InDesign Podobne ako Illustrator, je InDesign založený na vektorovej grafike. Poskytuje priestor, v ktorom môžeš spojiť všetky všetky svoje ilustrácie a grafiku (napr. z Photoshopu, Illustratoru) a vytvoriť si vlastné interaktívne dokumenty pre web, tlač, mobilné zariadenia a podobne. A aké triky by si si mal osvojiť v InDesigne? [Image] • Vytvorenie viacerých objektov rovnakej veľkosti  Ak chceš vytvoriť viacero objektov rovnakej veľkosti, nastav potrebnú šírku a výšku jedného objektu. Potom je už len potrebné vybrať zostávajúce objekty a zvoliť Object> Transform Again> Transform Sequence Again Individually. • Matematické funkcie v paneli nástrojov povedzme, že máš obrázok v ráme a chceš ho zväčšiť o 1″, pretože by tak pravdepodobne vyzeral lepšie. V paneli nástrojov, konkrétne vo Width field napíš 1 hneď vedľa existujúcej hodnoty. Stlač Tab a InDesign urobí ostatné za teba. Rovnako môžeš použiť i funkcie odčítanie (-), násobenie (*) a delenie (/). • Používaj vyplnenie zástupným textom.  Lorem Ipsum ti určite nemusím predstavovať. V InDesigne nám môže poslúžiť ako zástupný text (pravé tlačidlo > Vyplniť zástupným textom) v návrhoch, kde tento text použijeme pre lepšiu predstavu finálneho návrhu.  • Prispôsobenie rámu (frame fitting) Ak chceš prispôsobiť rám grafike vo vnútri neho, je potrebný dvojitý klik na roh rámu. Alebo stlač Cmd-Opt-C (Mac) / Ctrl-Alt-C (PC). • Vkladanie viacerých obrázok pomocou Adobe Bridge (multiplace from Bridge) Síce pre vloženie obrázka môžeš použiť File>Place, prípadne pretiahnuť požadovaný obrázok na plochu InDesign, je však určite jednoduchšie vkladať viacero obrázkov naraz. Otvor Adobe Bridge, vyber si obrázky, ktoré chceš použiť vo svojom layoute a zvoľ File>Place>In InDesign. Tým sa automaticky prepneš do InDesign, pomocou klávesov so šípkami môžeš prechádzať obrázky v kurzore a jednoducho ich klepnutím umiestniť. Pre úpravu môžeš využiť Object>Fitting. • Aplikovanie efektu z jedného objektu na iný Podarilo sa ti vytvoriť skvelý efekt, ktorý by si chcel aplikovať na ďalšie objekty? V tom prípade vyber objekt s požadovaným formátovaním a potiahni ikonu “FX” z panela efektov na objekt, na ktorý chceš formátovanie aplikovať. V prípade, že chceš vymazať všetky efekty z objektu, zvoľ „clear effects“ z Effects okna v paneli nástrojov.  • Klávesové skratky Prehľad všetkých užitočných klávesových skratiek nájdeš tu! • Užitočné pluginy Aquafadas AVE ti uľahčí digitálne publikovanie - od návrhu po distribúciu obsahu, jeho prispôsobenie rôznym platformám. Platený plugin Active Tables ti do InDesign prinesie Excel, vďaka PDF2Id zase budeš môcť importovať PDF súbory a konvertovať na editovateľný formát.  Práca v uvedených softvéroch je veľmi obsiahla a komplexná, snažili sme sa ti uviesť aspoň niekoľko "hackov" pre zjednodušenie a urýchlenie práce. Ak by si chcel prispieť nejakými overenými trikmi, podeľ sa o ne v komentári! Zaujala ťa téma grafiky a designu? Na Learn2code sme pre teba pripravili ponuku online kurzov grafiky, z ktorých si vyberieš svoj ušitý na mieru.
Java 10 a 11 – vybrané programátorské zmeny
Tipy a triky
22.05.2019
Skillmea

Java 10 a 11 – vybrané programátorské zmeny

Zaujíma ťa, aké zmeny sa udiali v Java 10 a 11? Čítaj článok a všetko podstatné sa dozvieš. Java 10Var Od verzie 10 je dostupná možnosť nešpecifikovať typy premenných pre lokálne premenné, ak ich vie kompilátor zistiť z pravej strany. Namiesto napísania typu stačí napísať nešpecifikovaný typ a to var. var list = new ArrayList<String>(); Kompilátor vie zistiť, akého typu je list a teda nie je možné pridávať čísla do listu, ale iba String. var list = new ArrayList<String>(); list.add("Jaro");Var sa neberie ako kľúčové slovo, ale ako nešpecifikovaný typ. Teda nemôžeme vytvoriť triedy s názvom var, ale je možné vytvoriť metódu s názvom var. //error String return(){ return ""; } //ok String var(){ return ""; }Nová metóda na kolekciách Pri kolekciách pribudla metóda copyOf, ktorá skopíruje jednu kolekciu do druhej. List<String> list = List.of("Jaro", "Fero", "Duro"); Set<String> set = Set.copyOf(list); List<String> listCopy = List.copyOf(set); Map<Integer,String> map = Map.of(1,"Jaro",2,"Fero"); Map<Integer,String> map2 = Map.copyOf(map);Java 11Var v lambda výrazoch Lambda výrazy podporujú type inferenciu, čo znamená, že ak používaš premennú v lambda výraze, tak java kompilátor vie zistiť, akého je typu a nemusíme typ zadefinovať. list.stream() .map(s -> s.toLowerCase()+".") .collect(Collectors.toList());V predchádzajúcich verziách javy sme nedokázali písať anotácie k premenným vo vnútri lambda výrazu, ktoré nemali zadefinovaný typ. Od verzie 11 je to možné, skoro – nemusíme zadefinovať špecifický typ, stačí ak napíšeme var. list = list.stream() .map((@Notnull var s) -> s.toLowerCase()+".") .collect(Collectors.toList());Jednoduchšie spustenie programuAk si napíšeš jednoduchý program a chceš ho spustiť v konzole, tak ho musíš najprv skompilovať cez príkaz javac a potom spustiť cez príkaz java.  Teraz stačí, keď rovno spustíš .java súbor pomocou java príkazu. Stane sa to, že sa automaticky súbor skompiluje a spustí.  java Main.java  java.lang.String metódyV triede String pribudli nové metódy.  isBlank() – vracia true, pokiaľ je reťazec prázdny alebo obsahuje len biele znaky  lines() – zo Stringu sa vráti stream riadkov – ak stream obsahuje oddeľovače riadkov  java.util.function.Predicate not Predstavme si takýto kód: lines.stream() .filter(s -> !s.isBlank())Pomocou Predicate.not vyzerá krajšie a čitateľnejšie: list.stream() .filter(Predicate.not(s -> s.isBlank()));S výhodou použitia method referencie:  list.stream() .filter(Predicate.not(String::isBlank));Ak použijeme statický import: list.stream() .filter(not(String::isBlank));Ak ťa zaujal článok a chcel by si sa dozvedieť viac, tak klikni na moju stránku a presuň sa na to, čo ťa zaujíma. Programovanie, kurzy, videá zdarma a iné záležitosti. Klikaj na www.jaroslavbeno.sk
Excel a kontingenčná tabuľka. Analyzuj trh ako profesionál
Tipy a triky
29.04.2019
Skillmea

Excel a kontingenčná tabuľka. Analyzuj trh ako profesionál

Kontingenčná tabuľka – vytvorenie, polia kontingenčnej tabuľkyKontingenčné tabuľky. Stačí spomenúť toto slovné spojenie a ľudia automaticky začínajú mať akúsi formu alergickej reakcie. V niektorých sa dokonca prebudia výčitky svedomia: „Mal by som ich ovládať, veď v životopise mám uvedenú znalosť Excelu na úrovni pokročilý.“ Máme pocit, že sa jedná o niečo ťažké, v skutočnosti však kontingenčné tabuľky vôbec nie sú jadrová fyzika. Poď sa o tom presvedčiť.  [Image] Aj teba strašia kontingenčné tabuľky? Ako a kedy sa používajú? Kontingenčná tabuľka, alebo tzv. pivot table, je veľmi efektívnym nástrojom Excelu. Dokáže sumarizovať a organizovať rozsiahle dáta z rôznych tabuliek a databáz. Predstav si, že dostaneš v práci zadanie. Všetky objednávky, ktoré prišli do tvojej firmy v rámci roka (čo môže byť pokojne niekoľko tisíc), máš roztriediť podľa jednotlivých pobočiek, kategórií nákupu. Zároveň chceš zistiť, koľko jednotlivá pobočka zarobila na akom produkte, prípadne vyjadriť percentuálny podiel konkrétneho produktu na celkovom počte predaných produktov. Pár dní by si si nad takým zadaním trhal vlasy, nebyť kontingenčnej tabuľky. V priebehu pár minút ti vie poskytnúť potrebné údaje k analýze a porovnávaniu dát. Ešte stále si nezaslúži tvoje uznanie? Ak chceš ovládať kontingenčné tabuľky, neváhaj využiť rekvalifikačné kurzy online, ktoré ti umožnia zvládnuť ich jednoducho a rýchlo. Tento nástroj je tiež skvelým doplnkom pre inovačné vzdelávanie, pretože ti pomáha získať zručnosti, ktoré sú dnes nevyhnutné v modernom pracovnom svete. Vytvorenie kontingenčnej tabuľky Zostáva už len získať údaje podľa kritérií nášho zadania. K tomu nám poslúži nástroj Tak si sa na to odhodlal. Správne. Ešte pred vytvorením tabuľky je však potrebné si dať pozor na viacero vecí:  1. Hlavička tabuľky, z ktorej chceš vytiahnuť dáta musí byť kompletne vyplnená, tzn. každý zo stĺpcov má názov   2. Hlavička tabuľky nesmie obsahovať stĺpce s rovnakým názvom   3. V prípade, že máš súčtový riadok pod tabuľkou, oddeľ ho od zvyšku tabuľky (stačí prázdnym riadkom). Vyhneš sa tak duplicitnému sčítaniu hodnôt.   4.Odporúčame vytvárať kontingenčnú tabuľku na novom hárku. Ak totiž tabuľka zasiahne do vstupných dát, natrvalo ich zmaže. Vstupné údaje si si skontroloval a už netrpezlivo čakáš na to, aby si sa mohol pustiť do svojej prvej kontingenčnej tabuľky. Tak smelo!  1. Označ tabuľku, prípadne bunky, z ktorých si želáš kontingenčnú tabuľku vytvoriť[Image]   2. Na karte Vložiť klikni na možnosť Kontingenčná tabuľka[Image]   3. Otvorí sa nové dialógové okno, kde uvidíš, z ktorých buniek bude kontingenčná tabuľka vytvorená a možnosť umiestnenia novom alebo existujúcom hárku.Stlač OK. Voilá.[Image]  4. Na novom hárku sa ti vľavo zobrazí akási prázdna tabuľka, vpravo sa nachádza nástroj kontingenčnej tabuľky[Image] Zostáva už len získať údaje podľa kritérií nášho zadania. K tomu nám poslúži nástroj kontingenčnej tabuľky. Skladá sa z 5 častí:   1. Polia kontingenčnej tabuľky - sú tvorené z názvov stĺpcov zo zdrojovej tabuľky.  2. Filter zostavy - hodnoty, podľa ktorých chceme kontingenčnú tabuľku filtrovať  3. Menovky riadkov - hodnoty v tomto poli budú vpísané do riadkov  4. Menovky stĺpcov - hodnoty v tomto poli budú vpísané do stĺpcov  5. Hodnoty – hodnoty v tomto poli sú číselné, využívame pri nich rôzne matematické operácie Texty napríklad zadáva Excel automaticky do riadkov. Povedzme, že ti to nevyhovuje. Vtedy stačí len myškou presunúť požadované pole z jednej oblasti do druhej, napr. z Menovky riadkov do Menovky stĺpcov. Polia si teda usporiadaš tak, aby si získal čo najlepší prehľad o údajoch k analýze. Potrebuješ si vytlačiť kontingenčnú tabuľku?Ako pracovať s kontingenčnými tabuľkami efektívneNajprv ti odporúčame zvoliť si vertikálne rozloženie, ktoré je vhodnejšie na tlač. Zvislé rozloženie je vhodné najmä vtedy, ak nechceš, aby bola tvoja kontingenčná tabuľka rozložená vodorovne na celom hárku. Ak sa ešte k tomu pridajú polia s hodnotami v stĺpcoch, ktoré sú štandardne usporiadané vodorovne, tabuľka bude veľmi široká. Náš tip: Ak tlačíš kvôli svojej práci množstvo nielen kontingenčných tabuliek, v rámci úspory farby ti odporúčame kompatibilné náplne do tlačiarne. Tie sú v porovnaní s originálnymi náplňami lacnejšie, ekologickejšie, avšak stále ponúkajú 100% kvalitu tlače. ZáverA práve si dospel do bodu, kedy už dokážeš nielen vytvoriť kontingenčnú tabuľku, ale vieš si v nej údaje zorganizovať tak, aby bola analýza a porovnanie dát jednoduchšie. Dokáže ti ušetriť hodiny a hodiny zbytočného filtrovania a ty môžeš využiť svoj voľný čas zmysluplnejšie. Ako, to je na tebe. :)[Image] Aj komplexná práca s kontingenčnými tabuľkami je súčasťou nášho kurzu Excel pre pokročilých, kde nájdeš rozsiahle tutoriály pre prácu s excelovskými funkciami, makrami, formátovaním a podobne. Naučíš sa s Excelom pracovať ako profík, čo bude plusom nielen pre tvoje CVčko, ušetrí ti určite veľa času aj v praktickom živote. Navyše na konci kurzu získaš od Skillmea certifikát o absolvovaní kurzu, aby viac o tvojej úrovni nikto nepochyboval! Ak chceš zvládnuť Excel rýchlo a efektívne, skús online kurz Microsoft Excel, ktorý ti umožní naučiť sa všetko, čo potrebuješ, z pohodlia domova.