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ť.

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. 
Aká je idálna aplikácia na fotomontáž fotiek
Tipy a triky
10.04.2017
Skillmea

Aká je idálna aplikácia na fotomontáž fotiek

Povedal by si, že budeš niekedy schopný vytvoriť fotomontáž fotiek vo Photoshope? Prečítaj si tento článok a dodrž postupy. Vďaka tomu sa naučíš vytvoriť akúkoľvek fotomontáž, dokonca aj pomocou rôznych aplikácií na fotomontáž. Možno ti to znie náročne, ale v skutočnosti sú tieto kroky jednoduché, len vyžadujú trochu cviku. Každá jedna fotomontáž pozostáva zo spojenia viacerých vrstiev. K tomu patrí aj správne nastavenie farebných tónov, aby všetky vrstvy pôsobili zhodne a vytvorili ucelený výsledok. Ako som postupoval pri tvorbe fotomontáže?1. Výber správnych fotografií – Základom je nájsť obrázky, ktoré majú rovnaký uhol a správne postavenie objektov, aby výsledná montáž vyzerala realisticky. Správne zdroje obrázkov nájdeš v našom online kurze. 2. Určenie témy a emócie – Pred začiatkom je dôležité si určiť tému fotomontáže. Chceš vytvoriť scénu so zameraním na letnú atmosféru alebo zimnú? Definuj si farebnú schému a tón, ktorý chceš vyvolať. 3. Zvoliť nástroje pre výber objektov – Zváž, či pozadie na fotografii je jednoduché alebo zložité, prípadne či obsahuje tiene. Jednoduché pozadie zvládneš s nástrojmi ako Magnetické laso či Kúzelná palička, ale pri náročnejších scénach sa odporúča použiť PenTool. Viac o nástrojoch výberu nájdeš v našich vzdelávacích kurzoch zameraných na Photoshop. 4. Úvodné pospájanie vrstiev – Spojenie vrstiev do dokumentu ti pomôže vizuálne posúdiť, ktoré fotografie sa k sebe najlepšie hodia. Často je vhodné mať pripravených viacero alternatív, ktoré môžeš kombinovať. 5. Farebná korekcia – Tento krok zahŕňa nastavenie farebnej zhody. Napríklad, letné obrázky vyžadujú inú tonalitu než zimné, preto je dôležité nastaviť rovnakú tonalitu vo všetkých vrstvách. 6. Nástroje ako Krivky a Úrovne – Tieto funkcie pomáhajú doladiť teplé a studené tóny na jednotlivých kanáloch. V našich inovačných vzdelávacích kurzoch sa naučíš pracovať s histogramom a správne nastaviť tieto nástroje. 7. Hue/Saturation a Color Balance – Pomocou nich dokážeš dolaďovať farebné odtiene jednotlivých vrstiev. Kombináciou príkazov na tonalitu, saturáciu a svetlosť môžeš dosiahnuť želanú harmóniu medzi všetkými vrstvami. 8. Jednoduché filtre – Filtre ako Color Lookup a Photo Filter sú užitočné na nastavenie špecifických farebných efektov, ktoré dodajú fotomontáži jednotnú atmosféru. 9. Módy prelínania – Tieto módy umožňujú prepojiť vrstvy tak, aby sa eliminovali nevhodné svetelné efekty. Pri nastavovaní svetlých a tmavých miest je možné použiť rôzne módy prelínania, ktoré pomôžu dosiahnuť realistickejší efekt. Postupy s módmi prelínania nájdeš aj v našom online kurze Umelá inteligencia (AI). 10. Finalizačné úpravy – Finálne úpravy zahŕňajú nastavenie tonality pre celý obrázok alebo pridanie textúr a vzorov. Technika Dodge and Burn zvýrazní kontrasty medzi svetlými a tmavými časťami. Na dosiahnutie efektu môžeš tiež použiť Gradient map, ktorá nastaví hodnoty svetlých a tmavých pixelov. Viac o týchto technikách sa dozvieš v našich kurzoch, ktoré pokrývajú všetky aspekty profesionálnej fotomontáže. 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.
Obrázky na stiahnutie úplne zadarmo
Tipy a triky
31.03.2017
Martina Baumann

Obrázky na stiahnutie úplne 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. Online kurzy zamerané na umelú inteligenciu dnes ponúkajú rôzne nástroje, ktoré ti môžu pomôcť s generovaním alebo úpravou obrázkov pre tvoje články. 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). Umelá inteligencia sa stáva neoceniteľným nástrojom pre blogerov, ktorí chcú optimalizovať svoje vizuálne a textové materiály. Pozor na autorské práva!Obrázky na stiahnutie zadarmo sú často vyhľadávané na internete, pretože 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. Kurzy cez úrad práce môžu byť vynikajúcou príležitosťou, ako sa naučiť pracovať s bezplatnými obrázkami na stiahnutie zdarma alebo open-source nástrojmi na úpravu obrázkov a fotografií, čo ti umožní vytvoriť vlastné vizuálne materiály bez porušovania autorských práv. Tieto kurzy často ponúkajú bezplatný prístup k základným zručnostiam potrebným pre digitálnu tvorbu, vrátane práce s programami na tvorbu a úpravu obrázkov, ktoré môžu byť skvelou alternatívou k plateným zdrojom. 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. Online vzdelávanie a vzdelávacie kurzy často poskytujú potrebné informácie o legálnom používaní digitálnych zdrojov a môžu ti pomôcť získať zručnosti na správnu správu a používanie obrazového obsahu pre tvoje projekty.
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 ;)
Ako sa stať iOS vývojárom
Tipy a triky
03.10.2016
Skillmea

Ako sa stať iOS vývojárom

Zrejme uvažuješ nad tým, že sa staneš vývojárom pre platformu iOS. Budeš mať blízko aj k programovaniu pre tvOS (Apple TV), watchOS (Apple Watch), macOS (stolové a prenosné počítače) a možno v budúcnosti carOS, … Tentoraz sa pozrieme na to, čo všetko potrebuješ k tomu, aby si sa stal iOS vývojárom buď na voľnej nohe alebo ako zamestnanec. Skúsim to ozrejmiť z pohľadu, ako to riešime my v become.sk. Pokojne sa mi ozvi pre bližšie informácie, určite ťa odkážem na Swiftológa, online kurz iOS programovania, ktorý prebieha formou náučných videí. V tomto kurze získaš základný prehľad jazyka Swift a vyskúšaš si v ňom urobiť (zatiaľ) jednu vzorovú aplikáciu. Čo potom? Povieš si, veď to všetko stojí peniaze. No áno, no stojí. Treba si uvedomiť, že vo všetkom je ľudská energia a čas. Platí sa zaň. Ak existujú veci zadarmo, tak tie zaplatil niekto iný miesto teba, za čo môžeme v podstate všetci ďakovať. No dobre, dosť bolo moralizovania, poďme si ukázať, čo všetko potrebuješ na to stať sa riadnym iOS programátorom, povedzme v priebehu roka. Hardvér a softvér – koľko ťa to bude stáťMožno už máš počítač s OS X, neskôr macOS. Ak nie, tak vedz, že potrebuješ práve ten. Ak nemáš, na tvojom mieste by som v závislosti na pomere cena/výkon volil iMac 21,5“. Tento odkaz nie je reklama, uvádzam ho na Traco čisto dobrovoľne :-). Taký iMac kúpiš za cca 1200€ a vyššie. Ak chceš lacnejší stolový počítač, tak budeš musieť siahnuť po Mac Mini, trochu mu budeš musieť rozšíriť RAM (cca 100€), dokúpiť displej aspoň za 300€, dokúpiť Apple klávesnicu (120€) a myš (86€) alebo Trackpad (144€). Táto možnosť dohromady vychádza cca. 1200€, čiže rovnako, ako komplexný iMac, kde už máš všetko. Cenu vieš samozrejme zraziť cenou displeja. Zo skúsenosti však viem, že čím lepší displej, tým ľahšie sa bude aj tebe programovať. [Image] Rôzne typy Mac zariadení Ak chceš prenosný počítač, odporúčam MacBook Pro. Nový a najlacnejší 13“ kúpiš za 1450€. Občas sú aj výpredaje starších modelov, kde sa vieš cenou dostať na 1150€. Nad iným ako Pro ani neuvažuj, pretože MacBook ani MacBook Air sa na vývoj nehodí. Sú príliš nevýkonné na to, čo časom budeš potrebovať. Zo začiatku možno áno, ale o rok intenzívneho vývoja od tvojho začiatku isto nebudú stíhať. Ver mi. No dobre, a čo zariadenie, pre ktoré budeš vyvíjať? Máš iPhone (679€)? Máš iPad (369€)? A čo Apple TV (179€) alebo Apple Watch (349€)? Odporúčam začať s iPhone zariadením. Nielen, že budeš mať telefón, ale aj riadny systém iOS, ktorý ti umožňuje veľmi veľa, kým tvOS a watchOS sú do istej miery obmedzené. iPad je tiež v pohode, no neobsahuje niektoré dôležité súčiastky, ktoré obsahuje iPhone. Napr. si z neho nezavoláš cez operátora. Ono to ide pomocou Continuity, aj z Macu dnes už zavoláš, ale v zásade len keď máš iPhone. Keď to skúsim zhruba spočítať, tak na hardvér potrebuješ 2000€. Či je to veľa, či málo, je na tebe. Keď však budeš dobrý, vráti sa ti to niekoľkonásobne. Softvér ťa vyjde v podstate zadarmo. Čo ti stačí je vývojové prostredie Xcode, v ktorom budeš všetko programovať. Ak si schopný urobiť si aj grafiku, odporúčam Sketch, ktorý však stojí $99. Ak chceš kresliť rastrové obrázky, odporúčam Pixelmator za 29,99€. Ako príklad uvediem seba. Ja som si v roku 2010 kúpil iMac 27“ za 1600€ a mám ho dodnes. Raz som mu rozširoval RAM zo 4GB na 16GB. Vďaka nemu som začal programovať pre iOS. Úplnou náhodou, no to je iný príbeh. Začal som podľa knihy ešte v jazyku Objective-C, robil som vlastné appky, nejaké klientské, neskôr pracoval pre starbug, inloop a teraz vediem tím vývojárov mobilných appiek a školím/učím programovať pre iOS. Takže tých 1600€ sa mi vrátilo v priebehu 6 rokov dostatočne na to, aby som uživil rodinu, aby sme si mohli dovoliť kúpiť auto, … Na čo ešte čakáš? Licencia, živnosť alebo zamestnanieNepotrebuješ nič z toho. Ale ak uvažuješ nad serióznym vývojom, tak minimálne Apple licenciu za $99/rok potrebuješ. Tá ti umožňuje odosielať aplikácie do App Store, prípadne máš viac výhod spojených s dostupnosťou obsahu pre Apple vývojárov, ako i beta verzie nového softvéru na vývoj a máš šancu dostať sa na konferenciu WWDC poriadanú firmou Apple. Akonáhle však začneš peniaze zarábať, hoc aj jeden cent, potrebuješ ich priznať daňovému úradu. Ak táto suma je menšia ako nejaká hodnota, daň ani odvody neplatíš. Ak presiahneš istú sumu, už musíš platiť aj daň, odvody atď. Tam je už dobrá živnosť alebo sročka. Vo všetkom okolo daňových informácií ti poradí šikovný účtovník alebo účtovníčka. Ak nechceš mať tieto problémy, zamestnaj sa vo firme, ktorá vyvíja mobilné appky. Zarobíš stabilne. No aj tak, ak chceš predávať aj vlastné veci, platí vyššie spomínané. Všetky peniaze musíš priznať. Ak ti môžem ja poradiť: založ si živnosť a nájdi si stabilný príjem z vývoja (na voľnej nohe, zamestnanec, to je jedno). Budeš mať viac možností, viac voľnosti. Možno ťa to vyjde viac peňazí odvedených do štátnej kasy, ale tým sa netráp. Aj štát potrebuje na prevádzku isté peniaze rovnako, ako aj ty. Platí pravidlo: ak veľmi chceš, neriešiš prkotiny, ale podstatu toho, čo chceš. PraxPoznáš inzeráty typu: „hľadáme mladého flexibilného absolventa s praxou.“ Často však absolventi prax nemajú, lebo „vysoké školy nie sú učňovky,“ ako mi raz zahundral vedúci našej katedry informatiky. Asi sa urazil, keď som mu povedal, že mali by sme mať viac praktických skúseností, ako teórie. Ako to ale vyriešiť? Popri škole môžeš využiť rôzne školenia, kurzy, a keď sa bavíme o programovaní pre iOS, urob si na začiatku Swiftológa a potom sa prihlás k nám do become.sk, lebo sme vymysleli spôsob, ako získaš zadarmo prax ešte počas štúdia na škole a naučíš sa pri tom programovať. Zlepšíš sa a postupne začneš už aj zarábať na stále náročnejších projektoch. Niektorým z vás prešiel po chrbte mráz, keď som vyslovil „stále náročnejších“. No áno, programovať nie je jednoduché. Mozog ti bude na začiatku vytekať z hlavy a budeš hladný, no pokiaľ vydržíš, pozbieraš ovocie. Poradím ti: nechci zarobiť hneď na začiatku veľa peňazí. Nevyplatí sa ti to a nebudeš mať ani prax, ani peniaze. Buď ochotný dať istý čas svojmu vzdelaniu bez nároku na výplatu. Si ešte študent, máš zrejme rodičov, ktorí ti hradia štúdium. To je obrovská výhoda, ktorú je dobré využiť. Nepotrebuješ už vtedy zarábať ako Mark, Steve alebo Milan. Fakt nie :-). Alebo ak sa chceš stať programátorom popri práci, ktorú už nechceš robiť, tak v nej pokračuj, kým nezískaš skúsenosti v programovaní natoľko, že si môžeš dovoliť vziať platený projekt. Ono to začne. Príde jeden projekt za rok, na ďalší rok dva, potom štyri, osem, … a exponenciála rastie a prináša ovocie. Len vydrž a nechci všetko hneď. Lebo tak tento svet nefunguje. [Image] A zavri už ten článok o príbehu ďalšieho úspešného startupu, ktorý získal peniaze, no reálnu hodnotu nevytvára. Je to bublina. Prečítaj si radšej článok o tom, prečo zas ďalší (relatívne) úspešný projekt končí. Nechce sa ti to čítať? Prezradím ti podstatu: nezarábajú dosť peňazí na svoju prevádzku. Zabudni na miliónový startup, urob niečo užitočné pre seba a svoje okolie a možno budeš mať šťastie a zarobíš na tom. Potom sa bude o tebe písať, no ty budeš vedieť, že úspech neprichádza cez noc, ale po rokoch driny a odriekania. Dosť bolo mudrovania, uvediem ti teraz niekoľko zdrojov, z ktorých môžeš čerpať pri svojom vzdelávaní. Vzdelávacie programy  Apple ponúka osnovu a materiály vzdelávacieho programu programovania v jazyku Swift. Ono to je veľa materiálu, no bez edukačnej teórie, samotný materiál nevzdeláva, nie je tam žiadna príručka, nie je to náhrada kurzov. Je určený učiteľom, ktorí chcú niekoho učiť programovať. Podľa neho idem individuálne učiť jedného človeka, ktorý sa chce naučiť od nuly programovať a hneď ide skočiť na jazyk Swift a Apple platformu. Aby som to uviedol na pravú mieru, ten človek prešiel dennými kurzami s viac účastníkmi i online kurzami, no zistil, že jemu vyhovuje iné tempo a individuálny prístup. Potom tu máme online vzdelávacie kurzy, napr. Swiftológ od Learn2Code, ktorý som pripravil ja. Má dve časti, v prvej si prejdeš jazykom Swift, v tej druhej si naprogramuješ ukážkovú aplikáciu. Aby som bol kompletný, musím uviesť aj iné vzdelávacie inštitúcie, ktoré ponúkajú online kurzy programovania pre iOS. Coursera ponúka kurzy vývoja pre iOS, ich nevýhodou i výhodou v našich končinách je anglický jazyk. Takto v teréne sa ho naučíš najlepšie. Niektoré kurzy sú platené, iné zadarmo. Stačí si vybrať a študovať. Potom tu je EdX, ale o iOS je tam toho podstatne menej. Tutoriály  Niekedy si povieš, že ideš si sám alebo sama skúšať postupy, ktoré niekto dal dohromady. Ako vytvoriť hru, ako urobiť aplikáciu podobnú instagramu, atď. Tieto návody sú peknou ilustráciou toho, ako veci na pozadí aplikácií fungujú. Ak chceš vyskúšať skutočne dobré tutoriály, zájdi na RayWenderlich.com a niečo pohľadaj. Tutoriálov sú tam stovky, od programovania jednoduchej „Hello World“ appky, cez programovanie serverovej časti pre podporu aplikácie až po Apple Watch alebo Apple TV. Vybrať si môžeš, väčina z nich je zadarmo, inak ponúkajú ucelené knihy plné návodov, aj takých, čo sa na web nevošli. Možno časom narazíš aj na iný web venujúci sa návodom, tento je však jeden z najlepších. Fórum  Občas sa stane, že sa potrebuješ opýtať, ako vyriešiť „neriešiteľný“ problém, no zo začiatku nepoznáš nikoho znalého, lepšieho ako ty, kto by ti poradil. Preto zájdi na StackOverflow a opýtaj sa tam. Ich premakaný systém hodnotenia otázok a odpovedí dáva tomuto fóru jedinečnosť v tom, že určite vieš na prvý pohľad zistiť, ktorá odpoveď je vhodná pre tvoj problém. Oni totiž implementovali premyslenú gamifikáciu, ktorá vo svojej podstate stojí na kladení otázok, ich odpovedaní, editácii a hodnotení. Na tomto základe získavaš hodnosti a reputáciu na fóre. Ono to funguje výborne, lebo každého človeka to udržiava v aktivite. Celé fórum je v angličtine, samozrejme. Znovu platí, pokiaľ pretrpíš začiatky, že angličtine nerozumieš, tak neskôr porozumieš. A bude to dobré. Ako porozumieť angličtineUž som čosi naznačil skôr v článku. Sú štyri oblasti angličtiny (aj iných jazykov), ktoré je dobré trénovať: 1. Posluch 2. Čítanie  3. Rozprávanie  4. Písanie  [Image] Posluch si trénuj tak, že budeš audiovizuálny obsah sledovať výlučne v angličtine, aj keď tomu nebudeš hneď rozumieť. Slovíčka a frázy sa zvyknú opakovať a ty postupne pochopíš kontext vysloveného. Čítanie trénuj dobrým čítaním. Nielen tutoriálov a dokumentácie, ale aj článkov na blogoch a magazínoch, rôzne fóra. Tak sa naučíš, ako sa skladajú vety, aj keď mnohokrát sa môžu vyskytnúť chyby. Nič si z toho nerob, postupne ich budeš vedieť odhaliť. Buď sám, alebo s trochou pomoci zbehlejšieho prekladateľa. Rozprávanie trénuj rozprávaním :-) Zapni Siri a niečo jej povedz… každý deň :-). To by bol začiatok. Potom nájdi človeka, s kým sa môžeš porozprávať v angličtine. Ideálne zo zahraničia cez Skype. Alebo vycestuj do zahraničia a skús sa niečo opýtať. Napríklad skús MyEnglishTeacher.eu, speaking24.com alebo si pozri zoznam ďalších. Pri troche snahy sa dá takýchto zdrojov nájsť kvantum, over si, ktorý ti vyhovuje a choď na to. Písanie sa zvezie popri troch vyššie spomínaných aktivitách. Totiž musíš vedieť napísať, čo hľadáš, napíšeš nejaký komentár pod prečítané alebo svoj vlastný názor na Facebook, či Medium. Tak isto si dohodneš rozhovor s človekom zo zahraničia cez email, kde musíš písať taktiež. Pri všetkých aktivitách sa neboj robiť chyby. Pár ľudí ťa zdrbe za to, že si vôbec dovoľuješ s takou angličtinou niečo prezentovať. Lenže to je presne ten správny moment, kedy sa naučíš niečo nové. Opýtaj sa tých ľudí na to, ako by znenie zmenili a určite ti poradia. Tvoja cenaNebuď hlúpy a nepýtaj veľa. Si junior, začiatočník alebo veľmi mierne a vlažne pokročilý, no ešte stále sa máš čo ušiť. Ako to viem? No lebo čítaš tento článok, si jeho cieľovka. Aj profík to musí, ale na inej úrovni. Nastav si cenu na začiatku napr. na interval 0€ – 5€/hod. Teraz si to v hlave prerátaš, zistíš, že za mesiac (160 hodín) by si zarobil 800€ a za rok 9600€. Z toho odviesť ešte daň, odvody a ostane ti polovica. Tvoja predstava však bola aspoň dvoj až trojnásobná. No povedzme si pravdu, že aby si fakt mohol zarábať 20000€ ročne a viac, potrebuješ si toho dosť veľa odprogramovať, aby si appku nerealizoval dva mesiace, ale dva týždne. Vieš, toho, čo ti bude dávať peniaze tiež niečo stojíš a dobre si rozmyslí, či sa mu oplatí zaplatiť profíka na málo hodín alebo začiatočníka na veľa hodín. V konečnom dôsledku ho to finančne vyjde rovnako, no rýchlejšia realizácia = viac zrealizovaných projektov a viac financií na účte. [Image] S cenou to je ako so stromom. Teraz sa asi učíš programovať, si na začiatku, tak to ber, že si zasadil semiačko jablone. Začínaš rásť, ako rastie malý výhonok, no od toho výhonku ešte nežiadaš, aby ti dal jablká. Sám vieš, že dospelou jabloňou ešte nie je. Stačilo by, keby prišla myš, obhrýzla korienok a všetko je v prdeli. Ty si tiež ten výhonok, a keď sa budeš snažiť zarobiť čo najviac, nič z toho nebude, lebo nik ti to nedá. Pýtaj si vodu, ktorou cháp projekty, ktoré budeš robiť hoc aj zadarmo. Zo začiatku. Na nich sa naučíš komunikovať, projektový manažment, osobný časový manažment, plánovať a v neposlednom rade aj programovať. Ani sa nenazdáš a o pár mesiacov budeš na úrovni, kedy už budeš aj čo-to zarábať. ZáveromPrestaň teraz čítať, prejdi Swiftológa, otvor Xcode a urob niečo. Prípadne sa mi ozvi ;-) a potom si daj Swiftológa. Autorom blogu je Peter Druska, ktorý je lektorom online kurzu programovania iOS aplikácií Swiftológ. Zaujíma ťa programovanie alebo dizajnovanie? Vyber si niektorý z našich ďalších online a prezenčných kurzov pre začiatočníkov a mierne pokročilých na https://skillmea.sk.