Náš blog

Java 8
Tipy a triky
19.09.2018
Skillmea

Java 8

Java 8 je veľký balíček novej funkcionality oproti Java 9 a java 10. Tie sú menšie a odzrkadľujú taktiku tvorcov javy vydávať nové verzie častejšie s menším balíkom novej funkcionality. V tomto článku si povieme najvýraznejšie zmeny z Java 8. Funkcionálne rozhraniaRozhranie, ktoré má len jednu abstraktnú metódu je považované za funkcionálne rozhranie. Pre lepšie načrtnutie v kóde môžeme a je odporúčané pridať anotáciu @FunctionalInterface.  import java.lang.FunctionalInterface;   @FunctionalInterface public interface FunctionalInterfaceExample {     void print(); }  Lambda výrazyOk, chceme pridať do javy možnosť definovať funkcionalitu bez toho aby patrila špecificky pod nejakú triedu. Tieto funkcie chceme vkladať do metód ako parametre. Čo spravíme? Tvorcovia javy sa asi takto nezamýšľali, ale my sme sa takto zamysleli a odpoveď je – použijeme lambda výrazy.  Každá lambda má ako typ funkcionálne rozhranie s jej odpovedajúcou metódou. V príklade vyššie máme rozhranie s metódou print. Táto metóda nevracia nič a neprijíma žiadne parametre. Musíme vytvoriť aj taký lambda výraz – teda nebude obsahovať return a nebudeme mať žiadne návratové hodnoty.  () -> System.out.println("Hello Word")Takto vložíš lambda výraz do metódy:  printHelloWord(() -> System.out.println("Hello Word"));Samotná metóda prijíma na vstupe práve dané funkcionálne rozhranie:  public void printHelloWord2(FunctionalInterfaceExample printHello)Viac o lambda výrazoch sa dozvieš z môjho online kurzu Java pre pokročilých, videá o lambda výrazoch sú zadarmo. StreamsStreamy poskytujú zjednodušenú prácu s dátovými kolekciami. Poskytujú viacero užitočných metód ako sú napríklad filter, sorted, map a iné. Ak stream préjde cez všetky elementy v kolekcii, tak bude prázdny. Teda ak chcem znovu použiť ten istý stream, tak zbytočne, lebo tam už nebudú dáta. Musíš si vytvoriť nový stream.  Nový stream vytvoríš napríklad pomocou stream metódy nad kolekciami.  List<Osoba> osoby = Arrays.asList( null, new Osoba("Jaro", "Beno", 30), new Osoba("Peter", "Kridlo", 55), new Osoba("Karol", "Otko", 18), new Osoba("Karol", "Beno", 18), new Osoba("Peter", "Otko", 20), new Osoba("Fedor", "Ronald", 84) ); osoby.stream();Máš zoznam osôb a chceš z daného zoznamu získať všetky veky osôb starších ako 50 rokov a majú byť zoradené podľa veku. Čo spravíš? Použiješ stream a jeho metódy – tieto metódy akceptujú funkcionálne rozhrania, teda tam dáš lambda výrazy.  List<Integer> veky = osoby.stream() .filter(osoba -> osoba.getVek() < 50) .sorted(Comparator.comparing(Osoba::getVek)) .map(Osoba::getVek) .collect(Collectors.toList());Kolekcie, ktoré sú iterovateľné, majú metódu forEach – ktorá získa stream a prejde všetky elementy.  veky.forEach(System.out::println);   Method referencePo slovensky referencia na metódu. Všimni si príklad z hora: Osoba::getVek. Znamená to, že z triedy Osoba použi metódu getVek. To isté sa dá zapísať aj pomocou lambda výrazu takto osoba -> osoba.getVek(). Ale pomocou referencie si to zjednodušíme lebo java vie, aký je vstupný parameter – je to osoba a vie, že voláš getVek. Tak stačí napísať Osoba::getVek. Metódu voláš bez zátvoriek.  Ďalší článok o Jave už čoskor. Prihlás sa k odberu noviniek a nezmeškaj žiadný nový blog.   
Websockety vo Flasku
Tipy a triky
15.08.2018
Miroslav Beka

Websockety vo Flasku

Websockety vo Flasku Ak si sa niekedy stretol s výrazom websocket a chcel by si sa dozvedieť, čo to vlastne je a ako sa to používa v Python aplikácii, tak tento článok je práve pre teba. Štandardne tvoj prehliadač komunikuje na webe pomocou http protokolu. Klasický http protokol ponúka jednoduchú komunikáciu. Pošle sa request a ako odpoveď dostanem response. Tento klasický komunikačný spôsob nebol dostatočný pre dnešné moderné aplikácie. Bola potreba pre komunikačný kanál, ktorý bude slúžiť na obojsmernú komunikáciu. HTTP by mal byť viac-menej bezstavový a klient a server medzi sebou komunikujú iba keď treba, inak je spojenie medzi nimi uzavreté. Navyše, prehliadač (klient) musí požiadať server o komunikáciu a server môže na túto žiadosť odpovedať. Tá žiadosť, to je ten http request. Inak server nevie kontaktovať klienta len tak sám od seba. Pri websocketoch je to inak. Ide o komunikačný kanál, ktorý sa otvorí raz, na začiatku a potom sa používa na komunikáciu klienta a servera v oboch stranách. To znamená, že server môže posielať dáta zároveň čo klient posiela dáta na server. Toto sa odborne volá full-duplex. Web socket má menší overheat prenosu dát, vie byť real-time a hlavne, server môže posielať dáta na klienta bez toho, aby si ich klient musel explicitne vyžiadať requestom. Toto je užitočné napríklad pri aplikáciách, ktoré zobrazujú real time dáta a server posiela tieto dáta klientovi. Takže ak nastane nejaká zmena dát, server ich proste pošle na klienta. Toto predtým nebolo možné spraviť iba pomocou http protokolu. Minimálny príkladNajlepšie je vyskúšať si tieto koncepty v praxi. Dnes budeme pracovať s Flaskom, knižnicou SocketIO a javascript knižnicami socket.io a jQuery. Budem predpokladať, že Flask aplikácie aspoň trochu poznáš. Začneme tým, že si vytvoríme nové virtuálne prostredie: $ mkdir websockets_primer $ cd websockets_primer $ virtualenv venv $ . venv/bin/activate (venv) $Nainštalujeme závislosti, ktoré budeme potrebovať: (venv)$ pip install flask, flask-socketioV čase písania tohto článku som používal verzie Flask==1.0.2 a Flask-SocketIO=3.0.1. Keď už máme pripravené prostredie a nainštalované závislosti, spravíme nový súbor server.py from flask import Flask from flask import render_template from flask_socketio import SocketIO app = Flask(__name__) app.config["SECRET_KEY"] = "secret" socketio = SocketIO(app) @app.route("/") def index(): return render_template("index.jinja") @socketio.on("event") def handle_event(data): print(data) if __name__ == '__main__': socketio.run(app, debug=True)Na začiatku máme importy ako pre každú inú Flask aplikáciu, avšak pribudlo nám tam from flask_socketio import SocketIO. Tento naimportovaný modul je v podstate to isté ako iné Flask rozšírenia. Inicializáciu websocketov vo Flask aplikácií spravíme pomocou riadku socketio = SocketIO(app). Pomocou tohto objektu socketio budeme príjmať a odosielať správy. Minimálna aplikácia by mala mať aspoň jednu stránku. V našom prípade to bude index.jinja. Toto je treba pretože musíme poskytnúť aj klientskú časť našej aplikácie. Tam bude javascript knižnica socketio a nejaké ďalšie funkcie. Websockety vedia prijímať a posielať správy. Spravíme zatiaľ len prijímanie správ. Pomocou riadku socketio.on("event")definujem handler pre udalosť event. V tomto prípade jednoducho vypíšem dáta na konzolu. @socketio.on("event") def handle_event(data): print(data)Posielanie a prijímanie dát na oboch stranách (klient a server) prebieha ako event. Toto je dôležitý fakt, pretože architektúra aplikácie založenej na eventoch (event driven architecture) funguje trošku inak ako klasické volanie funkcie. Nehovorím, aby si mal z toho paniku teraz, ale maj to na pamäti. Ak poznáš Flask aplikácie, tak spustenie appky vyzerá zväčša takto if __name__ == "__main__": app.run("0.0.0.0", debug=True)My ale musíme appku spustiť inak, pretože používame websockety. Spustíme ju pomocou objektu socketio, ktorý sme si vytvorili na začiatku. if __name__ == '__main__': socketio.run(app, debug=True)Teraz musíme ešte vytvoriť 2 súbory. Snažíme sa renderovať index.jinja a taktiež musíme vytvoriť hlavný javascript súbor, do ktorého budeme písať klientskú časť našej websocketovej ukážky. Vytvorím priečinok templates a do neho súbor index.jinja <!DOCTYPE HTML> <html> <head> <title>Websockets test</title> <script type="text/javascript" src="//code.jquery.com/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script> <script type="text/javascript" src="{{ url_for("static", filename="js/main.js")}}"></script> </head> <body> <form id="emit_event" method="post"> <input type="submit" value="emit"> </form> </body> </html>Dôležité sú 3 importy v hlavičke html dokumentu. Prvý importuje jQuery, druhý importuje knižnicu na prácu so socketmi socketio a posledný import je pre náš main.js súbor, ktorý musíme ešte vytvoriť. Inak, tento html dokument obsahuje len jeden formulár s jedným tlačítkom. To budeme používať na posielanie správy cez websocket. Vytvoríme priečinok static v ňom js a v ňom už konečne súbor main.js Obsah bude vyzerať asi takto: $(document).ready(function() { var url = location.protocol + "//" + document.domain + ":" + location.port var socket = io.connect(url); $("form#emit_event").submit(function(event) { socket.emit("event", "test message"); return false; }); });Toto je hlavná logika klientskej časti. Z tadeto budeme prijímať a posielať správy cez websockety tak isto ako na serverovej časti. Pomocou riadku var socket = io.connect(url); sa pripojím na môj server. Následne pomocou jQuery upravím správanie buttonu, aby pri stlačení poslal správu. Na to slúži funkcia socket.emit() Okej, základ máme hotový a môžeme teraz skúšať posielať správy. Aplikáciu spustím pomocou príkazu: (venv)$ python server.py WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance. * Serving Flask app "server" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance. * Debugger is active! * Debugger PIN: 478-618-530Otvorím prehliadač na http://localhost:5000 a zobrazí sa mi jeden button. Keď ho stlačím na konzole mi vyskočí: test messagePoďme teda preskúmať, aké možnosti nám poskytuje táto knižnica socketio. Príjmanie správAko som už spomínal, prijímanie správ na oboch stranách prebieha ako event. V Pythone musíme pre takýto event definovať handler. V javascripte používame tzv. callbacky. V princípe ide o to isté, ale každý jazyk má svoje vlastné technické riešenie a my si toho musíme byť vedomí. Každý event, ktorý chcem prijať musím mať nejaké meno. V príklade sme mali názov event. Môžem ale použiť čokoľvek @socketio.on("foobar") def handle_data(data): print(type(data)) print(data)Taktiež dáta sa automaticky menia na príslušný typ. Ak v javascripte pošlem string, tak string dostanem aj na serveri. Tak isto to platí pre iné dátové typy ... $("form#emit_event").submit(function(event) { socket.emit("foobar", "message"); socket.emit("foobar", [1,2,3,]); socket.emit("foobar", {data : "message"}); return false; }); ...Po odoslaní udalostí dostanem výpis na serveri <class 'str'> message <class 'list'> [1, 2, 3] <class 'dict'> {'data': 'message'}Handler taktiež môže mať viacero argumentov @socketio.on("sum") def handle_sum(arg1, arg2): print(arg1 + arg2)Upravíme javascriptovú časť a zavoléme event s viacerými argumentami ... $("form#emit_event").submit(function(event) { socket.emit("sum", 23, 47); return false; }); ...Namespace patrí medzi ďalšie funkcie, ktoré mám knižnica SocketIO ponúka. Každý event si môžeme rozdeliť podľa namespaceov. To nám dáva ďalšie možnosti organizácie eventov. @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): print(arg1 + arg2)Avšak pozor! Na strane klienta sa musíme teraz pripojiť na inú url $(document).ready(function() { var namespace = "/math"; var url = location.protocol + "//" + document.domain + ":" + location.port; var socket = io.connect(url + namespace); $("form#emit_event").submit(function(event) { socket.emit("sum", 23, 47); return false; }); });Ďalšia vychytávka je to, že každý event, ktorý pošleme, vie zavolať callback potom, čo sa vykonal. Napríklad z javascriptu pošlem nejaké dáta na server a server mi ešte dodatočne potvrdí, že dáta boli spracované. Aha takto ... $("form#emit_event").submit(function(event) { var ack = function(arg){console.log(arg)}; socket.emit("sum", 23, 47, ack); return false; }); ...Ak chcem, aby sa callback zavolal, musím v Pythone vrátiť nejakú hodnotu z vykonaného handlera => return True @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): print(arg1 + arg2) return TrueMusím si otvoriť v prehliadači konzolu (ja používam chrome) a keď stlačím tlačítko, dostanem výpis na konzolu [Image] Posielanie správPosielať eventy sme už posielali, ale iba z javascriptu. V Pythone to vyzerá veľmi podobne. Používame 2 funkcie send a emit medzi ktorými je zásadný rozdiel. Najprv musíme importovať z knižnice flask-socketio from flask_socketio import send from flask_socketio import emitupravíme funkciu na sčítavanie @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): value = arg1 + arg2 print("{} + {} = {}".format(arg1, arg2, value)) send(value)a pridáme handler v javascripte aby sme mohli tento event zachytiť. ... $("form#emit_event").submit(function(event) { socket.emit("sum", 23, 47); return false; }); socket.on("message", function(data){ console.log("received message: " + data) }); ...Všimni si, že teraz som použil handler, ktorý spracováva event s názvom message. Nie je to náhoda. Ide totiž o to, že funkcia send posiela tzv. unnamed event. Tieto eventy sa vždy posielajú na handler, ktorý spracúva message. Narozdiel od funkcie send, funkcia emit posiela už konkrétny event a musíš mu dať názov. Skúsme teda pozmeniť náš príklad @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): value = arg1 + arg2 print("{} + {} = {}".format(arg1, arg2, value)) emit("result", value)... socket.on("result", function(data){ console.log("sum is: " + data) }); ...BroadcastingVeľmi užitočná funkcia je broadcastovanie, čo už z názvu vyplýva, že eventy sa budú vysielať na všetkých pripojených klientov. Dajme tomu, že zmeníme funciu emit na broadcastovanie @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): value = arg1 + arg2 print("{} + {} = {}".format(arg1, arg2, value)) emit("result", value, broadcast=False)Teraz, keď si otvoríš 2 prehliadače a v jednom stlačíš button, výsledok súčtu sa ukáže vo všetkých prehliadačoch[Image] note: callbacky sa pri broadcastovaní nebudú vykonávať ZáverWebsockety majú mnoho využití. Tento článok bol len úvod a prehľad niektorých základných funkcií. V budúcom blogu spravíme malú aplikáciu postavenú na websocketoch. Máš nejaké otázky k článku? Napíš ju do komentára.
7 dôvodov, prečo sa ľudia na vašom webe neregistrujú
Tipy a triky
06.06.2018
Skillmea

7 dôvodov, prečo sa ľudia na vašom webe neregistrujú

Weby sú o biznise. A teraz nemám na mysli vývojárske firmy a mladé dynamické “desing studios”. Hovorím o biznise ako takom - o činnosti, pri ktorej sa vymieňajú hodnoty (ako peniaze a tovar) k vzájomnej spokojnosti oboch strán. Vy máte super obsah, návštevníci vašich stránok zase svoje kontaktné údaje. Tak si podáte ruky a dohodnete obchod. Moje články za tvoj e-mail. Jednoduché, nie? Nie. Registračný proces je vcelku zložitá záležitosť a nie vždy funguje tak, ako by sme si predstavovali. Web môže mať veľa návštevníkov, no len veľmi málo sa aj zaregistruje. Prečo? Nuž, keď sme web vymýšľali, mohli sme nevedomky urobiť pár chýb. Tak po prvé… 1. Sme v tom, že registračný proces rovná sa registračný formulár Samozrejme, že je dôležité mať pekný a použiteľný formulár. Názvy nad inputmi pre vertikálne skenovanie, absencia CAPTCHA pre duševný kľud, poznáme. Ale registrácia nezačína vypĺňaním políčok. Ak sme návštevníka dostali až sem, máme už vlastne spolovice vyhraté - registračný proces formulárom nezačína, ale končí. Ďalšou chybou teda môže byť, že… 2. Zabúdame na to, že registračný proces rovná sa motivácia “Ahoj, sme Triad a robíme efektívny digitálny marketing tak, aby to bavilo nás aj našich klientov”. Nejako takto by mohla vyzerať vaša value proposition (nechce sa mi hľadať slovenský preklad), ak by ste boli Triad. Lenže nie ste, tak si vymyslite vlastnú. Pamätajte, že návštevníci stránok sú sebci a zaujíma ich len to, čo im prinesiete. Kašlú na vašu misiu, víziu a počet šálok kávy vypitých od začiatku roku. Prečo by s vami mali robiť biznis, keď im nedáte jasne najavo, akú hodnotu im prinášate? Prečo by sa mali registrovať práve u vás? Povedzte im to. Jednoducho, zrozumiteľne, hlavne nepreháňajte. S tým súvisí ďalší bod. 3. Neosobné a nudné webové copy Ako hovorí Adam Javůrek, vo webovom copy sú sväté 3 slová: vy, váš a zdarma. Schválne, skúste použiť všetky. Buďte priateľskí, s užívateľmi sa rozprávajte. Gombík “Registrujte sa” je prívetivejší ako “Registrovať”, alebo “Registrácia”. Vyznačte dôležité časti, text štruktúrujte. Oh, a skráťte ho. Na polovicu. A potom ešte raz. To, čo je na vás super musíte vedieť povedať počas krátkej cesty výťahom. Je váš produkt alebo obsah zdarma? Povedzte to. A ešte raz - nie ste najlepší, najkrajší a neviete všetko. Svojim návštevníkom dajte jasný a zrozumiteľný dôvod, prečo sa u vás majú registrovať. Bez preháňania. Všetky kecy na svete však nenahradia osobnú skúsenosť - občas na to pozabudneme a potom vzniká… 4. Obsah skrytý pod registračnou hradbou To je tak. Kliknem na nadpis článku alebo odkaz v zmysle “zistiť viac” (moje obľúbené, BTW, keď nejdem ďalej čítať, ale “zisťovať”). Vyskočí na mňa modálne okno s formulárom a vrieska po mne čosi o registrácii. Skúsim ďalší odkaz, situácia sa opakuje. Odchádzam.  Povedzme, že zháňate cukríky a narazíte na dvoch predavačov. Benďo a Jožo. Benďo bude svoje cukríky vynášať do neba a opisovať ich úžasnú chuť. Jožo otvorí balíček a rovno vás ponúkne. Od koho si cukríky kúpite? Jožova prefíkaná obchodná taktika stojí na princípe reciprocity - ak dáš najprv niečo ty mne, ja budem viac ochotný dať niečo tebe. Preto ak máte super obsah, neskrývajte ho pred návštevníkmi. Ukážte im ho. S tým, že keď ho budú chcieť vidieť celý, nech sa zaregistrujú. Svoj e-mail vám poskytnú veľmi radi, ak budú vedieť, do čoho idú. Apropo, do čoho idú… 5. Príliš veľký záväzok Registrácia na webe je veľké rozhodnutie. Nie, vážne. Sú to cudzie stránky, neviem, kto ich vlastní. Komu dávam svoj e-mail? Na čo všetko ho použije? Čaká ma spambox plný super piluliek a členov nigérijskej kráľovskej rodiny? A načo chcú moje telefónne číslo? PSČ? Zbláznili sa? Tak. Buďte transparentní. Ľudia nemajú radi záväzky, ukážte im teda, že sa nemajú čoho báť. Budete im posielať newsletter? Tak im ho ukážte. Ako vyzerá, čo obsahuje a hlavne - ako často sa naňho môžu tešiť. Môžu si účet kedykoľvek zrušiť? Povedzte im to. Pridajte aj vetu o tom, že informácie neposkytnete tretej strane (a skúste to aj dodržať). A uistite ich, že to celé nezaberie viac ako minútu ich času. Ešte jedna vec. Veľa webov prichádza o obrovský zdroj dôvery v očiach ich potencionálnych užívateľov - robia jednu zásadnú chybu… 6. Skrývanie ostatných užívateľov Máte super web plný super obsahu, kde chodí veľa super ľudí? Ukážte ich. Čo všetko tam robia? Jožo práve číta článok o červených pandách? Benďo v špeciálnej aplikácii zistil, kde v jeho okolí sa pandy dajú skvelo pozorovať? Prečo sa nepochváliť? Možno tam dokonca nájdem nejakých kamošov z Facebooku. A prečo by som sa neregistroval, keď tam už sú moji známi, ktorí to preverili za mňa? Volá sa to social proof a viac o ňom zistíte v Googli. Nejaké knihy o tom zoženiete aj na Amazone. A vôbec, keď už o nich hovorím. Títo veľkí hráči míňajú milióny na UX testovanie, musia mať super premakanú registráciu. Spravíme to ako oni. Nemôže to dopadnúť zle. Alebo hej? 7. Opakovanie po ostatných Ak sa nevoláte Bezos (čo určite nie, lebo čítate článok v slovenčine), zapíšte si za uši: nie ste Amazon. Ani Google, ani Alza ani lokálny opravár plynových bojlerov. Vy ste vy. Pri navrhovaní registračného procesu treba vždy vychádzať z vlastnej situácie a vlastných skúseností. Internetoví giganti majú určite veľmi dobre zvládnutý registračný proces, no nikto z nás nevidí do ich cieľov, štatistík a stratégie. To čo funguje pre nich nemusí fungovať pre vás. Na druhej strane, inšpirovať sa niekde treba, takže…  Trochu inšpirácie Tu je niekoľko známych webových produktov, ktoré majú podľa mňa vynikajúco zvládnutý registračný proces. Čo majú spoločné, je predovšetkým jednoduchosť - jasne komunikujú, ako mi pomôžu (či už pomocou textu alebo obrázkov) a okamžite mi ponúknu možnosť ich bezbolestne začať používať. • Intercom • Basecamp • Dropbox Autorom blogu je Roman Pittner, lektor online kurzu Dizajn pre obrazovky. Ak máš k blogu otázky, neváhaj ich napísať do komentárov.
Ako vie programátor samouk dobehnúť tých, čo študovali na univerzite
Tipy a triky
03.04.2018
Martin Lipták

Ako vie programátor samouk dobehnúť tých, čo študovali na univerzite

Čo sa učia na univerzitáchSi programátor samouk a rozmýšľaš, ako to vyzerá na univerzite? Už si videl všetky online kurzy, máš za sebou 10 vlastných projektov a začínaš v novej práci ako Web developer. Ako dobehnúť ľudí, ktorí 5 rokov študovali informatiku? Dá sa to vôbec?  Pred 3 rokmi som skončil FIIT (Fakulta informatiky a informačných technológií) na STU v Bratislave a tiež som rozmýšľal, čo všetko mi škola dala. Je toho veľa a som veľmi rád, že som si vybral takú cestu. Na druhej strane, keby som túto možnosť nemal, väčšinu vecí by som sa naučil aj inde. Čo boli pre mňa tie najdôležitejšie veci? Asi už tušíš, že je to celé veľmi subjektívne a určite neber tento článok ako univerzálny návod. Študentský životBýval som na intrákoch v Mlynskej doline a jeden semester som strávil na programe Erazmus v Španielsku. Boli to kamarátstva a zážitky, na ktoré sa dá spomínať celý život. Pre samoukov: Ak si študoval na akejkoľvek vysokej škole, vieš o čom hovorím. Inšpiratívni ľudiaSpoznal som veľa spolužiakov a učiteľov, ktorí ma vo veľa veciach posunuli ďalej. S mnohými som doteraz v kontakte a môžem sa na nich spoľahnúť, keby som potreboval pomoc.  Pre samoukov: Skvelých ľudí nájdeš aj v pracovných kolektívoch. Obklop sa takými, ktorí sú lepší ako ty sám.  Na škole sa organizovalo veľké množstvo podujatí a učitelia nás motivovali chodiť na stretnutia programátorov mimo školy, kde som spoznal veľa ďalších ľudí. Pre samoukov: Hľadaj si kamarátov na rôznych udalostiach pre programátorov, ktorých je viac než dosť v každom väčšom meste (napríklad taká Rubyslava alebo Reactive meetups a veľa ďalších). SamostatnosťOd intrákov a štúdia v zahraničí, až po prácu na zadaniach, projektoch a záverečných prácach. Aspoň na FIIT to bolo tak, že ťahať to musel sám študent a učiteľ mu len pomáhal alebo niekedy aj nepomáhal. Zasekol si sa pri zadaní a termín je zajtra? Použi Google, alebo sa poraď so spolužiakmi, ale vyrieš to. Ak tvoje zadanie nebude do 00:00 CEST v odovzdávacom systéme, nikoho nebudú zaujímať tvoje výhovorky a predmet si zopakuješ ďalší rok. Ak sa ti nazbiera takýchto predmetov viac, letíš zo školy. Pre samoukov: Tak ako si spravil tých 10 vlastných projektov, aj v práci budú očakávať, že sa vecí chytíš a dotiahneš ich samostatne do konca. To ale neznamená, že sa nemáš pýtať (najskôrskús Google) a požiadať o pomoc, keď ju potrebuješ. [Image] Práca v tímeNa mnohých školských projektoch som nepracoval sám. Na tímovom projekte sme boli až 7 a museli sme sa vysporiadať s odlišnými názormi a dokonca cieľmi v projekte.  Pre samoukov: Máš za sebou tých 10 projektov, pri ktorých si sa naučil samostatnosti. V práci budeš obklopený ľuďmi a musíte spolu čo najlepšie vychádzať. Volá sa to soft skills a dá sa to natrénovať.[Image] VedomostiNa čo všetko si spomeniem 3 roky po skončení školy? O čom boli všetky tie predmety? • Ako funguje počítačový hardvér a ako sa z jednotiek a núl stanú programy - logické obvody a počítačové architektúry. • Ako funguje operačný systém - ovládače zariadení, IO, systémové volania, procesy, vlákna (threads), synchronizácia, správa unixových systémov a shell skripty. • Ako funguje Internet a čo je HTTPS, DNS, POP3, IP a Ethernet - 7 vrstiev počítačových sietí a ako spolu súvisia všetky tieto protokoly. • V čom sa líšia paradigmy programovania - procedurálne programovanie v C, objektovo-orientované v Jave, funkcionálne v Lispe a logické v Prologu. Pozri môj prvý projekt v C, ktorý som nahral do školského systému na automatické testovanie :) • Čo znamená zápis O(n) a ako určiť zložitosť algoritmov? Ako môže efektívny algoritmus vypočítať výsledok za 1 milisekundu a neefektívny by to počítal týždne? Vyvážené binárne stromy, hashing, grafy a iné dátové štruktúry. • Čo je to Turingov stroj? Prečo sú regulárne výrazy regulárne? Čo je abstraktný syntaktický strom? Základná teória informatiky, na ktorej stoja všetky programovacie jazyky. • Je umelá inteligencia naozaj inteligentná? Hrubá sila a heuristiky, ktoré riešia zložité problémy, neurónové siete, genetické algoritmy a odvodzovacie stroje. • Aké sú výzvy paralelného programovania? Klasické problémy synchronizácie, vlákna, mutexy a semafory. • Čo je to databáza? Návrh dátových modelov, písanie dopytov (queries), optimalizácia indexmi a kedy použiť NoSQL. • Úvod do analýzy dát (data science). Lineárna regresia, neurónové siete, support vector machines, clustering a časové rady. • Ako manažovať softvérové projekty? Vodopád alebo agilné metodológie, dôležitosť testovania a dokumentácie, návrh požívateľských rozhraní, kvalita kódu a návrhové vzory. • Ako robiť výskum? Návrh hypotéz, ich vyhodnocovanie experimentmi, meranie dát, písanie a zverejňovanie výskumných článkov. • Zopár predmetov o ekonómii, práve a psychológii bolo príjemným oddychom od technických vecí. • Webový vývoj v Ruby on Rails. Toto je to, čomu sa teraz venujem v práci. Pre samoukov: Vyzerá to ako veľmi dlhý zoznam, ale väčšinu z týchto vecí sa vieš naučiť v praxi. Sú však veci, ku ktorým sa nedostaneš. Ak sa od začiatku zameriavaš na webový vývoj v PHP, asi sa nebudeš do hĺbky zaoberať hardvérom, prekladačmi (compilers) a operačnými systémami. A väčšina ľudí sa asi nebude zaoberať výskumom.[Image] Takže ako dobehnúť tých, ktorí študovali FIIT?• Obklop sa ľuďmi, od ktorých sa môžeš veľa naučiť. Nájdeš ich v práci a na stretnutiach programátorov. • Nečakaj, že ti vždy povedia ako máš veci robiť. Samostatnosť je ale aj vedieť požiadať o pomoc, keď ju potrebuješ. • Aj keď to tak na prvý pohľad nevyzerá, programovanie je viac o ľuďoch ako o počítačoch. Pracuj na svojich soft skills a komunikácii v tíme. • Snaž sa porozumieť veciam do hĺbky. Ako fungujú regulárne výrazy? Prečo potrebuje databáza indexy? Aký je rozdiel medzi http:// a https://? V čom sú výhody SCRUM-u? • Uč sa veci mimo tvojej špecializácie. Vyvíjaš weby? Skús spraviť natívnu mobilnú aplikáciu. Čo tak si cez víkend naprogramovať ovládač do operačného systému alebo kompilátor? Máš otázky k tomuto blogu? Neváhaj ich napísať do komentárov.
Ako naprogramovať hru Čierny Peter v Jave
Tipy a triky
26.10.2017
Skillmea

Ako naprogramovať hru Čierny Peter v Jave

Programovanie hry Čierny Peter v JaveV tomto tutoriáli si spolu naprogramujeme kartovú hru Čierny Peter. Použijeme programovací jazyk Java a zameriame sa na to, aby sme použili OOP prístup, teda objektovo-orientované programovanie. Pravidlá hryNajskôr si musíme zanalyzovať danú hru. To spravíme tak, že si povieme a určíme pravidlá. V hre je 33 kariet. Jedna karta nemá pár, ostatné ho majú. Hru môže hrať 3 až 6 hráčov. Všetky karty sa rozdajú medzi hráčov. Automaticky si hráči vytriedia z ruky karty, ktoré majú páry. S ostatnými sa začína hra. Ten, čo má najviac kariet, nechá ťahať hráča po svojej pravici. Ak ten hráč získal pár, tak ho vyloží a ďalší hráč od neho ťahá kartu. Ak hráč prišiel o všetky karty, už viac nehrá. Komu ostane posledná karta, ten prehral hru. Analýza hry – vytváranie objektovTeraz je čas pripraviť si popis našich tried, rozhraní a podobne. V skratke, uvažujeme nad pravidlami, okolnosťami a členmi danej hry a chceme ich pretvoriť na objekty.  Čím všeobecnejšie napíšeme naše objekty, tým lepšie pre ich znovupoužiteľnosť. Ak by sme chceli niekedy naprogramovať karty žolíkové, sedmové alebo hocijaké iné, tak si nechajme túto možnosť. Teda napríklad vytváranie inštancií kariet nedávajme do triedy balíku, ale inde.  Postup: 1. vytvorím kartu  2. vytvorím balík kariet  3. vytvorím hráča  4. interakciu s používateľom  5. správu hry  6. logiku hry Čierny Peter  KartaKaždá hracia všeobecná karta má nejaké špecifikum. Je to kráľ srdcový, kráľ pikový a podobne. V našom prípade máme páry a každá karta v páre je iná, spoločné majú to, že sú pár. Ako napríklad v žolíkových kartách máme 4 kráľov. Každý je iný, ale majú spoločné, že sú to králi.  package sk.jaro.CiernyPeter; public class Karta { private int cisloKarty; //každá karta ma iné číslo private int cisloParu; //každý prá má iné číslo, len dve karty majú to isté číslo páru public Karta(int cisloKarty, int cisloParu) { this.cisloKarty = cisloKarty; this.cisloParu = cisloParu; } public int getCisloKarty() { return cisloKarty; } public int getCisloParu() { return cisloParu; } } Balík karietĎalej budeme potrebovať tieto karty uložiť do balíku. Každá hra má niekoľko kariet, ktoré tvoria balík. Takže náš balík bude obsahovať zoznam kariet. Čo sa dá robiť s balíkom? Napríklad miešať karty, alebo z balíku môžeme vybrať kartu. Keď vyberám karty alebo miešam karty, tak tam musia nejaké byť. Lebo ak vyberiem postupne všetky karty z balíku, tak nakoniec budem mať balík prázdny. Skúste miešať prázdny balík kariet :) Preto si vytvorím aj pomocnú metódu, ktorá zistí, či je balík prázdny alebo nie. package sk.jaro.CiernyPeter; import java.util.Collections; import java.util.List; public class BalikKariet { private List<Karta> karty; //implementacia listu pre zachovanie poradia public BalikKariet(List<Karta> karty) { this.karty = karty; } public List<Karta> getKarty() { return karty; } public void zamiesajKarty(){ if(!jeBalikPrazdny()) Collections.shuffle(karty); } private boolean jeBalikPrazdny(){ return karty == null || karty.isEmpty(); } public Karta getKartu(){ Karta karta = null; if(!jeBalikPrazdny()) { karta = karty.get(0); //vytiahnem prvú kartu karty.remove(karta); //kartu odstránim z balíku } return karta; } }HráčDo každej hry potrebujem hráča, teda niekoho kto bude danú hru hrať. Rozhodol som sa, že hráčovi dám meno a karty v ruke. Keď vytváram nového hráča pomocou new, tak sa zavolá konštruktor danej triedy a tam si všimni, že som mu do ruky nedal nič, teda tam má prázdno. To preto, lebo ešte nedostal nijakú kartu pri rozdávaní, ale musí mať nejaké úložisko kde mu ich dám :) Je tam ešte metóda, ktorá má na starosti odstrániť z ruky hráča všetky páry. Kto by si to chcel nejako zovšeobecniť, tak môže. Teda do objektu Hrac, by dal len metódu na odstránenie jednej karty, alebo zoznamu kariet. A ktoré karty to budú to nechá na iný objekt, ktorý spravuje pravidlá hry Čierny Peter.  package sk.jaro.CiernyPeter; import java.util.ArrayList; import java.util.List; public class Hrac { private String meno; private List<Karta> kartyVRuke; public Hrac(String meno) { this.meno = meno; this.kartyVRuke = new ArrayList<>(); } public String getMeno() { return meno; } public List<Karta> getKartyVRuke() { return kartyVRuke; } public void odstranParyZRuky() { ArrayList<Karta> akeKartyOdstraniZRuky = new ArrayList<>(); for(Karta karta : kartyVRuke){ try { for (Karta k : kartyVRuke) { if (karta.getCisloParu() == k.getCisloParu() && karta.getCisloKarty() != k.getCisloKarty()) { akeKartyOdstraniZRuky.add(karta); akeKartyOdstraniZRuky.add(k); break; } } }catch (Exception e){ e.printStackTrace(); } } kartyVRuke.removeAll(akeKartyOdstraniZRuky); } }Ovládanie hryAkú chceš spraviť aplikáciu? Ako chceš komunikovať s používateľom? Cez grafické rozhranie? Cez konzolu, alebo inak? Teraz budeme robiť konzolovú interakciu, ale ak by si chcel robiť v budúcnosti grafické rozhranie, tak je vynikajúca idea spraviť interface, teda rozhranie, kde popíšem metódy aké chcem používať na interakciu s používateľom. Potom keď budeš robiť grafické rozhranie, tak si len zaimplementuješ toto nové rozhranie a niekde v kóde hry povieš, že teraz používať túto implemntáciu, a nemusíš prepisovať aj celú hru, lebo metódy sú tam rovnaké, len z iného zdroja.  Čo potrebujeme vypísať používateľovi, alebo čo od neho chcem získať? Počet hráčov, ich mená, akú kartu chceme hráčovi zobrať a chceme vypísať koniec hry. Ak chceš niečo viac, tak si to kľudne dorob.  package sk.jaro.CiernyPeter.rozhrania; import sk.jaro.CiernyPeter.Hra; import sk.jaro.CiernyPeter.Hrac; public interface IOvladanieHry { int vyberPocetHracov(); Hrac getMenoHraca(int i); int zoberKartu(Hrac hrac1, Hrac hrac2); void vypisKtoPrehral(Hra hra); }Teraz si musíme zaimplementovať toto rozhranie. Teraz máme len predpis metód ale nie ich vnútro. Budeme používať konzolu, ktorú budeme čítať pomocou scanneru a na konci hry si uzavrieme scanner. Každá metóda je jednoduchá, vypíšem na konzolu čo chcem a potom nechám používateľa, aby mi to napísal.  Všimni si, keď berieš nextInt(), tak sa to pokúsi zobrať číslo. Ak nájde niečo iné je to chyba a tú ošetríme. Kľudne si dorob viac ošetrení, podmienok a výpisov. Potom ale musíš zobrať aj zvyšok. Lebo čo spravil používateľ? Zadal číslo a stlačil enter. Ty si zobral len to číslo, ale nie aj enter. Preto tam máme ešte nextLine – to nám zoberie zvyšok riadku aj s enterom.  Čierny Peter bude hráč, ktorý ostal posledný v hre.  package sk.jaro.CiernyPeter.gui; import sk.jaro.CiernyPeter.Hra; import sk.jaro.CiernyPeter.Hrac; import sk.jaro.CiernyPeter.rozhrania.IOvladanieHry; import java.util.Scanner; public class OvladanieHry implements IOvladanieHry { Scanner scanner = new Scanner(System.in); @Override public int vyberPocetHracov() { int pocetHracov = 0; System.out.println("Zadaj počet hráčov (3 až 6):"); try { pocetHracov = scanner.nextInt(); scanner.nextLine(); } catch (Exception ex) { System.out.println("Nepodarilo sa načítať počet hráčov. Zadal si správne číslo?"); pocetHracov = vyberPocetHracov(); } return pocetHracov; } @Override public Hrac getMenoHraca(int i) { Hrac hrac = null; System.out.println(String.format("Zadaj meno pre hráča %d :", i)); String meno = scanner.next(); scanner.nextLine(); if (meno.equals("") || meno.equals(" ")) { System.out.println(String.format("Prosím znovu zadajte meno pre hráča %d :", i)); hrac = getMenoHraca(i); } else { hrac = new Hrac(meno); } return hrac; } @Override public int zoberKartu(Hrac hrac1, Hrac hrac2) { int zoberKartuCislo = 0; System.out.print(hrac1.getMeno() + " ,ktorú kartu cheš zobrať hračovi "+hrac2.getMeno()+"?: "); for(int i = 0; i < hrac2.getKartyVRuke().size(); i++){ System.out.print(i+", "); } try { zoberKartuCislo = scanner.nextInt(); scanner.nextLine(); } catch (Exception ex) { System.out.println("Nepodarilo sa získať akú kartu chceš zobrať. Zadal si správne číslo?"); zoberKartuCislo = zoberKartu(hrac1,hrac2); } return zoberKartuCislo; } @Override public void vypisKtoPrehral(Hra hra) { System.out.println("Čierny Peter je hráč "+hra.getHraci().get(0).getMeno()); scanner.close(); } }HraKaždá hra má niekoľko hráčov, má balík kariet s ktorými sa hrá a má aj ovládanie. Toto si zadefinujeme.  public class Hra{ private BalikKariet balikKariet; private int pocetHracov; private List<Hrac> hraci; private OvladanieHry ovladanieHry;V konštruktore tejto Hry si nastavíme to, čo vieme:  public Hra() { this.ovladanieHry = new OvladanieHry(); this.pocetHracov = ovladanieHry.vyberPocetHracov(); this.hraci = vytvorHracov(); }Nestavili sme balík kariet, pretože, ten je špecifický pre každý typ hry iný. V našom prípade sú to karty pre hru Čierny Peter. Tak tie si vytvorím neskôr.  V kuse kódu vyššie sme si vytvorili inštanciu ovládania hry a hneď sme ju aj použili pri výbere počtu hráčov. Metóda výber hráčov je jednoduchá, používateľa aplikácie sa pýtam ako sa volajú a rovno ich vytvorím a dám do zoznamu.  public List<Hrac> vytvorHracov() { ArrayList<Hrac> hraci = new ArrayList<>(); for(int i = 0; i < pocetHracov; i++){ Hrac hrac = ovladanieHry.getMenoHraca(i+1); hraci.add(hrac); } return hraci; }Logiku hry spustím a teda začnem ju hrať keď zavolám metódu zacniHrat.  public void zacniHru() { HraCiernyPeter ciernyPeter = new HraCiernyPeter(); //vseobecna logika ku kazdej hre balikKariet = vytvorBalik(ciernyPeter.vytvorKarty()); balikKariet.zamiesajKarty(); //rozdaj karty z baliku ciernyPeter.rozdajKarty(this); // pre hru urcim prveho hraca // v ciernom petrovi je to hrac s najviac kartami a ten zacina tahat Hrac prvyHrac = ciernyPeter.getHracaSNajviacKartami(getHraci()); //vsobecne na zaklade prveho hraca zistim jeho poradie v zozname hracov v hre int prvyHracIndex = getHraci().indexOf(prvyHrac); ciernyPeter.zlozHracomParyZRuky(this); ciernyPeter.odstranHracovZHry(this); if(!ciernyPeter.jeKoniecHry(this)){ //idu do kruhu az kym hraju aspon dvaja hraci ciernyPeter.kolobehHry(this,prvyHracIndex); } }Tu si vytvorím inštanciu triedy HraCiernyPeter, ktorá má na starosti logiku, ktorá je špecifická práve pre tento typ hry. Tú si vytvoríme neskôr.  Na tomto mieste si vytvorím aj balík kariet pomocou kariet, ktoré sa vytvárajú v triede HraCiernyPeter. Keďže som zvolil názvy metód také, aby sa ľahko chápali, tak tušíme čo dané metódy robia. Keď vytvorím balík a idem hrať, tak karty pomiešam, potom ich rozdám hráčom.  Musím si určiť, ktorý hráč začína ako prvý. V čiernom petrovi je to ten, čo má najviac kariet.  Ako sme si povedali na začiatku, tak keď majú hráči rozdané karty, tak si zložia všetky páry a tým sa zbavia nejakých kariet. Skontrolujem či azda niekto nemal všetko páry na ruke a tým pádom skončil v hre. Spýtam sa, či je koniec hry – či ostal len jeden hráč, ktorý má čierneho petra – lebo táto karta nemá pár. Ak nie, tak začnem kolobeh hry.  V tejto triede mám aj iné pomocné triedy. Skús si ich prejsť sám.  package sk.jaro.CiernyPeter; import sk.jaro.CiernyPeter.gui.OvladanieHry; import java.util.ArrayList; import java.util.List; public class Hra{ private BalikKariet balikKariet; private int pocetHracov; private List<Hrac> hraci; private OvladanieHry ovladanieHry; public Hra() { this.ovladanieHry = new OvladanieHry(); this.pocetHracov = ovladanieHry.vyberPocetHracov(); this.hraci = vytvorHracov(); } public BalikKariet getBalikKariet() { return balikKariet; } public List<Hrac> getHraci() { return hraci; } public OvladanieHry getOvladanieHry() { return ovladanieHry; } public List<Hrac> vytvorHracov() { ArrayList<Hrac> hraci = new ArrayList<>(); for(int i = 0; i < pocetHracov; i++){ Hrac hrac = ovladanieHry.getMenoHraca(i+1); hraci.add(hrac); } return hraci; } public BalikKariet vytvorBalik(List<Karta> karty) { return new BalikKariet(karty); } public void odstranHracaZHry(Hrac hrac) { //ak ma prazdnu ruku odstranim ho if(hrac.getKartyVRuke().isEmpty()){ getHraci().remove(hrac); } } public void ukonciHru() { ovladanieHry.vypisKtoPrehral(this); } public void zacniHru() { HraCiernyPeter ciernyPeter = new HraCiernyPeter(); //vseobecna logika ku kazdej hre balikKariet = vytvorBalik(ciernyPeter.vytvorKarty()); balikKariet.zamiesajKarty(); //rozdaj karty z baliku ciernyPeter.rozdajKarty(this); // pre hru urcim prveho hraca // v ciernom petrovi je to hrac s najviac kartami a ten zacina tahat Hrac prvyHrac = ciernyPeter.getHracaSNajviacKartami(getHraci()); //vsobecne na zaklade prveho hraca zistim jeho poradie v zozname hracov v hre int prvyHracIndex = getHraci().indexOf(prvyHrac); ciernyPeter.zlozHracomParyZRuky(this); ciernyPeter.odstranHracovZHry(this); if(!ciernyPeter.jeKoniecHry(this)){ //idu do kruhu az kym hraju aspon dvaja hraci ciernyPeter.kolobehHry(this,prvyHracIndex); } } }Logika hry Čierny PeterV tejto časti si vytvoríme karty špecifické pre túto hru. Teda 16 párov a jedného čierneho petra.  public List<Karta> vytvorKarty() { ArrayList<Karta> karty = new ArrayList<>(); int j = 1; for(int i = 0; i < 16; i++, j=j+2){ karty.add(new Karta(j, i)); karty.add(new Karta(j+1, i)); } karty.add(new Karta(33,-1)); //Čierny Peter return karty; }Keď rozdávam karty, tak ich rozdávam po jednej. Táto metóda by mohla byť aj v triede Hra, ale teoreticky pre iné typy hier by sa karty rozdávali inak. Tu rozdávam všetky karty.  Z balíku kariet zoberiem prvú kartu, z balíka ju odstránim a dám ju hráčovi do ruky. Tu je taký fígeľ, že idem cez všetky karty a robím modulo nad poradím karty s počtom hráčov, to mi zaručí, že budem dookola prechádzať hráčov až kým neskončí balík.  public void rozdajKarty(Hra hra) { BalikKariet balikKariet = hra.getBalikKariet(); List<Hrac> hraci = hra.getHraci(); int pocetKariet = balikKariet.getKarty().size(); for(int i = 0; i<pocetKariet;i++){ Hrac hrac = hraci.get(i%hraci.size()); hrac.getKartyVRuke().add(balikKariet.getKartu()); } }Keď sa chystám odstrániť hráčov z hry (keď nemajú už žiadne karty na ruke), tak ich nemôžem odstrániť počas toho ako cez nich prechádzam (iterujem). Preto si ich dávam do pomocného zoznamu a až po iterácii ich odstránim.  public void odstranHracovZHry(Hra hra) { //nemôžem mazať hraca z kolekcie ak cez nu prechadzam, preto si vytvorim novy zoznam a odstranim potom ArrayList<Hrac> hraciNaOdstranenie = new ArrayList<>(); for(Hrac hrac : hra.getHraci()){ //skontrolujem ci uz niekto neskoncil, teda ma prazdnu ruku //ak ano odstranim ho z hry if(hrac.getKartyVRuke().isEmpty()){ hraciNaOdstranenie.add(hrac); } } for(Hrac hrac : hraciNaOdstranenie){ hra.odstranHracaZHry(hrac); } }Keď niekomu zoberiem kartu z ruky, tak každému z tých hráčov pomiešam karty. Jednému hráčovi zoberiem kartu z kolekcie kartičiek čo má na ruke a druhému pridám do kolekcie ďalšiu kartu.  public void zoberHracoviKartu(Hrac hrac1, Hrac hrac2, Hra hra) { int poradieZobranejKarty = hra.getOvladanieHry().zoberKartu(hrac1,hrac2); Karta vzataKarta = hrac2.getKartyVRuke().get(poradieZobranejKarty); hrac1.getKartyVRuke().add(vzataKarta); hrac2.getKartyVRuke().remove(vzataKarta); //pomiesam karty v ruke Collections.shuffle(hrac1.getKartyVRuke()); Collections.shuffle(hrac2.getKartyVRuke()); }Samozrejme kolobeh hry ide nasledovne. Hráme dovtedy, kým nám v hre ostanú aspoň dvaja hráči. Začínam u prvého hráča, ktorý zoberie kartu druhému hráčovi. A tu som si natrafil na chybu. Predsa hráč s najväčším počtom kariet neťahá ale malo by sa ťahať jemu teda, ten čo je za ním ťahá od neho. Tak tu si to môžete opraviť, to nechám na vás. Pomôcka: upravte index prvého hráča v triede Hra, ak si pamätáte, tam sme ho určili.  public void kolobehHry(Hra hra, int prvyHracIndex) { while (hra.getHraci().size() > 1) { int pocetHracov = hra.getHraci().size(); Hrac hrac1 = hra.getHraci().get(prvyHracIndex%pocetHracov); Hrac hrac2 = hra.getHraci().get((prvyHracIndex + 1)%pocetHracov); zoberHracoviKartu(hrac1, hrac2,hra); zlozHracomParyZRuky(hra); odstranHracovZHry(hra); if(jeKoniecHry(hra)) { break; } prvyHracIndex++; } }Tu je potom celý kód triedy aj s inými pomocnými metódami.  package sk.jaro.CiernyPeter; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class HraCiernyPeter { public List<Karta> vytvorKarty() { ArrayList<Karta> karty = new ArrayList<>(); int j = 1; for(int i = 0; i < 16; i++, j=j+2){ karty.add(new Karta(j, i)); karty.add(new Karta(j+1, i)); } karty.add(new Karta(33,-1)); //Čierny Peter return karty; } public void rozdajKarty(Hra hra) { BalikKariet balikKariet = hra.getBalikKariet(); List<Hrac> hraci = hra.getHraci(); int pocetKariet = balikKariet.getKarty().size(); for(int i = 0; i<pocetKariet;i++){ Hrac hrac = hraci.get(i%hraci.size()); hrac.getKartyVRuke().add(balikKariet.getKartu()); } } public Hrac getHracaSNajviacKartami(List<Hrac> hraci) { int max = 0; Hrac hracMax = null; for(Hrac hrac : hraci){ int size = hrac.getKartyVRuke().size(); if(max < size){ max = size; hracMax = hrac; } } return hracMax; } public void zlozHracomParyZRuky(Hra hra) { for(Hrac hrac : hra.getHraci()) { hrac.odstranParyZRuky(); } } public void odstranHracovZHry(Hra hra) { //nemôžem mazať hraca z kolekcie ak cez nu prechadzam, preto si vytvorim novy zoznam a odstranim potom ArrayList<Hrac> hraciNaOdstranenie = new ArrayList<>(); for(Hrac hrac : hra.getHraci()){ //skontrolujem ci uz niekto neskoncil, teda ma prazdnu ruku //ak ano odstranim ho z hry if(hrac.getKartyVRuke().isEmpty()){ hraciNaOdstranenie.add(hrac); } } for(Hrac hrac : hraciNaOdstranenie){ hra.odstranHracaZHry(hrac); } } public boolean jeKoniecHry(Hra hra) { if(hra.getHraci().size() < 2){ hra.ukonciHru(); return true; } return false; } public void zoberHracoviKartu(Hrac hrac1, Hrac hrac2, Hra hra) { int poradieZobranejKarty = hra.getOvladanieHry().zoberKartu(hrac1,hrac2); Karta vzataKarta = hrac2.getKartyVRuke().get(poradieZobranejKarty); hrac1.getKartyVRuke().add(vzataKarta); hrac2.getKartyVRuke().remove(vzataKarta); //pomiesam karty v ruke Collections.shuffle(hrac1.getKartyVRuke()); Collections.shuffle(hrac2.getKartyVRuke()); } public void kolobehHry(Hra hra, int prvyHracIndex) { while (hra.getHraci().size() > 1) { int pocetHracov = hra.getHraci().size(); Hrac hrac1 = hra.getHraci().get(prvyHracIndex%pocetHracov); Hrac hrac2 = hra.getHraci().get((prvyHracIndex + 1)%pocetHracov); zoberHracoviKartu(hrac1, hrac2,hra); zlozHracomParyZRuky(hra); odstranHracovZHry(hra); if(jeKoniecHry(hra)) { break; } prvyHracIndex++; } } }[Image]MainNakoniec som si vytvoril triedu s jednou main metódou, ktorá sa nám bude volať pri spustení programu.  public static void main(String[] args) { Hra hra = new Hra(); hra.zacniHru(); } Celý Java program si vieš stiahnuť odtiaľto. TODO - úloha pre tebaDorobte výpis, aké karty boli hráčovi odstránené z ruky, keď zložil páry. Spravte ďalšie podmienky pri zadávaní údajov od používateľa, aby nebral karty, ktoré niekto nemá v ruke a podobne.   Autorom tohto blogu je Jaro Beňo, autor Java online kurzu, ktorý môžeš na Learn2Code študovať zadarmo.
Klávesové skratky v Exceli
Tipy a triky
05.07.2017
Skillmea

Klávesové skratky v Exceli

Pripravili sme pre teba zoznam klávesových skratiek pre Excel 2010. Tento blog popisuje najpoužívanejšie klávesové skratky, funkčné klávesy a niektoré ďalšie bežné klávesové skratky pre Microsoft Excel 2010 pre Windows. Ak používaš Mac, namiesto Ctrl je potrebné použiť klávesu Cmd. Kopírování Ctrl + C Kopírování Ctrl+X Vystřižení Ctrl + V Přilepení Formátování Ctrl+B Změní text na tlustý Ctrl+I Změní text na kurzívu Ctrl + U Podtrhne text Ctrl + = Přidá vnější orámování Práce se souborem F12 Uložit jako Ctrl + O Otevření stávajícího sešitu Ctrl+N Vytvoření nového sešitu Ctrl+S Uložení sešitu Výběr buněk Ctrl+Home Přesune kurzor do první buňky Podržte Ctrl a můžete označit více objektů najednou Shift Označte první objekt, podržte Shift a označte poslední objekt Ctrl + A Označí celou tabulku ve které se nachází právě označená buňka Ctrl + ← Přesune kurzor doleva na začátek tabulky Ctrl + → Přesune kurzor doprava na konec tabulky Ctrl + ↑ Přesune kurzor nahoru na začátek tabulky Ctrl+↓ Přesune kurzor dolů na konec tabulky Ctrl + mezera Označí celý sloupec Shift + mezera Označí řádek F2 Úprava textu právě označené buňky Různé Ctrl + F Najde nebe nahradí text Ctrl+Z Přesune o 1 krok dozadu Ctrl+Y Přesune o 1 krok dopředu F4 Změní adresu buňky z relativní na absolutní a naopak Ctrl + , Zobrazí nebo skryje všechny vzorce F1 Zobrazí nápovědu Ctrl + F1 Zobrazí nebo skryje pásy na hlavním panelu Alt + F8 Otevře nabídku pro nahrávání maker Shift + F2 Vloží do buňky komentář Súbor s klávesovými skratkami v Exceli si môžeš stiahnuť odtiaľto. Plus bonusová časť: videotutoriál, ako si upraviť vzhľad Excelu podľa svojich preferencií.
Najvtipnejšie programátorské GIFká
Tipy a triky
02.06.2017
Martina Baumann

Najvtipnejšie programátorské GIFká

Keďže sa teraz trošku pohybujem v IT komunite ľudí, poznám niekoľko programátorov. A tak si stále hovorím (alebo myslím), že skutočne trávia za PC celé dni a keď sa zahĺbia do svojho kódu, nesledujú, čo sa deje okolo nich. Viem, čo hovorím - chalani si totiž už tretí týždeň vôbec nevšimli, že som ostrihaná! Ako môže teda niekedy vyzerať taký život ortodoxného kódera?  GIF webyAk si programátor a zároveň chceš propagovať svoju prácu povedzme prostredníctvom blogov alebo iných príspevkov, môžu sa ti niekedy hodiť do článkov aj vtipné GIFká. Všeobecne nemusíš byť len programátorom, na svoje si príde každý copywriter, bloger, redaktor, ktorý čo-to píše a potrebuje texty doplniť o nejaké to dobré GIFko. Ktoré webky majú tie naj GIFká? Čítaj ďalej! Takže, kde zaručene nájdeš GIF, ktoré práve potrebuješ? Čekuj najmä weby ako giphy.com - samozrejme, že ti ako prvé nemôžem ponúknuť nič iné ako Giphy, pretože práve tento web navštevujú denne milióny užívateľov (niektoré zdroje uvádzajú desiatky miliónov a iné zas sa pohybujú v stovkách miliónov) a je to určite najrozšírenejší zdroj GIFiek pod slnkom. Tu nájdeš všetko, používam ho aj ja úplne najčastejšie a musím priznať, že patrí medzi moje naj. Ďalšie weby, ktoré odporúčam, sú napríklad thecodinglove.com, reddit.com,  reactiongifs.com. Pre tých prieberčivých je ešte jedna možnosť a to vytvoriť si také GIF, aké presne potrebuješ. Ak si chceš urobiť vlastné GIF, tak určite na stránke makeagif.com. Späť k tým našim programátorom. Naozaj si myslím, že to môžu byť vtipní ľudia a vôbec s nimi nemusí byť až taká nuda. Aby som ťa presvedčila, vybrala som nasledujúce GIFká.  Pondelok ráno: Takže, zľahka si vyťukám svoj kód...[Image] Utorok (niekedy okolo obeda): A takto môže vyzerať homeoffice :)[Image] Streda (ráno) - still in progress[Image] Streda (neskoro poobede): Takto zas môže vyzerať, keď je kríza alebo sa jednoducho nedarí a kód si robí, čo chce[Image] Stále streda? Možno už štvrtok? Svitá na lepšie časy?[Image] Na druhej strane - nič nepoteší programátora viac, ako keď jeho kód skutočne funguje tak, ako má  A nasleduje nefalšovaná radosť! ...alebo aj takto (väčšinou už niekde okolo 18:00 h piatok) Programátor musí mať prstoklad! Alebo? Keď všetko fičí, ako má  Nadčasové CSS gifko, ktoré nikdy neomrzí:)[Image] Zmením len tento jeden riadok v kóde:[Image] Skutočne 👇 [Image] Tip na záver Mne osobne sa páči napríklad tento blog, ktorý ma vždy zaručene pobaví.  Páčil sa ti tento blog? Venuj mu 👍  Ktoré GIFko sa ti páčilo najviac? Napíš mi ho do komentára 👇  
Ako naprogramovať kalkulačku v Jave
Tipy a triky
05.05.2017
Skillmea

Ako naprogramovať kalkulačku v Jave

Dnes sa naučíme základné operácie v Jave, ktoré si ukážeme pri programovaní jednoduchej kalkulačky. Okrem iného sa naučíme: • vypísať zadaný text • uložiť hodnoty pre premenné typu String a int • vytvorenie vstupu pre užívateľa • parsovanie textu na čísla • podmienky a jednoduché vetvenie • základné matematické výpočy v Jave Program kalkulačka v Jave Čo teda chceme, aby náš program vedel urobiť? 1. Dokáže zaznamenať 2 čísla zadané užívateľom do konzoly 2. Dokáže podľa inštrukcií zadaných užívateľom do konzoly určiť operáciu (+, -, x, /) 3. Dokáže zo zadaných udajov vykonať výpočet a výsledok vypísať Po dokončení by program mal vyzerať nasledovne:[Image] *nezabudnite si nastaviť podporu UTF 8, pretože znaky ľšťžýážä to brať nebude Počas programovania vlastnej kalkulačky ju môžete použiť ako šablónu a pokiaľ objavíte vo svojom programe chybu, môžete si ju podľa šablóny opraviť.  Poďme si vysvetiť, ako sme takýto program vytvorili. Zatiaľ si nebudeme vysvetľovať základnú štruktúru programu, pretože sa jedná o zložité a pre začiatočníkov ťažko pochopiteľné pojmy (balík, trieda, metóda ...). Viac sa o štruktúre programu dozviete, keď sa budeme venovať objektovo orientovanému programovaniu (OOP). Do programu opíšte to, čo vidíte v šablóne.  Vypísanie textu Jednou z najjednoduchších vecí, ktoré budeme od našej aplikácie chcieť, je vypísať nejaký text. K tomu použijeme príkaz System.out.println(“Text“) ; Ako sa dozvieme neskôr, do zátvoriek môžeme namiesto textu v úvodzovkách napísať názov premenej a program nám vypíše jeho program. Tento príkaz nám odriadkuje text v programe, pokiaľ chceme namiesto odriadkovania pokračovať na rovnakom riadku, použijeme príkaz System.out.print(“Text“); Bodkočiarka nám predstavuje koniec jedného príkazu.  V našom programe ho použijeme k vypísaniu inštrukcií pre užívateľa. Prázdne úvodzovky nám poslúžia pre vytvorenie prázdneho riadku.  Premenné typu String a intPremenné sú názvy, ktoré zastupujú určité číslo alebo text, ktorý je v nich uložený. Pred názvom premennej určujeme typ premennej. Pre číslo slúži int a pre text String.  Ukážme si niekoľko príkladov:  int a = 5; String b = “Ahoj“; Pokiaľ by sme chceli v kóde vypísať premennú, použijeme príkaz System.out.println(a); Samozrejme môžeme vypísať niekoľko premenných vedľa seba kľudne aj s obyčejným textom a to pomocou znamienka + . Kód by potom mohol vyzerať nasledovne:  System.out.println (a + b + “Text“) ; Hodnoty premenných sa môžu počas priebehu programu meniť. Pokiaľ budeme operovať s premennou, ktorá už bola definovaná (bol u nej určený typ), nebudeme znovu jej typ určovať:  int a= 5; a=6; Dávajte si pozor na veľké a malé písmená. Pri Stringu sa píše prvé písmeno veľké, pretože sa jedná o referenčný dátový typ, zatiaľčo int je primitívny dátový typ. Tým sa však zatiaľ nebudeme zaoberať.  V našom programe si určíme premenné int cislo1, int cislo2, int vysledok a String operácia.  Vytvorenie vstupu pre užívateľaĎalej budeme chcieť, aby bol náš program interaktívny. Teda, aby tu dochádzalo k obojstrannej komunikácii medzi počítačom a užívateľom. K tomu si vytvoríme užívateľský vstup. Najskôr si úplne na začiatok kódu pridáme metódu import java.util.Scanner; ktorá nám sprístupní funkcie pre vstup užívateľa z konzoly. Do hlavného bloku kódu si potom nadefinujeme premennú, ktorá nám ponesie Scanner:  Scanner sc= new Scanner (System. in) ; Zátvorka nám tu bude definovať diakritiku, ktorú použijeme. Pokiaľ vám nebude fungovať tento kód, skúste napísať: Scannee sc = new Scanner(System.in, “Windows-1250“); Vstup vykonáme tak, že ho priradíme ako hodnotu k premennej pomocou príkazu:  sc. nextLine() ; Mohlo by to vyzerať asi takto: String vstup = sc. nextLine() ; V programe získame od užívateľa hodnotu pre cislo1, cislo2 a operáciu Počítač prečíta vstupy od užívateľa vždy ako text. Čo však v prípade, keď budeme chcieť od užívateľa zadať číslo? K tomu slúži tzv. parsovanie. ParsovanieFunkcia parsovania nám slúži, pokiaľ chceme previesť užívateľom zadaný text na číslo. K tomu použijeme funkciu int nazovpremennej = Integer.parseInt(sc.nextLine() ); V našom programe nám poslúži na prevedenie vstup u premenných cislo1 a cislo2 z textu na číslo. PodmienkyPokiaľ chceme, aby prebehla časť kódu len pokiaľ sú splnené určité podmienky, použijeme k tomu funkciu if. Pokiaľ nie sú splnené podmienky, časť kódu bude preskočená a bude sa pokračovať až za ňou.  Podmienky píšeme do zátvoriek za kľúčové slovo if a príkazy do zložených zátvoriek.  a=1 if (a==1) { System.out.println(“Ahoj“) ; }Pri podmienkach používame ==  Pri textových premenných používáme namiesto == funkciu equals() String a = “Ahoj“ if (a. equals(“Ahoj“){ System.out.println (“Čau“) ; }Je možné používať ďalšie matematické funkcie ako napríklad porovnávanie (<, >). V našom programe pomocou štyroch if funkcií zistíme, akú zadal užívateľ operáciu a podľa toho vykonáme výpočet.  Matematické operácieV Jave môžeme pracovať s rôznymi matematickými funkciami:  Napríklad int a=1+2; Samozrejme je možné nahradiť čísla premennými, napr. int a= b – c ; V našom programe vypočítame výsledok pomocou vysledok= cislo1 [operacia] cislo2; Dúfam, že sa vám podarilo vytvoriť vlastnú funkčnú kalkulačku. Pokiaľ stále máte problémy, skúste ešte skontrolovať, či: • nechýba na konci niektorého príkazu bodkočiarka,  • sú správne umiestnené zložené zátvorkyJsou správně umístěné složené závorky  • sú veľké a malé písmená zapísané správne  Pre dnešok to bude všetko. Java videotutoriál pre začiatočníkov nájdete tu a úplne zadarmo. 
Tvorba fotomontáže v 7 krokoch
Tipy a triky
10.04.2017
Skillmea

Tvorba fotomontáže v 7 krokoch

Povedal by si, že budeš niekedy schopný vytvoriť fotomontáž vo Photoshope? Prečítaj si tento článok a dodrž nasledovné postupy. Vďaka tomu budeš schopný vytvoriť akúkoľvek fotomontáž. Hovoríš si, že to je veľmi náročné? Určite nie! Tieto kroky sú až primitívne jednoduché, len možno zložito znejú. Každá jedna fotomontáž je spojenie viacerých vrstiev. Keď to zveličíme. K tomu patrí aj správna konštelácia farieb. Čo to znamená? Mali by sme nastaviť farebné tóny, aby boli zhodné na všetkých vrstvách. Ak nebudú farebne prispôsobené vrstvy, nemôže vzniknúť fotomontáž. Ako som postupoval pri tvorbe fotomontáže?1. Vybrať správne fotografie - správny uhol a správne postavenie daného objektu. Je logické, že by som nemohol použiť fotografie, kde by objekt bol odfotografovaný vždy z inej perspektívy. Výsledok by bol nerealistický. Obrázky do svojich montáží môžeš nájsť napríklad tu. 2. Ešte pred tým musím vedieť čo chcem vytvoriť. Darmo sa budem baliť na cestu, keď nebudem vedieť kam idem :) Musím si ujasniť tému. Čo má vykresliť moja fotomontáž? Akú emóciu chcem vzbudiť? Aké farby budem chcieť mať vo fotomontáži? 3. Zvoliť najlepšie nástroje na výber. Musím zobrať do úvahy pozadie, z ktorého budem chcieť vybrať daný objekt. Je pozadie jednoduché, jednotvárne? Alebo je zložité? To znamená, že je nepravidelné? Inak sa vyberie objekt, kde je pozadie čierne alebo biele, ako keď je objekt odfotený v skutočnom živote, niekde v lese napríkad. Tam už to pozadie je trosku náročnejšie. Alebo nachádza sa na fotke tieň daného objektu? V takomto prípade nedokážem jednoducho vybrať objekt z fotografie. Tieto a ešte veľa iných otázok by som si mal položiť, skôr ako sa rozhodujem, ktorý nástroj by som mal využiť. Najlepšie sa pracuje s nástrojom PenTool - pero. Na zahodenie nie je ani magnetické laso alebo kúzelnícka palička či nástroj na rýchly výber. Každý z týchto nástrojov má svoje unikátne použitie. 4. Úvodné pospájanie vrstiev do dokumentu - aby som videl, ako mi pasujú vrstvy dokopy. Z praxe to funguje tak, že mám nájdených aspoň 10 alternatívnych obrázkov, ktoré kombinujem a zisťujem, ktoré mi pasujú k sebe najviac. 5. Farebná korekcia – musím zariadiť, aby bola farebná zhoda na mojich vrstvách. To znamená, aby všetky vrstvy, ktoré sú na scéne, mali rovnakú tonalitu – že sú z jedného prostredia. Nemôžem spojiť dva obrázky, kde jeden obrázok bude vybraný z letného prostredia a druhý obrázok zo zimného prostredia :) K dispozícii máme veľa nástrojov, ktoré nám pomôžu vytvoriť takúto farebnú zhodu.   • Krivky, úrovne – vďaka týmto dvom nástrojom dokážem krásne vyladiť tóny vo všetkých kanáloch, aj teplé aj studené tóny. Musím len rozumieť tomu, čo je histogram a čo nám ukazuje. 6.   • Hue/saturation – pomocou tohto nástroja dokážem vyladiť tri body na jednej vrstve – odtieň (hue), saturáciu (presýtenie), farby a svetlosť (lightness). Kombináciou týchto príkazov dokážem nastaviť tonalitu na mojej vrstve. 7.   • Color balance – vďaka tomuto nástroju nastavujem pomocou “sliderov” konkrétne farby na mojej vrstve. Na výber mám, či chcem upravovať midtóny, svetlé miesta alebo tmavé miesta. Keď si vyberiem konkrétnu časť, môžem obyčajným posúvaním meniť tonalitu farieb. Chcem pamätať na to, že cyan, modrá a zelená farba mi nastavujú studené tóny a naopak, červená, magentová a žltá farba mi nastavujú teplé tóny. 8.   • Jednoduché filtre – color lookup, Photo filter – určím konkrétne prednastavené hodnoty, ktoré mi upravia fotografiu. 9.   10. Prepojím môj obrázok s módmi prehliadania. Módy prelínania mi umožnia prepojiť dve vrstvy, čiže prepojiť jednu vrstvu s druhou, ktorá je pod ňou. Tieto módy boli použité pri neutralizácii osvetlenia na obrázku s autom. Na auto dopadalo z ľavej strany príliš veľa svetla a bolo potrebné znížiť hodnotu bielych miest, vzniknutých vplyvom svetla. Výborne mi poslúžili módy, vďaka ktorým som znížil osvetlené časti. Konkrétny postup od vytvorenia vrstvy až po nastavenie správneho módu prelínania nájdeš v mojom online kurze. 11. Finalizačné úpravy – to sú úpravy, ktoré sa vykonávaju na konci každej fotomontáže. Buď sa nastaví farebná tonalita na celom obrázku, použijem rôzne vzory alebo textúry na vylepšenie výsledku, alebo použijem Dodge and Burn techniku na ztmavenie tmavých častí a zosvetlenie svetlých častí. V tejto fotomontáži som použil Gradient map, teda prechodové mapy, kde som nastavil hodnotu tmavých pixelov a hodnotu svetlých pixelov a prepojil to s módom prelínania. Konkrétne to bol Overlay. Kompletný postup nájdeš v kurze. Toto by bolo všetko, čo sa týka tvorby fotomontáže. Na obrázku môžeš vidieť rýchly postup. Ale tu máš aspoň v skratke opísané, ako by si mal aj ty postupovať, keď si budeš chcieť vytvoriť vlastnú fotomontáž. Už si vytvoril svoju vlastnú fotomontáž, ale postupoval si inak? Podeľ sa o svoje poznatky do komentára :)  Autorom článku je Marek Chrenko.
12 zdrojov na fotky pre tvoj web zadarmo
Tipy a triky
31.03.2017
Martina Baumann

12 zdrojov na fotky pre tvoj web zadarmo

Každý, kto má svoj vlastný blog alebo webstránku, veľmi dobre pozná problém s fotografiami a obrázkami k článkom, príspevkom a blogspotom. Pokiaľ nie si vášnivý fotograf a nemáš v zálohe plno vlastných ilustračiek a nefotíš ako divý všetko, čo ti príde pod ruku, musíš rozmýšľať, aký obrázok použiť pri písaní vlastných textov. Povedzme si úprimne, kto dnes už číta články bez fotiek? Naopak, fotka je to prvé, čo človeka hneď upúta a so záujmom klikne na publikovaný materiál. A práve spomínané foto ruka v ruke s dobrým titulkom namotivuje potencionálneho čitateľa, aby sa príspevkom zaoberal (a v tom lepšom prípade zdieľal aj na fejsbúk, kde potom celý večer sleduješ lajky). Pozor na autorské práva!Internet je plný profesionálnych fotografií, problém však je s autorskými právami. Používať cudzie materiály je totiž neetické, na druhej strane vám môže za autorskú fotku hroziť aj mastná pokuta. Čo teda (ne)robiť, ak nemám žiadnu databázu obrázkov a nemám financie na používanie platených služieb agentúr, ktoré poskytujú obrazový servis? V prvom rade určite nesťahovať autorskú fotku, tiež by sa ti nepáčilo, keby sa niekto prezentoval tvojou prácou.  Nerob paniku, na internete nájdeš aj fotky, ktoré sú free!Opäť tu je pomocník internet - treba však hľadať na správnych webstránkach a teda takých, čo sú "free". Ako? Stále existuje dostatočné množstvo zdrojov, odkiaľ môžete čerpať obrázkové materiály zdarma na ďalšie použitie bez rizika pokút. Tak a teraz odkiaľ stiahnuť obrázky pre tvoj projekt? Aké sú THE BEST FREE PHOTOBANKS? FLICKR Nekonečné milióny a bilióny fotiek (množstvo z nich free) - to je Flickr, komunita, miesto, nevyčerpateľný zdroj obrázkov, ktorý využívajú milióny ľudí. Veľmi populárny, nezabudni však čeknúť ich licenciu. Cez Creative Commons si teda vieš pozrieť presné podmienky používania fotografií a niekoľko možností, ako môžeš obrázok použiť. PIXABAY Ďalšia webka, na ktorej môžeš nájsť, sťahovať a zdieľať obrázky, je Pixabay - pričom stránka uvádza, že všetky obrázky sú publikované v rámci Creative Commons. Výhodou je, že obrázky sa dajú nielen sťahovať, ale tiež upravovať a ďalej distribuovať aj na komerčné účely. A to nie je všetko, okrem obrázkov ponúka aj vektory a rôzne ilustrácie. FREEPIK Zaujímavé možnosti obrázkov ponúka aj Freepik, ktorý je ako inak - zdarma! Databáza vyhľadáva obrázky pomocou niekoľkých zdrojov, preto sa väčšina používateľov zhoduje v tom, že táto webka ti ušetrí kopec času. Vyhľadáš si konkrétnu fotku podľa názvu alebo kategórie. PEXELS Pexels má tiež bohatú databázu rôznych obrázkov, ktoré sú na voľné použitie, pričom tiež fungujú na princípe Creative Commons. A opäť hurá - všetky fotky sú použiteľné na komerčné účely. UNSPLASH Parádne fotky zadarmo a všetky na komerčné využitie pod Creative Commons Zero licenciou. Môžeš sa prihlásiť do ich newslettra a dostávať 10 fotiek vo vysokom rozlíšení každý 10 dní. DREAMSTIME Dreamstime má sekciu, v ktorej najdeš fotky zadarmo. Je potrebné vytvoriť si na stránke účet. PICJUMBO Fotobanka českého fotografa a dizajnéra Viktora Hanáčka, ktorý túto stránku založil v roku 2013 ako reakciu na odmietanie jeho fotografií klasickými platenými fotobankami z dôvodu nedostatočnej kvality. Doteraz z nej bolo stiahnutých používateľmi niekoľko miliónov obrázkov. CANVA Pri slove Photoshop chytáš paniku a srdce ti začína divoko biť? Pokiaľ si naň netrúfaš a máš mať z neho nočné mory, použi bezplatný servis, ktorý ponúka CANVA - je jednoduchá, rýchla a efektívna. Dokážeš v nej tvoriť kopec ilustračných obrázkov, ponúka množstvo voľných obrázkov a grafík. Stačí sa len zaregistrovať prostredníctvom mailu alebo Facebooku a ideš na to! Na začiatok ti úplne postačí. Ďalšie free databázyhttps://morguefile.com/ https://www.sitebuilderreport.com/stock-up http://www.rgbstock.com/ https://stocksnap.io/ + ďalšie desiatky zdrojov, ktoré na internete existujú. Tip: s CC Search dokážeš vyhľadávať obrázky podľa zvolenej licencie cez externé služby, ako napr. Flicke alebo Google Images. CENNÁ RADA NAD ZLATO Spomínané databázy ti môžu zjednodušiť tvoju prácu, nezabudni si však pozorne prečítať pravidlá, môžeš sa tak vyhnúť mnohým problémom - tu určite platí: Dvakrát pozri, prever a raz stiahni! A čo sa týka pravidiel, ktoré by sa nikdy nemali porušiť - takéto fotky určite ďalej nepoužívaj na ďalší predaj, prípadne si nimi neplň svoju online databázu. Mysli na zdroj! Aj keď sú obrázky z free databáz úžasným pomocníkom, treba si vždy pozrieť a prečítať podmienky používania a licenciu danej fotobanky. Každá ich môže mať iné,  môže ich priebežne meniť a podobne. Niektoré databázy zvyknú žiadať o uverejnenie spätného odkazu, odkiaľ si fotku čerpal. Čiže vždy si pre istotu prever, ako je to s licenciou a nezabudni zdrojovať, zdrojovať, zdrojovať. Zlaté pravidlo, ktoré slúži ku cti :) Používaš fotobanky alebo obrázky zadarmo? Svoje prípadné ďalšie tipy na stránky s free fotkami napíš do komentára, radi rozšírime náš zoznam.
16 Photoshop pluginov, ktoré ti zjednodušia život
Tipy a triky
13.01.2017
Skillmea

16 Photoshop pluginov, ktoré ti zjednodušia život

Áno, každý z nás chce ušetriť čas a platí to aj pri Photoshope. Preto existujú pluginy. Teda akési rozšírenia, vďaka ktorým ušetríš kopu času. Určite zvládneš pracovať aj bez pluginov, ale bude to pracnejšie. Už ako názov hovorí: plug (vložiť) - in (do niečoho). Dobre, stačí slovíčkarenia. Jedná sa o rozšírenie do aplikácie. Tí počítačovo zdatnejší poznajú, ako sa kedysi inštalovali také pluginy, kde ste museli nájsť správny priečinok, rozbaliť obsah zazipovaného súboru, prekopírovať to tam, reštartovať Photoshop a bolo to. Teraz to je o troška jednoduchšie. Existuje aplikácia Adobe Extension Manager (je zadarmo), vďaka ktorej dokážeš vyhľadávať pluginy každého druhu a každej chuti pre rôzne aplikácie – samozrejme od Adobe 😊 Stačí zadať kľúčové slovo, čo chceš aby plugin vyriešil za teba a vybehne ti niekoľko príkladov pluginov, ktoré si jednoducho nainštaluješ a máš to v aplikácii. Nemusíš používať Adobe Extension Manager. Tiež môžeš ísť na oficiálnu stránku tvorcu pluginu a odtadiaľ si stiahnuť tento plugin a nainštalovať – ale pozor: platí, že plugin by sa mal vedieť „nainštalovať sám“. Adobe Photoshop CC 2017 obmedzil inštaláciu pluginov „piate cez deviate“. Alebo to už bol CC 2015? Doba sa mení. Všetko, čo má príponu XZP (teda pluginové balíky) by sa malo inštalovať prostredníctvom Adobe Extension Manager. Dosť rozprávania. Prejdime k tomu dôležitejšiemu. Ktoré sú to najpoužívanejšie pluginy ktoré ti ušetria čas? A sú teda aj bezplatné 😊 Môže ich byť viac alebo menej, ale toto sú jedny z najobľúbenejších: Google Nik CollectionToto neber doslova. Je to Photoshop od Googlu. Vďaka tomuto pluginu dokážeš odstrániť noise (šum) z fotografie, vieš sa pohrať s tonalitou obrázkov alebo zvoliť rôzne prednastavené filtre aby tvoje fotky vyzerali ešte lepšie. Layers ControlVeľmi užitočný nástroj, vďaka ktorému si zachováš poriadok vo svojich vrstvách. Skontroluje a odstráni prázdne vrstvy, rýchlo premenuje vrstvy alebo prekonvertuje vrstvu na Smart Object. Sú to banálne veci? Môžu byť, ale pri pravidelných úpravách vrstiev si tento plugin zamiluješ. VelositeyTaktiež veľmi užitočný plugin pre dizajnerov. Pomocou neho dokážeš navrhnúť design stránky za „pár“ sekúnd. Cut and slice meZabudni na stratený čas pri nastavovaní rozmerov na obrázku. Tento plugin má uložených mnoho rozmerov, ktoré určite využiješ. Size MarksUž si potreboval zistiť medzeru medzi dvoma elementami? Ako si to skúšal? Existujú krkolomné spôsoby, ale víťazom sa stáva... Shadow generatorPoznáš flat design? Je to celkom populárne. Hlavne keď sa rozmáha minimalizmus. Long shadows, teda dlhé tiene sú neodmysliteľnou súčasťou flat designu. ComposerPotrebuješ vykonať jednu zmenu na 15 vrstvách? Jedna zmena na prvej vrstve, druhá zmena na druhej vrstve, tretia zmena a prejde aj pol hodina 😁  Vykonaj kľudne zmenu aj na 100 vrstvách pomocou pár klikov. Harry’s filterKto vie kto bol ten Harry, ale musel to byť niekto šikovný keď bol po ňom pomenovaný tento plugin. V ňom nájdeš desiatky prednastavených efektov ktoré sú pripravené na použitie. DupplicatorJednoducho .. kopíruj vrstvy toľko krát, koľko bude potrebné. Už sme spomenuli niekoľko pluginov na prácu s vrstvami. Tak hádam si vyberieš jeden z nich. Výborné pluginy, ale platené: WebZapDesignuj weby jak páááán. Tento plugin ti v tom pomôže. RenamyMôžeš, nemusíš použiť, tentokrát zvládneš premenovať aj 100 vrstiev naraz. PSD CleanerPriznajme si to, sme trošku bordelári. Tento plugin nám pomôže udržiavať naše PSDčko čisté a prehľadné. Napríklad odstráni nepotrebné alebo nepoužité vrstvy. CSS HatPre front-end kóderov to môže byť alfa a omega. Všetko, čo vytvoria vo Photoshope vedia skonvertovať do CSS3. Retouching panelŽe profesionálna retuš je ťažká na naučenie? Nemusí to tak byť vždy. FlaticonA sme zase pri flat designe. Bohatá databáza ikoniek, ktoré využijete pri nejednej infografike. Super SprayŽe Photoshop má málo prednastavených brushov? Nevadí, rozšír si kolekciu brushov. S týmito brushmi môžeš doslova kresliť čokoľvek. DOSLOVA! Možno si povieš, že celkom slušná pálka za takéto pluginy, ale keď to využiješ a zarobí ti to, prečo to nevyužiť? Takto to platí aj pre online kurzy o Photoshope. Investovaný čas do týchto kurzov sa môže premeniť napríklad v sľubnú prácu grafika. Toto bol zoznam obľúbenejších pluginov. Poznáš iné, ktoré sú tiež v niečom užitočné? Podeľ sa o ne v komentároch.
Najpoužívanejšie klávesové skratky v Adobe Photoshop
Tipy a triky
02.01.2017
Skillmea

Najpoužívanejšie klávesové skratky v Adobe Photoshop

Človek je tvor lenivý, resp. tvor vynaliezavý a ešte aj v počítačovej ére sa vynašiel a zaviedol klávesové skratky. Ale musí sa uznať, že klávesové skratky dokážu ušetriť naozaj veľa času. Ľudia, ktorí ovládajú klávesové skratky v programoch sa nazývajú PC ninjovia :) Určite budeš potrebovať veľké odhodlanie a dávku trpezlivosti, aby si sa stal takýmto machrom, ale výsledok stojí za to. Ušetríš veľké množstvo času, ktoré by si inak stratil pri rozklikávaní jednotlivých záložiek a hľadaní konkrétnych príkazov ... a určite ohúriš kolegov alebo kamošov, keď uvidia čo dokážu tvoje prsty na klávesnici.[Image] Chceš sa stať PC ninjom vo Photoshope? Pripravili sme pre teba zoznam 26 najpoužívanejších skratiek vo Photoshope, veríme, že ti pomôžu a využiješ ich. Aaaa pozor, aby sa ti nezaplietli prsty z tých klávesovych kombinácii :) [Image] Zoznam najpoužívanejších klávesových skratiek vo Photoshope PDF verziu tejto infografiky s klávesovými skratkami si môžeš stiahnuť odtiaľto. UPDATE 10.1.2017: pribudol videotutoriál, ktorý ťa prevedie tvorbou infografiky. Sleduj video, skúšaj a vyrob svoju vlastnú grafiku: Poznáš aj iné klávesové skratky, ktoré zjendodušujú prácu? Podeľ sa a napíš ich do komentu dole. Mimochodom, páči sa ti táto infografika? Je to moderný spôsob podávania informácii v dnešnej počítačovej ére. Určite by sa to zišlo aj tebe. Nauč sa ako vytvoriť takúto infografiku v našom kurze Visual Design Digital: úprava fotiek vo Photoshope, kde si ukážeme ako sa vytvorí takáto infografika krok po kroku. Tiež si vysvetlíme technické predpoklady, ktoré by mala spĺňať vytvorená infografika. Určite to bude stáť za to ;)