Náš blog

Websockety ve Flasku
Tipy a triky
15.08.2018
Miroslav Beka

Websockety ve Flasku

Websockety ve Flasku Pokud ses někdy setkal s výrazem websocket a chtěl by ses dozvědět, co to vlastně je a jak se to používá v Python aplikaci, tak tento článek je právě pro tebe. Standardně tvůj prohlížeč komunikuje na webu pomocí http protokolu. Klasický http protokol nabízí jednoduchou komunikaci. Pošle se request a jako odpověď dostanu response. Tento klasický komunikační způsob nebyl dostačující pro dnešní moderní aplikace. Byla potřeba pro komunikační kanál, který bude sloužit k obousměrné komunikaci. HTTP by měl být víceméně bezstavový a klient a server mezi sebou komunikují jen když je třeba, jinak je spojení mezi nimi uzavřeno. Navíc, prohlížeč (klient) musí požádat server o komunikaci a server může na tuto žádost odpovědět. Ta žádost, to je ten http request. Jinak server neumí kontaktovat klienta jen tak sám od sebe. U websocketů je tomu jinak. Jedná se o komunikační kanál, který se otevře jednou, na začátku a poté se používá ke komunikaci klienta a serveru v obou stranách. To znamená, že server může posílat data zároveň co klient posílá data na server. Toto se odborně jmenuje full-duplex. Web socket má menší overheat přenosu dat, umí být real-time a hlavně, server může posílat data na klienta, aniž by si je klient musel explicitně vyžádat requestem. Toto je užitečné například u aplikací, které zobrazují real time data a server posílá tato data klientovi. Takže pokud nastane nějaká změna dat, server je prostě pošle na klienta. Toto dříve nebylo možné provést pouze pomocí http protokolu. Minimální pří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: Nejlepší je vyzkoušet si tyto koncepty v praxi. Dnes budeme pracovat s Flaskem, knihovnou SocketIO a javascript knihovnami socket.io a jQuery. Budu předpokládat, že Flask aplikace alespoň trochu znáš. Začneme tím, že si vytvoříme nové virtuální prostředí: $ mkdir websockets_primer $ cd websockets_primer $ virtualenv venv $ . venv/bin/activate (venv) $Nainstalujeme závislosti, které budeme potřebovat: (venv)$ pip install flask, flask-socketioV době psaní tohoto článku jsem používal verze Flask==1.0.2 a Flask-SocketIO=3.0.1. Když už máme připravené prostředí a nainstalované závislosti, uděláme nový soubor 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čátku máme importy jako pro každou jinou Flask aplikaci, avšak přibylo nám tam  from flask_socketio import SocketIO. Tento naimportovaný modul je v podstatě totéž jako jiné  Flask rozšíření . Inicializaci websocketů ve Flask aplikací provedeme pomocí řádku  socketio = SocketIO(app). Pomocí tohoto objektu  socketio budeme přijímat a odesílat zprávy. Minimální aplikace by měla mít alespoň jednu stránku. V našem případě to bude  index.jinja. Toto je třeba, protože musíme poskytnout i klientskou část naší aplikace. Tam bude javascript knihovna  socketio  a nějaké další funkce. Websockety umí přijímat a posílat zprávy. Provedeme zatím jen přijímání zpráv. Pomocí řádku  socketio.on("event")definuji handler pro událost  event. V tomto případě jednoduše vypíšu data na konzoli. @socketio.on("event") def handle_event(data): print(data) Posílání a přijímání dat na obou stranách (klient a server) probíhá jako event. Toto je důležitý fakt, protože architektura aplikace založené na eventech ( event driven architecture ) funguje trošku jinak než klasické volání funkce. Neříkám, abys měl z toho paniku teď, ale měj to na paměti. Pokud znáš Flask aplikace, tak spuštění appky vypadá většinou takto if __name__ == "__main__": app.run("0.0.0.0", debug=True) My ale musíme appku spustit jinak, jelikož používáme websockety. Spustíme ji pomocí objektu socketio, který jsme si vytvořili na začátku. if __name__ == '__main__': socketio.run(app, debug=True) Nyní musíme ještě vytvořit 2 soubory. Snažíme se renderovat  index.jinja a také musíme vytvořit hlavní javascript soubor, do kterého budeme psát klientskou část naší websocketové ukázky. Vytvořím složku  templates a do ní soubor 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é jsou 3 importy v hlavičce html dokumentu. První importuje  jQuery , druhý importuje knihovnu pro práci se sockety  socketio  a poslední import je pro náš  main.js  soubor, který musíme ještě vytvořit. Jinak tento html dokument obsahuje pouze jeden formulář s jedním tlačítkem. To budeme používat k posílání zprávy přes websocket. Vytvoříme složku  static v ní  js a v ní už konečně soubor main.js Obsah bude vypadat 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 klientské části. Z tadeto budeme přijímat a posílat zprávy přes websockety stejně jako na serverové části. Pomocí řádku  var socket = io.connect(url); se připojím na můj server. Následně pomocí  jQuery  upravím chování buttonu, aby při stisku poslal zprávu. K tomu slouží funkce socket.emit() Okej, základ máme hotový a můžeme nyní zkoušet posílat zprávy. Aplikaci spustím pomocí pří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-530Otevřu prohlížeč na  http://localhost:5000  a zobrazí se mi jeden button. Když ho zmáčknu na konzole mi vyskočí: test messagePojďme tedy prozkoumat, jaké možnosti nám poskytuje tato knihovna  socketio. Přijímání zprávJak jsem již zmiňoval, přijímání zpráv na obou stranách probíhá jako event. V Pythonu musíme pro takovýto event definovat handler. V javascriptu používáme tvz. callbacky. V principu jde o totéž, ale každý jazyk má své vlastní technické řešení a my si toho musíme být vědomi. Každý event, který chci přijmout musím mít nějaké jméno. V příkladu jsme měli název  event. Mohu ale použít cokoli @socketio.on("foobar") def handle_data(data): print(type(data)) print(data)Také data se automaticky mění na příslušný typ. Pokud v javascriptu pošlu string, tak string dostanu i na serveru. Totéž platí pro jiné datové 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 odeslání událostí dostanu výpis na serveru <class 'str'> message <class 'list'> [1, 2, 3] <class 'dict'> {'data': 'message'}Handler také může mít několik argumentů @socketio.on("sum") def handle_sum(arg1, arg2): print(arg1 + arg2)Upravíme javascriptovou část a zavoleme event s více argumenty ... $("form#emit_event").submit(function(event) { socket.emit("sum", 23, 47); return false; }); ...Namespace patří mezi další funkce, které mám knihovna SocketIO nabízí. Každý event si můžeme rozdělit podle namespace. To nám dává další možnosti organizace eventov. @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): print(arg1 + arg2)Ovšem pozor! Na straně klienta se musíme nyní připojit na jinou 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; }); });Další vychytávka je to, že každý event, který pošleme, umí zavolat callback poté, co byl proveden. Například z javascriptu pošlu nějaká data na server a server mi ještě dodatečně potvrdí, že data byla zpracována. Aha takhle ... $("form#emit_event").submit(function(event) { var ack = function(arg){console.log(arg)}; socket.emit("sum", 23, 47, ack); return false; }); ...Pokud chci, aby se callback zavolal, musím v Pythonu vrátit nějakou hodnotu z provedeného handleru => return True @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): print(arg1 + arg2) return TrueMusím si otevřít v prohlížeči konzoli (já používám chrome) a když zmáčknu tlačítko, dostanu výpis na konzoli[Image] Posílání zprávZasílat eventy jsme již posílali, ale pouze z javascriptu. V Pythonu to vypadá velmi podobně. Používáme 2 funkce  send a  emit mezi nimiž je zásadní rozdíl. Nejprve musíme importovat z knihovny flask-socketio from flask_socketio import send from flask_socketio import emitupravíme funkci na sčítání @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): value = arg1 + arg2 print("{} + {} = {}".format(arg1, arg2, value)) send(value)a přidáme handler v javascriptu abychom mohli tento event zachytit. ... $("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 teď jsem použil handler, který zpracovává event s názvem  message. Není to náhoda. Jde totiž o to, že funkce  send posílá tvz. unnamed event . Tyto eventy se vždy posílají na handler, který zpracovává  message. Narozdíl od funkce  send, funkce  emit posílá již konkrétní event a musíš mu dát název. Zkusme tedy pozměnit náš pří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) }); ...BroadcastingVelmi užitečná funkce je broadcastování, což už z názvu vyplývá, že eventy se budou vysílat na všechny připojené klienty. Dejme tomu, že změníme funkci  emit na broadcastování @socketio.on("sum", namespace="/math") def handle_sum(arg1, arg2): value = arg1 + arg2 print("{} + {} = {}".format(arg1, arg2, value)) emit("result", value, broadcast=False)Nyní, když si otevřeš 2 prohlížeče a v jednom zmáčkneš button, výsledek součtu se ukáže ve všech prohlížečích[Image] note: callbacky se při broadcastování nebudou provádět ZávěrWebsockety mají mnoho využití. Tento článek byl jen úvod a přehled některých základních funkcí. V příštím blogu uděláme malou aplikaci postavenou na websocketech. Máš nějaké dotazy k článku? Napiš ji do komentáře.
7 důvodů, proč se lidé na vašem webu neregistrují
Tipy a triky
06.06.2018
Skillmea

7 důvodů, proč se lidé na vašem webu neregistrují

Weby jsou o byznysu. A teď nemám na mysli vývojářské firmy a mladé dynamické „desing studios“. Mluvím o byznysu jako takovém - o činnosti, při které se vyměňují hodnoty (jako peníze a zboží) ke vzájemné spokojenosti obou stran. Vy máte super obsah, návštěvníci vašich stránek zase své kontaktní údaje. Tak si podáte ruce a domluvíte obchod. Mé články za tvůj e-mail. Jednoduché, ne? Ne. Registrační proces je vcelku složitá záležitost a ne vždy funguje tak, jak bychom si představovali. Web může mít mnoho návštěvníků, ale jen velmi málo se i zaregistruje. Proč? Inu, když jsme web vymýšleli, mohli jsme nevědomky udělat pár chyb. Tak zaprvé… 1. Jsme v tom, že registrační proces rovná se registrační formulář Samozřejmě, že je důležité mít pěkný a použitelný formulář. Názvy nad inputy pro vertikální skenování, absence CAPTCHA pro duševní klid, známe. Ale registrace nezačíná vyplňováním políček. Pokud jsme návštěvníka dostali až sem, máme už vlastně zpola vyhráno - registrační proces formulářem nezačíná, ale končí. Další chybou tedy může být, že… 2. Zapomínáme na to, že registrační proces rovná se motivace „Ahoj, jsme Triad a děláme efektivní digitální marketing tak, aby to bavilo nás i naše klienty“. Nějak takhle by mohla vypadat vaše value proposition (nechce se mi hledat český překlad), kdybyste byli Triad. Jenže nejste, tak si vymyslete vlastní. Pamatujte, že návštěvníci stránek jsou sobci a zajímá je jen to, co jim přinesete. Kašlou na vaši misi, vizi a počet šálků kávy vypitých od začátku roku. Proč by s vámi měli dělat byznys, když jim nedáte jasně najevo, jakou hodnotu jim přinášíte? Proč by se měli registrovat právě u vás? Řekněte jim to. Jednoduše, srozumitelně, hlavně nepřehánějte. S tím souvisí další bod. 3. Neosobní a nudné webové copy Jak říká Adam Javůrek, ve webovém copy jsou svatá 3 slova: vy, váš a zdarma. Schválně, zkuste použít všechny. Buďte přátelští, s uživateli si povídejte. Knoflík “Registrujte se” je přívětivější než “Registrovat”, nebo “Registrace”. Vyznačte důležité části, text strukturujte. Oh, a zkraťte ho. Na polovinu. A pak ještě jednou. To, co je na vás super musíte umět sdělit během krátké cesty výtahem. Je váš produkt nebo obsah zdarma? Řekněte to. A ještě jednou - nejste nejlepší, nejkrásnější a nevíte všechno. Svým návštěvníkům dejte jasný a srozumitelný důvod, proč se u vás mají registrovat. Bez nadsázky. Všechny kecy na světě však nenahradí osobní zkušenost - občas na to pozapomeneme a pak vzniká… 4. Obsah skrytý pod registrační hradbou To je tak. Kliknu na nadpis článku nebo odkaz ve smyslu “zjistit více” (moje oblíbené, BTW, když nejdu dále číst, ale “zjišťovat”). Vyskočí na mě modální okno s formulářem a vříská po mně cosi o registraci. Zkusím další odkaz, situace se opakuje. Odcházím. Řekněme, že sháníte bonbóny a narazíte na dva prodavače. Benďo a Jožo. Benďo bude své bonbóny vynášet do nebe a popisovat jejich úžasnou chuť. Jožo otevře balíček a rovnou vás nabídne. Od koho si bonbóny koupíte? Jožova mazaná obchodní taktika stojí na principu reciprocity - pokud dáš nejprve něco ty mně, já budu víc ochoten dát něco tobě. Proto pokud máte super obsah, neskrývejte jej před návštěvníky. Ukažte jim ho. S tím, že když ho budou chtít vidět celý, ať se zaregistrují. Svůj e-mail vám poskytnou velmi rádi, budou-li vědět, do čeho jdou. Apropo, do čeho jdou… 5. Příliš velký závazek Registrace na webu je velké rozhodnutí. Ne, vážně. Jsou to cizí stránky, nevím, kdo je vlastní. Komu dávám svůj e-mail? Na co všechno jej použije? Čeká mě spambox plný super pilulek a členů nigerijské královské rodiny? A k čemu chtějí mé telefonní číslo? PSČ? Zbláznili se? Tak. Buďte transparentní. Lidé nemají rádi závazky, ukažte jim tedy, že se nemají čeho bát. Budete jim posílat newsletter? Tak jim ho ukažte. Jak vypadá, co obsahuje a hlavně – jak často se na něj mohou těšit. Mohou si účet kdykoli zrušit? Řekněte jim to. Přidejte také větu o tom, že informace neposkytnete třetí straně (a zkuste to i dodržet). A ujistěte je, že to celé nezabere více než minutu jejich času. Ještě jedna věc. Spousta webů přichází o obrovský zdroj důvěry v očích jejich potencionálních uživatelů - dělají jednu zásadní chybu… 6. Skrývání ostatních uživatelů Máte super web plný super obsahu, kde chodí spousta super lidí? Ukažte je. Co všechno tam dělají? Jožo právě čte článek o červených pandách? Benďo ve speciální aplikaci zjistil, kde v jeho okolí se pandy dají skvěle pozorovat? Proč se nepochlubit? Možná tam dokonce najdu nějaké kámoše z Facebooku. A proč bych se neregistroval, když tam už jsou moji známí, kteří to prověřili za mě? Jmenuje se to social proof a více o něm zjistíte v Googlu. Nějaké knihy o tom seženete i na Amazonu. A vůbec, když už o nich mluvím. Tito velcí hráči utrácejí miliony na UX testování, musí mít super promakanou registraci. Uděláme to jako oni. Nemůže to dopadnout špatně. Nebo hej? 7. Opakování po ostatních Pokud se nevoláte Bezos (což určitě ne, neboť čtete článek v češtině), zapište si za uši: nejste Amazon. Ani Google, ani Alza ani lokální opravář plynových bojlerů. Vy jste vy. Při navrhování registračního procesu je třeba vždy vycházet z vlastní situace a vlastních zkušeností. Internetoví giganti mají určitě velmi dobře zvládnutý registrační proces, ale nikdo z nás nevidí do jejich cílů, statistik a strategie. To co funguje pro ně nemusí fungovat pro vás. Na druhé straně, inspirovat se někde třeba, takže… Trochu inspirace Zde je několik známých webových produktů, které mají podle mě skvěle zvládnutý registrační proces. Co mají společného, ​​je především jednoduchost – jasně komunikují, jak mi pomohou (ať už pomocí textu nebo obrázků) a okamžitě mi nabídnou možnost je bezbolestně začít používat. • Intercom • Basecamp • Dropbox Autorem blogu je Roman Pittner , lektor online kurzu Design pro obrazovky . Pokud máš k blogu dotazy, neváhej je napsat do komentářů.
Jak umí programátor samouk dohnat ty, co studovali na univerzitě
Tipy a triky
03.04.2018
Martin Lipták

Jak umí programátor samouk dohnat ty, co studovali na univerzitě

Co se učí na univerzitáchJsi programátor samouk a přemýšlíš, jak to vypadá na univerzitě? Už jsi viděl všechny online kurzy , máš za sebou 10 vlastních projektů a začínáš v nové práci jako Web developer. Jak dohnat lidi, kteří 5 let studovali informatiku? Dá se to vůbec?  Před 3 lety jsem skončil FIIT ( Fakulta informatiky a informačních technologií ) na STU v Bratislavě a také jsem přemýšlel, co všechno mi škola dala. Je toho hodně a jsem velmi rád, že jsem si vybral takovou cestu. Na druhou stranu, kdybych tuto možnost neměl, většinu věcí bych se naučil i jinde. Co pro mě byly ty nejdůležitější věci? Asi už tušíš, že je to celé velmi subjektivní a určitě neber tento článek jako univerzální návod. Studentský životBydlel jsem na intrácích v Mlýnské dolině a jeden semestr jsem strávil na programu Erasmus ve Španělsku. Byly to kamarádství a zážitky, na které lze vzpomínat celý život. Pro samouky: Pokud jsi studoval na jakékoli vysoké škole, víš o čem mluvím. Inspirativní lidéPoznal jsem mnoho spolužáků a učitelů, kteří mě v mnoha věcech posunuli dál. S mnoha jsem dosud v kontaktu a můžu se na ně spolehnout, kdybych potřeboval pomoc.  Pro samouky: Skvělé lidi najdeš iv pracovních kolektivech. Obklop se takovými, kteří jsou lepší než ty sám.  Na škole se organizovalo velké množství akcí a učitelé nás motivovali chodit na setkání programátorů mimo školu, kde jsem poznal mnoho dalších lidí. Pro samouky: Hledej si kamarády na různých událostech pro programátory, kterých je více než dost v každém větším městě (například taková Rubyslava nebo Reactive meetups a mnoho dalších). SamostatnostOd intráků a studia v zahraničí, až po práci na zadáních, projektech a závěrečných pracích. Alespoň na FIIT to bylo tak, že táhnout to musel sám student a učitel mu jen pomáhal nebo někdy i nepomáhal. Zasekl ses při zadání a termín je zítra? Použij Google, nebo se poraď se spolužáky, ale vyřeš to. Pokud tvé zadání nebude do 00:00 CEST v předávacím systému, nikoho nebudou zajímat tvé výmluvy a předmět si zopakuješ další rok. Pokud se ti nasbírá takových předmětů více, letíš ze školy. Pro samouky: Tak jako jsi udělal těch 10 vlastních projektů, i v práci budou očekávat, že se věcí chytíš a dotáhneš je samostatně do konce. To ale neznamená, že se nemáš ptát (nejdříve Google) a požádat o pomoc, když ji potřebuješ. [Image] Práce v týmuNa mnoha školních projektech jsem nepracoval sám. Na týmovém projektu jsme byli až 7 a museli jsme se vypořádat s odlišnými názory a dokonce cíli v projektu.  Pro samouky: Máš za sebou těch 10 projektů, při kterých ses naučil samostatnosti. V práci budeš obklopen lidmi a musíte spolu co nejlépe vycházet. Jmenuje se to soft skills a dá se to natrénovat. [Image] VědomostiNa co všechno si vzpomenu 3 roky po skončení školy? O čem byly všechny ty předměty? • Jak funguje počítačový hardware a jak se z jednotek a nul stanou programy – logické obvody a počítačové architektury. • Jak funguje operační systém - ovladače zařízení, IO, systémová volání, procesy, vlákna (threads), synchronizace, správa unixových systémů a shell skripty. • Jak funguje Internet a co je HTTPS, DNS, POP3, IP a Ethernet – 7 vrstev počítačových sítí a jak spolu souvisí všechny tyto protokoly. • V čem se liší paradigmata programování - procedurální programování v C, objektově orientované v Javě, funkcionální v Lispě a logické v Prologu. Viz můj první projekt v C , který jsem nahrál do školního systému pro automatické testování :) • Co znamená zápis O(n) a jak určit složitost algoritmů? Jak může efektivní algoritmus vypočítat výsledek za 1 milisekundu a neefektivní by to počítal týdny? Vyvážené binární stromy, hashing, grafy a jiné datové struktury. • Co je to Turingův stroj? Proč jsou regulární výrazy regulární? Co je abstraktní syntaktický strom? Základní teorie informatiky, na které stojí všechny programovací jazyky. • Je umělá inteligence opravdu inteligentní? Hrubá síla a heuristiky, které řeší složité problémy, neuronové sítě, genetické algoritmy a odvozovací stroje. • Jaké jsou výzvy paralelního programování? Klasické problémy synchronizace, vlákna, mutexy a semafory. • Co je databáze? Návrh datových modelů, psaní dotazů (queries), optimalizace indexy a kdy použít NoSQL. • Úvod do analýzy dat (data science). Lineární regrese, neuronové sítě, support vector machines, clustering a časové řady. • Jak spravovat softwarové projekty? Vodopád nebo agilní metodologie, důležitost testování a dokumentace, návrh poživatelských rozhraní, kvalita kódu a návrhové vzory. • Jak dělat výzkum? Návrh hypotéz, jejich vyhodnocování experimenty, měření dat, psaní a zveřejňování výzkumných článků. • Pár předmětů o ekonomii, právu a psychologii bylo příjemným odpočinkem od technických věcí. • Webový vývoj v Ruby on Rails. Toto je to, čemu se nyní věnuji v práci. Pro samouky: Vypadá to jako velmi dlouhý seznam, ale většinu z těchto věcí se umíš naučit v praxi. Jsou však věci, ke kterým se nedostaneš. Pokud se od začátku zaměřuješ na webový vývoj v PHP , asi se nebudeš do hloubky zabývat hardwarem, překladači (compilers) a operačními systémy. A většina lidí se asi nebude zabývat výzkumem. [Image] Takže jak dohnat ty, kteří studovali FIIT?• Obklop se lidmi, od kterých se můžeš hodně naučit. Najdeš je v práci a na setkáních programátorů. • Nečekej, že ti vždy řeknou, jak máš věci dělat. Samostatnost je ale také umět požádat o pomoc, když ji potřebuješ. • I když to tak na první pohled nevypadá, programování je víc o lidech než o počítačích. Pracuj na svých soft skills a komunikaci v týmu. • Snaž se porozumět věcem do hloubky. Jak fungují regulární výrazy? Proč potřebuje databáze indexy? Jaký je rozdíl mezi http:// a https://? V čem jsou výhody SCRUM-u? • Uč se věci mimo tvé specializace. Vyvíjíš weby? Zkus udělat nativní mobilní aplikaci. Co takhle si o víkendu naprogramovat ovladač do operačního systému nebo kompilátor? Máš dotazy k tomuto blogu? Neváhej je napsat do komentářů.
Ako naprogramovať hru Čierny Peter v Jave
Tipy a triky
26.10.2017
Skillmea

Ako naprogramovať hru Čierny Peter v Jave

Programování hry Černý Peter v JavěV tomto tutoriálu si spolu naprogramujeme karetní hru Černý Petr. Použijeme programovací jazyk Java a zaměříme se na to, abychom použili OOP přístup, tedy objektově orientované programování. Pravidla hryNejprve si musíme zanalyzovat danou hru. To uděláme tak, že si řekneme a určíme pravidla. Ve hře je 33 karet. Jedna karta nemá pár, ostatní ho mají. Hru může hrát 3 až 6 hráčů. Všechny karty se rozdají mezi hráče. Automaticky si hráči vytřídí z ruky karty, které mají páry. S ostatními začíná hra. Ten, co má nejvíc karet, nechá táhnout hráče po své pravici. Pokud ten hráč získal pár, tak ho vyloží a další hráč od něj táhne kartu. Pokud hráč přišel o všechny karty, už víc nehraje. Komu zůstane poslední karta, ten prohrál hru. Analýza hry - vytváření objektůNyní je čas připravit si popis našich tříd, rozhraní a podobně. Ve zkratce, uvažujeme nad pravidly, okolnostmi a členy dané hry a chceme je přetvořit na objekty. Čím obecněji napíšeme naše objekty, tím lépe pro jejich znovupoužitelnost. Pokud bychom chtěli někdy naprogramovat karty žolíkové, sedmové nebo ledajaké jiné, tak si nechme tuto možnost. Tedy například vytváření instancí karet nedávejme do třídy balíku, ale jinde. Postup: 1. vytvořím kartu 2. vytvořím balík karet 3. vytvořím hráče 4. interakci s uživatelem 5. správu hry 6. logiku hry Černý Peter KartaKaždá hrací všeobecná karta má nějaké specifikum. Je to král srdeční, král pikový a podobně. V našem případě máme páry a každá karta v páru je jiná, společné mají to, že jsou páry. Jako například v žolíkových kartách máme 4 krále. Každý je jiný, ale mají společné, že jsou to králové. 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íček karetDále budeme potřebovat tyto karty uložit do balíčku. Každá hra má několik karet, které tvoří balíček. Takže náš balíček bude obsahovat seznam karet. Co lze dělat s balíkem? Například míchat karty, nebo z balíku můžeme vyjmout kartu. Když vybírám karty nebo míchám karty, tak tam musí nějaké být. Protože pokud vyberu postupně všechny karty z balíku, tak nakonec budu mít balík prázdný. Zkuste míchat prázdný balík karet :) Proto si vytvořím i pomocnou metodu, která zjistí, zda je balík prázdný nebo ne. 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ždé hry potřebuji hráče, tedy někoho, kdo bude danou hru hrát. Rozhodl jsem se, že hráči dám jméno a karty v ruce. Když vytvářím nového hráče pomocí new, tak se zavolá konstruktor dané třídy a tam si všimni, že jsem mu do ruky nedal nic, tedy tam má prázdno. To proto, že ještě nedostal žádnou kartu při rozdávání, ale musí mít nějaké úložiště kde mu je dám :) Je tam ještě metoda, která má na starosti odstranit z ruky hráče všechny páry. Kdo by si to chtěl nějak zobecnit, tak může. Tedy do objektu Hrac, by dal jen metodu pro odstranění jedné karty, nebo seznamu karet. A které karty to budou to nechá na jiný objekt, který spravuje pravidla hry Černý 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ádání hryJakou chceš udělat aplikaci? Jak chceš komunikovat s uživatelem? Přes grafické rozhraní? Přes konzoli, nebo jinak? Nyní budeme dělat konzolovou interakci , ale pokud bys chtěl dělat v budoucnu grafické rozhraní, tak je vynikající idea udělat interface, tedy rozhraní, kde popíšu metody jaké chci používat pro interakci s uživatelem. Potom když budeš dělat grafické rozhraní, tak si jen zaimplementuješ toto nové rozhraní a někde v kódu hry řekneš, že nyní používat tuto implementaci, a nemusíš přepisovat i celou hru, neboť metody jsou tam stejné, jen z jiného zdroje. Co potřebujeme vypsat uživateli, nebo co od něj chci získat? Počet hráčů, jejich jména, jakou kartu chceme hráči vzít a chceme vypsat konec hry. Pokud chceš něco víc, tak si to klidně dodělej. 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); } Nyní si musíme zaimplementovat toto rozhraní. Nyní máme jen předpis metod ale ne jejich nitro. Budeme používat konzoli, kterou budeme číst pomocí scanneru a na konci hry si uzavřeme scanner. Každá metoda je jednoduchá, vypíšu na konzoli co chci a potom nechám uživatele, aby mi to napsal. Všimni si, když bereš nextInt(), tak se to pokusí vzít číslo. Pokud najde něco jiného je to chyba a tu ošetříme. Klidně si dodělej více ošetření, podmínek a výpisů. Potom ale musíš vzít i zbytek. Nebo co udělal uživatel? Zadal číslo a stiskl enter. Ty jsi vzal jen to číslo, ale ne i enter. Proto tam máme ještě nextLine - to nám vezme zbytek řádku is enterem. Černý Peter bude hráč, který zůstal poslední ve hře. 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á několik hráčů, má balíček karet se kterými si hraje a má také ovládání. Toto si definujeme. public class Hra{ private BalikKariet balikKariet; private int pocetHracov; private List<Hrac> hraci; private OvladanieHry ovladanieHry;V konstruktoru této Hry si nastavíme to, co víme: public Hra() { this.ovladanieHry = new OvladanieHry(); this.pocetHracov = ovladanieHry.vyberPocetHracov(); this.hraci = vytvorHracov(); } Nestavili jsme balíček karet, protože ten je specifický pro každý typ hry jiný. V našem případě jsou to karty pro hru Černý Peter. Tak ty si vytvořím později. V kuse kódu výše jsme si vytvořili instanci ovládání hry a hned jsme ji také použili při výběru počtu hráčů. Metoda výběr hráčů je jednoduchá, uživatele aplikace se ptám jak se jmenují a rovnou je vytvořím a dám do seznamu. 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 tedy začnu ji hrát když zavolám metodu 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); } }Zde si vytvořím instanci třídy HraCiernyPeter, která má na starosti logiku, která je specifická právě pro tento typ hry. Tu si vytvoříme později. Na tomto místě si vytvořím také balík karet pomocí karet, které se vytvářejí ve třídě HraCiernyPeter. Jelikož jsem zvolil názvy metod takové, aby se snadno chápaly, tak tušíme co dané metody dělají. Když vytvořím balíček a jdu hrát, tak karty pomíchám, pak je rozdám hráčům. Musím si určit, který hráč začíná jako první. V černém petrovi je to ten, co má nejvíc karet. Jak jsme si řekli na začátku, tak když mají hráči rozdané karty, tak si složí všechny páry a tím se zbaví nějakých karet. Zkontroluji jestli snad někdo neměl všechno páry na ruce a tím pádem skončil ve hře. Zeptám se, jestli je konec hry - zda zůstal jen jeden hráč, který má černého petra - neboť tato karta nemá pár. Pokud ne, tak začnu koloběh hry. V této třídě mám i jiné pomocné třídy. Zkus si je projít 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 Černý PeterV této části si vytvoříme karty specifické pro tuto hru. Tedy 16 párů a jednoho černého 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; } Když rozdávám karty, tak je rozdávám po jedné. Tato metoda by mohla být také ve třídě Hra, ale teoreticky pro jiné typy her by se karty rozdávaly jinak. Tady rozdávám všechny karty. Z balíku karet vezmu první kartu, z balíku ji odstraním a dám ji hráči do ruky. Tady je takový fígl, že jdu přes všechny karty a dělám modulo nad pořadím karty s počtem hráčů, to mi zaručí, že budu dokola procházet hráče dokud 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()); } }Když se chystám odstranit hráče ze hry (když nemají už žádné karty na ruce), tak je nemohu odstranit během toho, jak přes ně procházím (iteruji). Proto si je dávám do pomocného seznamu a až po iteraci je odstraním. 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); } }Když někomu vezmu kartu z ruky, tak každému z těch hráčů pomíchám karty. Jednomu hráči vezmu kartu z kolekce kartiček, což má na ruce a druhému přidám do kolekce další 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()); }Samozřejmě koloběh hry jede následovně. Hrajeme do té doby, než nám ve hře zůstanou alespoň dva hráči. Začínám u prvního hráče, který vezme kartu druhému hráči. A tady jsem si natrefil na chybu. Přece hráč s největším počtem karet netáhne ale mělo by se táhnout jemu tedy, ten co je za ním táhne od něj. Tak tady si to můžete opravit, to nechám na vás. Pomůcka: upravte index prvního hráče ve třídě Hra, pokud si pamatujete, tam jsme 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++; } }Tady je pak celý kód třídy is jinými pomocnými metodami. 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]MainNakonec jsem si vytvořil třídu s jednou main metodou, která se nám bude jmenovat při spuštění programu. public static void main(String[] args) { Hra hra = new Hra(); hra.zacniHru(); }Celý Java program si umíš stáhnout odsud . TODO - úkol pro tebeDodělejte výpis, jaké karty byly hráči odstraněny z ruky, když složil páry. Udělejte další podmínky při zadávání údajů od uživatele, aby nebral karty, které někdo nemá v ruce a podobně.  Autorem tohoto blogu je Jaro Beňo , autor Java online kurzu , který můžeš na Learn2Code studovat zdarma.
Klávesové zkratky v Excelu
Tipy a triky
05.07.2017
Skillmea

Klávesové zkratky v Excelu

Připravili jsme pro tebe seznam klávesových zkratek pro Excel 2010. Tento blog popisuje nejpoužívanější klávesové zkratky, funkční klávesy a některé další běžné klávesové zkratky pro Microsoft Excel 2010 pro Windows. Pokud používáš Mac, místo Ctrl je třeba použít 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 nebo 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ář Soubor s klávesovými zkratkami v Excelu si můžeš stáhnout odsud . Plus bonusová část:  videotutoriál, jak upravit vzhled Excelu podle svých preferencí.
Nejvtipnější programátorská GIFka
Tipy a triky
02.06.2017
Martina Baumann

Nejvtipnější programátorská GIFka

Jelikož se teď trošku pohybuji v IT komunitě lidí, znám několik programátorů. A tak si pořád říkám (nebo myslím), že skutečně tráví za PC celé dny a když se zahloubí do svého kódu, nesledují, co se děje kolem nich. Vím, co říkám - kluci si totiž už třetí týden vůbec nevšimli, že jsem ostříhaná! Jak může tedy někdy vypadat takový život ortodoxního kodéru?  GIF webyPokud jsi programátor a zároveň chceš propagovat svou práci řekněme prostřednictvím blogů nebo jiných příspěvků, mohou se ti někdy hodit do článků i vtipná GIFka. Obecně nemusíš být jen programátorem, na své si přijde každý copywriter, bloger, redaktor, který něco píše a potřebuje texty doplnit o nějaké to dobré GIFko. Které webky mají ty nejGIFka? Čti dál! Takže kde zaručeně najdeš GIF, které právě potřebuješ? Čekuj zejména weby jako giphy.com  – samozřejmě, že ti jako první nemůžu nabídnout nic jiného než Giphy, protože právě tento web navštěvují denně miliony uživatelů (některé zdroje uvádějí desítky milionů a jiné zase se pohybují ve stovkách milionů) a je to určitě nejrozšířenější zdroj GIFek pod sluncem. Tady najdeš všechno, používám ho i já úplně nejčastěji a musím přiznat, že patří mezi moje nej. Další weby, které doporučuji, jsou například thecodinglove.com,reddit.com, reactiongifs.com. Pro ty vybíravé je ještě jedna možnost a to vytvořit si takové GIF, jaké přesně potřebuješ. Pokud si chceš udělat vlastní GIF, tak určitě na stránce makeagif.com. Zpět k těm našim programátorům. Opravdu si myslím, že to mohou být vtipní lidé a vůbec s nimi nemusí být až taková nuda. Abych tě přesvědčila, vybrala jsem následující GIFka.  Pondělí ráno: Takže, lehce si vyťukám svůj kód...[Image] Úterý (někdy kolem oběda): A takto může vypadat homeoffice :)[Image] Středa (ráno) - still in progress[Image] Středa (pozdě odpoledne): Takhle zase může vypadat, když je krize nebo se prostě nedaří a kód si dělá, co chce[Image] Stále středa? Možná už čtvrtek? Svítá na lepší časy?[Image] Na druhé straně - nic nepotěší programátora víc, než když jeho kód skutečně funguje tak, jak má  A následuje nefalšovaná radost! ...nebo i takto (většinou už někde kolem 18:00 pátek) Programátor musí mít prstoklad! Nebo? Když všechno fičí, jak má  Nadčasové CSS gifko, které nikdy neomrzí:)[Image] Změním jen tento jeden řádek v kódu:[Image] Skutečně 👇 [Image] Tip na závěr Mně osobně se líbí například tento blog, který mě vždy zaručeně pobaví.  Líbil se ti tento blog? Věnuj mu 👍 Které GIFko se ti líbilo nejvíc? Napiš mi ho do komentáře 👇  
Jak naprogramovat kalkulačku v Javě
Tipy a triky
05.05.2017
Skillmea

Jak naprogramovat kalkulačku v Javě

Dnes se naučíme základní operace v Javě, které si ukážeme při programování jednoduché kalkulačky. Mimo jiné se naučíme: • vypsat zadaný text • uložit hodnoty pro proměnné typu String a int • vytvoření vstupu pro uživatele • parsování textu na čísla • podmínky a jednoduché větvení • základní matematické výpočy v Javě Program kalkulačka v JavěCo tedy chceme, aby náš program uměl udělat? 1. Dokáže zaznamenat 2 čísla zadaná uživatelem do konzoly 2. Dokáže podle instrukcí zadaných uživatelem do konzole určit operaci (+, -, x, /) 3. Dokáže ze zadaných údajů provést výpočet a výsledek vypsat Po dokončení by program měl vypadat následovně:[Image] *nezapomeňte si nastavit podporu UTF 8, protože znaky lšťžýážä to brát nebude Během programování vlastní kalkulačky ji můžete použít jako šablonu a pokud objevíte ve svém programu chybu, můžete si ji podle šablony opravit. Pojďme si vysvětlit, jak jsme takový program vytvořili. Zatím si nebudeme vysvětlovat základní strukturu programu, protože se jedná o složité a pro začátečníky těžko pochopitelné pojmy (balík, třída, metoda…). Více se o struktuře programu dozvíte, když se budeme věnovat objektově orientovanému programování (OOP). Do programu popište to, co vidíte v šabloně. Vypsání textuJednou z nejjednodušších věcí, které budeme od naší aplikace chtít, je vypsat nějaký text. K tomu použijeme příkaz System.out.println(“Text“) ; Jak se dozvíme později, do závorek můžeme namísto textu v uvozovkách napsat název proměně a program nám vypíše jeho program. Tento příkaz nám odřádkuje text v programu, pokud chceme místo odřádkování pokračovat na stejném řádku, použijeme příkaz System.out.print(“Text“); středník nám představuje konec jednoho příkazu. V našem programu jej použijeme k vypsání instrukcí pro uživatele. Prázdné uvozovky nám poslouží pro vytvoření prázdného řádku. Proměnné typu String a intProměnné jsou názvy, které zastupují určité číslo nebo text, který je v nich uložen. Před názvem proměnné určujeme typ proměnné. Pro číslo slouží int a pro text String . Ukažme si několik příkladů: int a = 5; String b = "Ahoj"; Pokud bychom chtěli v kódu vypsat proměnnou, použijeme příkaz System.out.println(a); Samozřejmě můžeme vypsat několik proměnných vedle sebe klidně is obyčejným textem a to pomocí znaménka +. Kód by pak mohl vypadat následovně: System.out.println (a + b + „Text“) ; Hodnoty proměnných se mohou během průběhu programu měnit. Pokud budeme operovat s proměnnou, která již byla definována (byl u ní určen typ), nebudeme znovu její typ určovat: int a= 5; a=6; Dávejte si pozor na velká a malá písmena. U Stringu se píše první písmeno velké, protože se jedná o referenční datový typ, zatímco int je primitivní datový typ. Tím se ale zatím nebudeme zabývat. V našem programu si určíme proměnné int cislo1, int cislo2, int vysledek a String operace . Vytvoření vstupu pro uživateleDále budeme chtít, aby byl náš program interaktivní. Tedy, aby zde docházelo k oboustranné komunikaci mezi počítačem a uživatelem. K tomu si vytvoříme uživatelský vstup. Nejprve si úplně na začátek kódu přidáme metodu import java.util.Scanner; která nám zpřístupní funkce pro vstup uživatele z konzole. Do hlavního bloku kódu si pak nadefinujeme proměnnou, která nám ponese Scanner: Scanner sc= nový Scanner (System. in) ; Závorka nám zde bude definovat diakritiku, kterou použijeme. Pokud vám nebude fungovat tento kód, zkuste napsat: Scannee sc = new Scanner(System.in, “Windows-1250“); Vstup provedeme tak, že jej přiřadíme jako hodnotu k proměnné pomocí příkazu: sc . nextLine() ; Mohlo by to vypadat asi takto: String vstup = sc. nextLine() ; V programu získáme od uživatele hodnotu pro cislo1, cislo2 a operaci Počítač přečte vstupy od uživatele vždy jako text. Co však v případě, kdy budeme chtít po uživateli zadat číslo? K tomu slouží tvz. parsování. ParsováníFunkce parsování nám slouží, pokud chceme převést uživatelem zadaný text na číslo. K tomu použijeme funkci int nazevproměnné = Integer.parseInt(sc.nextLine() ); V našem programu nám poslouží k provedení vstupu u proměnných cislo1 a cislo2 z textu na číslo. PodmínkyPokud chceme, aby proběhla část kódu jen pokud jsou splněny určité podmínky, použijeme k tomu funkci if. Pokud nejsou splněny podmínky, část kódu bude přeskočena a bude pokračovat až za ní. Podmínky píšeme do závorek za klíčové slovo if a příkazy do složených závorek. a=1 if (a==1) { System.out.println(“Ahoj“) ; } Při podmínkách používáme == U textových proměnných používáme místo == funkci equals() String a = “Ahoj“ if (a. equals(“Ahoj“){ System.out.println (“Čau“) ; }Je možné používat další matematické funkce jako například srovnávání ( <, > ). V našem programu pomocí čtyř if funkcí zjistíme, jakou zadal uživatel operaci a podle toho provedeme výpočet.  Matematické operaceV Javě můžeme pracovat s různými matematickými funkcemi: Například  int a=1+2; Samozřejmě je možné nahradit čísla proměnnými. int a = b – c; V našem programu vypočítáme výsledek pomocí vysledek= cislo1 [operace] cislo2; Doufám, že se vám podařilo vytvořit vlastní funkční kalkulačku. Pokud stále máte problémy, zkuste ještě zkontrolovat, zda: • nechybí na konci některého příkazu středník, • jsou správně umístěny složené závorkyJsou správně umístěny složené závorky • jsou velká a malá písmena zapsaná správně Pro dnešek to bude všechno. Java videotutoriál pro začátečníky naleznete zde a zcela zdarma .
Tvorba fotomontáže v 7 krocích
Tipy a triky
10.04.2017
Skillmea

Tvorba fotomontáže v 7 krocích

Řekl byste, že budete někdy moci vytvořit fotomontáž ve Photoshopu? Přečtěte si tento článek a postupujte podle těchto postupů. To vám umožní vytvořit jakoukoli fotomontáž. Říkáte, že je to velmi náročné? Rozhodně ne! Tyto kroky jsou primitivně jednoduché, mohou znít jen komplikovaně. Každá jednotlivá fotomontáž je kombinací několika vrstev. Když přeháníme. To zahrnuje správnou barevnou souhvězdí. Co to znamená? Měli bychom nastavit barevné tóny tak, aby odpovídaly všem vrstvám. Pokud vrstvy nejsou barevně upraveny, nemůže dojít k fotomontáži. Jak jsem přistoupil k vytvoření fotomontáže?1. Vyberte správné fotografie - správný úhel a správná poloha objektu. Je logické, že jsem nemohl použít fotografie, kde by byl objekt vždy fotografován z jiné perspektivy. Výsledek by byl nereálný. Fotografie najdete ve svých montážích například zde. 2. Musím to vědět dříve co chci vytvořit. Budu se balit zdarma, když nevím, kam jdu: ) Musím téma vyjasnit. Co by měla moje fotomontáž čerpat? Jaké emoce chci vzbudit? Jaké barvy budu chtít mít ve fotomontáži? 3. Vyberte si nejlepší nástroje, ze kterých si můžete vybrat. Musím vzít v úvahu pozadí, ze kterého budu chtít vybrat objekt. Je pozadí jednoduché, jednotné? Nebo je to komplikované? Znamená to, že je to nepravidelné? Jinak je vybrán objekt, kde je pozadí černé nebo bílé, jako když je objekt fotografován v reálném životě, náznak někde v lese. Tam je pozadí obtížnější vrak. Nebo je na fotografii stín objektu? V tomto případě nemůžu jednoduše vybrat objekt z fotografie. Před rozhodnutím, který nástroj bych měl použít, bych si měl položit tyto a mnoho dalších otázek. Nejlépe se pracuje s PenTool - perem. Neexistuje ani magnetický laso ani kouzelná hůlka ani nástroj pro rychlý výběr výmětů. Každý z těchto nástrojů má své jedinečné použití. 4. Úvodní spojovací vrstvy v dokumentu - vidět vrstvy zapadat dohromady. Z praxe to funguje tak, že jsem našel alespoň 10 alternativních obrázků, které kombinuji, a zjistím, že mi nejvíce vyhovují. 5. Korekce barev – Musím zařídit, aby se barva shodovala s mými vrstvami. To znamená, že všechny vrstvy na scéně mají stejnou tonalitu –, jakou jsou z jednoho prostředí. Nemohu kombinovat dva obrázky, kde bude jeden obrázek vybrán z letního prostředí a druhý obrázek ze zimního prostředí: ) Máme k dispozici mnoho nástrojů, které nám pomohou vytvořit takovou barevnou shodu. • Křivky, úrovně – díky těmto dvěma nástrojům mohu krásně jemně vyladit tóny ve všech kanálech, dokonce i teplé a studené tóny. Musím jen pochopit, co je histogram a co nám ukazuje. • 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. • 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. • Jednoduché filtre – color lookup, Photo filter – určím konkrétne prednastavené hodnoty, ktoré mi upravia fotografiu. 6. Propojím svůj obrázek s režimy procházení. Metody míchání mi umožňují propojit dvě vrstvy, takže jednu vrstvu propojím s druhou pod ní. Tyto režimy byly použity k neutralizaci osvětlení na obrázku s autem. Na levé straně přišlo příliš mnoho světla a bylo nutné snížit hodnotu bílých míst vytvořených vlivem světla. Dobře mi sloužily módy, které zmenšovaly osvětlené části. Konkrétní postup od vytvoření vrstvy až po nastavení správného režimu míchání v mém online kurzu. 7. Úpravy dokončování – jedná se o úpravy, které se provádějí na konci každé fotomontáže. Buď je barevná tonalita nastavena na celém obrázku, používám různé vzory nebo textury, abych vylepšil výsledek, nebo techniku Dodge a Burn používám k ztmavnutí tmavých částí a zesvětlení světelných částí. V této fotomontáži jsem použil mapu přechodu, mapu přechodu, kde jsem nastavil hodnotu tmavých pixelů a hodnotu světelných pixelů a propojil ji s režimem míchání. Konkrétně to bylo překrytí. Kompletní postup najdete v kurzu. To by bylo všechno o vytváření fotomontáže. Rychlý postup můžete vidět na obrázku. Ale zde jste alespoň stručně popsali, jak byste měli postupovat, když si chcete vytvořit vlastní fotomontáž. Vytvořili jste si vlastní fotomontáž, ale udělali jste jinak? Podělte se o své znalosti v komentáři: )  Autor článku je Marek Chrenko.
12 zdrojů pro fotografie pro váš web zdarma
Tipy a triky
31.03.2017
Martina Baumann

12 zdrojů pro fotografie pro váš web zdarma

Každý, kdo má svůj vlastní blog nebo web, zná problém s fotografiemi a obrázky článků, příspěvků a blogů velmi dobře. Pokud nejste vášnivý fotograf a nemáte vlastní ilustrace v rezervě a nefotografujete vše, co vám spadá pod ruku jako divoký, musíte přemýšlet o tom, jaký obrázek použít při psaní vlastních textů. Buďme upřímní, kdo už dnes čte články bez fotografií? Naopak, fotografie je první věc, která dohání osobu a se zájmem klikne na publikovaný materiál. A právě zmíněná fotografie ruku v ruce s dobrým nadpisem bude motivovat potenciálního čtenáře, aby se vypořádal s příspěvkem (, a v tom lepším případě ji také sdílel na fejsbúku, kde pak sledujete jako ) celý večer. Dejte si pozor na autorská práva!Internet je plný profesionálních fotografií, ale problém je s autorským právem. Používání cizích materiálů je totiz neetické, na druhé straně vám může být také vystaveno mastné pokutě za fotografii autora. A co ( ne ), pokud nemám databázi obrázků a nemám prostředky na využívání placených agenturních služeb, které poskytují obrazovou službu? Nejprve byste určitě nepohnuli autorovu fotografii, nelíbilo by se vám, kdyby se někdo představil s vaší prací.  Nepanikařte, najdete také fotografie na internetu, které jsou zdarma!Tady je opět internetový pomocník - ale musíte se podívat na správné webové stránky, a proto jsou „zdarma“". Jak? Stále existuje spousta zdrojů, ze kterých můžete čerpat bezplatné obrazové materiály pro další použití bez rizika pokut. Takže a teď, kde si můžete stáhnout obrázky pro svůj projekt? Jaké jsou nejlepší bezplatné fotobobany? FLICKR Nekonečné miliony a biliony fotografií ( jejich množství zdarma ) - toto je Flickr, komunita, místo, nevyčerpatelný zdroj obrázků používaných miliony lidí. Velmi populární, ale nezapomeňte zkontrolovat jejich licenci. skrz Creative Commons Můžete tedy vidět přesné podmínky použití fotografií a několik možností použití obrázku. PIXABAY Další web, kde můžete najít, stáhnout a sdílet obrázky, je Pixabay - se stránkou uvádějící, že všechny obrázky jsou publikovány uvnitř Creative Commons. Výhodou je, že obrázky lze nejen stáhnout, ale také upravovat a dále distribuovat pro komerční účely. A to není všechno, kromě obrázků, nabízí také vektory a různé ilustrace. FREEPIC Freepik také nabízí zajímavé možnosti obrázků, které jsou jako jinak - zdarma! Databáze hledá obrázky pomocí několika zdrojů, takže většina uživatelů souhlasí s tím, že vám tento web ušetří kopec času. Hledáte konkrétní fotografii podle jména nebo kategorie. PEXELY Pexels má také bohatou databázi různých obrázků, které lze volně používat, a zároveň pracuje na principu Creative Commons. A opět hurá - všechny fotografie jsou použitelné pro komerční účely. UNSPLASH Zdarma přehlídkové fotografie a vše pro komerční použití pod licencí Creative Commons Zero. Můžete se přihlásit k jejich zpravodaji a každých 10 dní obdržet 10 fotografií s vysokým rozlišením. SEN Dreamstime má sekci, kde si můžete najmout bezplatné fotografie. Na stránce musíte vytvořit účet. PICJUMBO Fotobanka českého fotografa a designéra Viktora Hanáčka, který založil tuto stránku v roce 2013 v reakci na odmítnutí jeho fotografií klasickými placenými fotografickými bankami kvůli nedostatečné kvalitě. Uživatelé dosud stáhli několik milionů obrázků. CANVA Ve Photoshopu chytíte paniku a vaše srdce začne divoce bít? Pokud se neodvážíte a máte z toho noční můry, použijte bezplatnou službu, kterou nabízí CANVA - je to jednoduché, rychlé a efektivní. Můžete v něm vytvořit kopec ilustračních obrázků, nabízí řadu bezplatných obrázků a grafiky. Stačí se zaregistrovat prostřednictvím pošty nebo Facebooku a jdete na to! Stačí začít. Více bezplatných databázíhttps://morguefile.com/ https://www.sitebuilderreport.com/stock-up http://www.rgbstock.com/ https://stocksnap.io/ + desítky dalších zdrojů, které existují na internetu. Tip: s CC Search můžete hledat obrázky podle vybrané licence prostřednictvím externích služeb, jako je. Flicke nebo Google Images. CENOVÁ RADA PŘI ZLATÉ Tyto databáze mohou vaši práci zjednodušit, ale nezapomeňte si pravidla pečlivě přečíst, můžete se zde vyhnout mnoha problémům - zde určitě řeknete: Podívejte se, zkontrolujte a stáhněte jednou! A pokud jde o pravidla, která by nikdy neměla být porušena - nezapomeňte použít takové fotografie k dalšímu prodeji nebo nevyplňte online databázi. Pomysli na zdroj! Přestože obrázky z bezplatných databází jsou úžasným pomocníkem, musíte se vždy podívat a přečíst si podmínky použití a licenci fotobanky. Každý může mít jiné, může je průběžně měnit atd. Některé databáze mají tendenci požadovat zveřejnění zpětného odkazu, ze kterého pořídily fotografii. Takže vždy zkontrolujte, jak to je s licencí a nezapomeňte zdroj, zdroj, zdroj. Zlaté pravidlo, které slouží čest: ) Používáte fotobanky nebo obrázky zdarma? Napište své další tipy na stránky s bezplatnými fotografiemi v komentáři, rádi rozbalíme náš seznam.
16 Photoshop pluginů, které ti zjednoduší život
Tipy a triky
13.01.2017
Skillmea

16 Photoshop pluginů, které ti zjednoduší život

Ano, každý z nás chce ušetřit čas a platí to iu Photoshopu. Proto existují pluginy. Tedy jakési rozšíření, díky kterým ušetříš spoustu času. Určitě zvládneš pracovat i bez pluginů, ale bude to pracnější. Už jako název říká: plug (vložit) – in (do něčeho). Dobře, stačí slovíčkání. Jedná se o rozšíření do aplikace. Ti počítačově zdatnější znají, jak se kdysi instalovaly takové pluginy, kde jste museli najít správnou složku, rozbalit obsah zazipovaného souboru, překopírovat to tam, restartovat Photoshop a bylo to. Teď to je o troška jednodušší. Existuje aplikace Adobe Extension Manager (je zdarma), díky které dokážeš vyhledávat pluginy všeho druhu a každé chuti pro různé aplikace – samozřejmě od Adobe 😊 Stačí zadat klíčové slovo, co chceš aby plugin vyřešil za tebe a vyběhne ti několik příkladů pluginů, které jsi jednoduše nainstaluješ a máš to v aplikaci. Nemusíš používat Adobe Extension Manager. Také můžeš jít na oficiální stránku tvůrce pluginu a odtud si stáhnout tento plugin a nainstalovat – ale pozor: platí, že plugin by se měl umět „nainstalovat sám“. Adobe Photoshop CC 2017 omezil instalaci pluginů „páté přes deváté“. Nebo to už byl CC 2015? Doba se mění. Vše, co má příponu XZP (tedy pluginové balíky) by se mělo instalovat prostřednictvím Adobe Extension Manager. Dost mluvení. Přejděme k tomu důležitějšímu. Které jsou to nejpoužívanější pluginy, které ti ušetří čas? A jsou tedy i bezplatné 😊 Může jich být více nebo méně, ale toto jsou jedny z nejoblíbenějších: Google Nik CollectionToto neber doslova. Je to Photoshop od Googlu. Díky tomuto pluginu dokážeš odstranit noise (šum) z fotografie, umíš si pohrát s tonalitou obrázků nebo zvolit různé přednastavené filtry aby tvé fotky vypadaly ještě lépe. Layers ControlVelice užitečný nástroj, díky kterému si zachováš pořádek ve svých vrstvách. Zkontroluje a odstraní prázdné vrstvy, rychle přejmenuje vrstvy nebo překonvertuje vrstvu na Smart Object. Jsou to banální věci? Mohou být, ale při pravidelných úpravách vrstev si tento plugin zamiluješ. VelositeyTaké velmi užitečný plugin pro designéry. Pomocí něj dokážeš navrhnout design stránky za „pár“ vteřin. Cut and slice meZapomeň na ztracený čas při nastavování rozměrů na obrázku. Tento plugin má uloženo mnoho rozměrů, které určitě využiješ. Size MarksUž jsi potřeboval zjistit mezeru mezi dvěma elementy? Jak jsi to zkoušel? Existují krkolomné způsoby, ale vítězem se stává... Shadow generatorZnáš flat design? Je to docela populární. Hlavně když se rozmáhá minimalismus. Long shadows, tedy dlouhé stíny jsou neodmyslitelnou součástí flat designu. ComposerPotřebuješ provést jednu změnu na 15 vrstvách? Jedna změna na první vrstvě, druhá změna na druhé vrstvě, třetí změna a projde i půl hodina 😁 Proveď klidně změnu i na 100 vrstvách pomocí pár kliků. Harry’s filterKdo ví kdo byl ten Harry, ale musel to být někdo chytrý když byl po něm pojmenován tento plugin. V něm najdeš desítky přednastavených efektů, které jsou připraveny k použití. DupplicatorJednoduše .. kopíruj vrstvy tolikrát, kolik bude potřeba. Již jsme zmínili několik pluginů pro práci s vrstvami. Tak snad si vybereš jeden z nich. Výborné pluginy, ale placené: WebZapDesignuj weby jak páááán. Tento plugin ti v tom pomůže. RenamyMůžeš, nemusíš použít, tentokrát zvládneš přejmenovat i 100 vrstev najednou. PSD CleanerPřiznejme si to, jsme trošku bordeláři. Tento plugin nám pomůže udržovat naše PSDčko čisté a přehledné. Například odstraní nepotřebné nebo nepoužité vrstvy. CSS HatPro front-end kodéry to může být alfa a omega. Všechno, co vytvoří ve Photoshopu umí zkonvertovat do CSS3. Retouching panelŽe profesionální retuš je těžká k naučení? Nemusí tomu tak být vždy. FlaticonA jsme zase u flat designu. Bohatá databáze ikonek, které využijete při nejedné infografice. Super SprayŽe Photoshop má málo přednastavených brushů? Nevadí, rozšíř si kolekci brushů. S těmito brushy můžeš doslova kreslit cokoli. DOSLOVA! Možná si řekneš, že docela slušná pálka za takové pluginy, ale když to využiješ a vydělá ti to, proč toho nevyužít? Tak to platí i pro online kurzy o Photoshopu. Investovaný čas do těchto kurzů se může přeměnit například ve slibnou práci grafika. Toto byl seznam oblíbenějších pluginů. Znáš jiné, které jsou také v něčem užitečné? Poděl se o ně v komentářích.
Nejpoužívanější klávesové zkratky v Adobe Photoshop
Tipy a triky
02.01.2017
Skillmea

Nejpoužívanější klávesové zkratky v Adobe Photoshop

Člověk je tvor líný, resp. tvor vynalézavý a ještě iv počítačové éře se vynalezl a zavedl klávesové zkratky. Ale musí se uznat, že klávesové zkratky dokážou ušetřit opravdu hodně času. Lidé, kteří ovládají klávesové zkratky v programech se nazývají PC ninjové :) Určitě budeš potřebovat velké odhodlání a dávku trpělivosti, aby ses stal takovým machrem, ale výsledek stojí za to. Ušetříš velké množství času, které bys jinak ztratil při rozklikávání jednotlivých záložek a hledání konkrétních příkazů... a určitě ohromíš kolegy nebo kámoše, když uvidí co dokážou tvé prsty na klávesnici.[Image] Chceš se stát PC ninjem ve Photoshopu? Připravili jsme pro tebe seznam 26 nejpoužívanějších zkratek ve Photoshopu, věříme, že ti pomohou a využiješ je. Aaaa pozor, aby se ti nezapletly prsty z těch klávesových kombinací :) [Image] Seznam nejpoužívanějších klávesových zkratek ve Photoshopu PDF verzi této infografiky s klávesovými zkratkami si můžeš stáhnout odsud. UPDATE 10.1.2017: přibyl videotutoriál, který tě provede tvorbou infografiky. Sleduj video, zkoušej a vyrob svou vlastní grafiku: Znáš i jiné klávesové zkratky, které zjendodušují práci? Poděl se a napiš je do komentu dolů. Mimochodem, líbí se ti tato infografika? Je to moderní způsob podávání informací v dnešní počítačové éře. Určitě by se to sešlo i tobě. Nauč se jak vytvořit takovou infografiku v našem kurzu Visual Design Digital: úprava fotek ve Photoshopu, kde si ukážeme, jak se taková infografika vytvoří krok po kroku. Také si vysvětlíme technické předpoklady, které by měla splňovat vytvořená infografika. Určitě to bude stát za to ;)
Jak se stát iOS vývojářem
Tipy a triky
03.10.2016
Skillmea

Jak se stát iOS vývojářem

Zřejmě uvažuješ nad tím, že se staneš vývojářem pro platformu iOS. Budeš mít blízko ik programování pro tvOS (Apple TV), watchOS (Apple Watch), macOS (stolní a přenosné počítače) a možná v budoucnu carOS, … Tentokrát se podíváme na to, co všechno potřebuješ k tomu, aby ses stal iOS vývojářům buď na volné noze nebo jako zaměstnanec. Zkusím to ozřejmit z pohledu, jak to řešíme my v  become.sk . Klidně se mi ozvi pro bližší informace, určitě tě odkážu na  Swiftologa , online kurz iOS programování, který probíhá formou naučných videí. V tomto kurzu získáš základní přehled jazyka Swift a vyzkoušíš si v něm udělat (zatím) jednu vzorovou aplikaci. Co potom? Řekneš si, vždyť to všechno stojí peníze. No ano, no stojí. Třeba si uvědomit, že ve všem je lidská energie a čas. Platí se za něj. Pokud existují věci zadarmo, tak ty zaplatil někdo jiný místo tebe, za což můžeme v podstatě všichni děkovat. No dobře, dost bylo moralizování, pojďme si ukázat, co všechno potřebuješ k tomu stát se řádným iOS programátorem, řekněme v průběhu roku. Hardware a software – kolik tě to bude státMožná už máš počítač s OS X, později macOS. Pokud ne, tak věz, že potřebuješ právě ten. Pokud nemáš, na tvém místě bych v závislosti na poměru cena/výkon volil  iMac 21,5“ . Tento odkaz není reklama, uvádím jej na Traco čistě dobrovolně :-). Takový iMac koupíš za cca 1200 € a výše. Pokud chceš levnější stolní počítač, tak budeš muset sáhnout po  Mac Mini , trochu mu budeš muset rozšířit RAM (cca 100 €), dokoupit displej alespoň za 300 €, dokoupit Apple klávesnici (120 €) a myš (86 €) nebo Trackpad (144 €). Tato možnost dohromady vychází cca. 1200 €, tedy stejně jako komplexní iMac, kde už máš všechno. Cenu umíš samozřejmě srazit cenou displeje. Ze zkušenosti však vím, že čím lepší displej, tím snáze se bude i tobě programovat. [Různé typy Mac zařízení] Pokud chceš přenosný počítač, doporučuji  MacBook Pro . Nový a nejlevnější 13“ koupíš za 1450 €. Občas jsou i výprodeje starších modelů, kde se umíš cenou dostat na 1150 €. Nad jiným než Pro ani neuvažuj, protože MacBook ani MacBook Air se na vývoj nehodí. Jsou příliš nevýkonné na to, co časem budeš potřebovat. Ze začátku možná ano, ale za rok intenzivního vývoje od tvého začátku jistě nebudou stíhat. Věř mi. No dobře, a co zařízení, pro které budeš vyvíjet? Máš iPhone (679€)? Máš iPad (369€)? A co Apple TV (179 €) nebo Apple Watch (349 €)? Doporučuji začít s iPhone zařízením. Nejen, že budeš mít telefon, ale také řádný systém iOS, který ti umožňuje velmi mnoho, zatímco tvOS a watchOS jsou do jisté míry omezené. iPad je také v pohodě, ale neobsahuje některé důležité součástky, které obsahuje iPhone. Např. si z něj nezavoláš přes operátora. Ono to jde pomocí  Continuity , iz Macu dnes už zavoláš, ale v zásadě jen když máš iPhone. Když to zkusím zhruba spočítat, tak na hardware potřebuješ 2000 €. Zda je to hodně či málo, je na tobě. Když však budeš dobrý, vrátí se ti to několikanásobně. Software tě vyjde v podstatě zadarmo. Co ti stačí je vývojové prostředí  Xcode , ve kterém budeš vše programovat. Pokud jsi schopen udělat si i grafiku, doporučuji  Sketch , který však stojí $99. Pokud chceš kreslit rastrové obrázky, doporučuji  Pixelmator  za 29,99 €. Jako příklad uvedu sebe. Já jsem si v roce 2010 koupil iMac 27“ za 1600 € a mám ho dodnes. Jednou jsem mu rozšiřoval RAM ze 4GB na 16GB. Díky němu jsem začal programovat pro iOS. Úplnou náhodou, ale to je jiný příběh. Začal jsem podle knihy ještě v jazyce Objective-C, dělal jsem vlastní appky, nějaké klientské, později pracoval pro  starbug ,  inloop  a teď vedu tým vývojářů mobilních appek a školím/učím programovat pro iOS. Takže těch 1600 € se mi vrátilo v průběhu 6 let dostatečně na to, abych uživil rodinu, abychom si mohli dovolit koupit auto, … Na co ještě čekáš? Licence, živnost nebo zaměstnáníNepotřebuješ nic z toho. Ale pokud uvažuješ nad seriózním vývojem, tak minimálně Apple licenci za $99/rok potřebuješ. Ta ti umožňuje odesílat aplikace do App Store, případně máš více výhod spojených s dostupností obsahu pro Apple vývojáře i beta verze nového softwaru pro vývoj a máš šanci dostat se na konferenci WWDC pořádanou firmou Apple. Jakmile však začneš peníze vydělávat, byť i jeden cent, potřebuješ je přiznat daňovému úřadu. Pokud tato částka je menší než nějaká hodnota, daň ani odvody neplatíš. Přesáhneš-li jistou částku, už musíš platit i daň, odvody atp. Tam je už dobrá živnost nebo srůčka. Ve všem kolem daňových informací ti poradí chytrý účetní nebo účetní. Pokud nechceš mít tyto problémy, zaměstnej se ve firmě, která vyvíjí mobilní appky. Vyděláš stabilně. Nicméně, pokud chceš prodávat i vlastní věci, platí výše zmíněné. Všechny peníze musíš přiznat. Pokud ti můžu já poradit: založ si živnost a najdi si stabilní příjem z vývoje (na volné noze, zaměstnanec, to je jedno). Budeš mít více možností, víc volnosti. Možná tě to vyjde více peněz odvedených do státní kasy, ale tím se netrap. I stát potřebuje k provozu jisté peníze stejně jako ty. Platí pravidlo: pokud moc chceš, neřešíš prkotiny, ale podstatu toho, co chceš. PraxePoznáš inzeráty typu: „hledáme mladého flexibilního absolventa s praxí.“ Často však absolventi praxi nemají, neboť „vysoké školy nejsou učňovky,“ jak mi jednou zamumlal vedoucí naší katedry informatiky. Asi se urazil, když jsem mu řekl, že měli bychom mít více praktických zkušeností než teorie. Jak to ale vyřešit? Vedle školy můžeš využít různá školení, kurzy, a když se bavíme o programování pro iOS, udělej si na začátku Swiftologa a pak se přihlas k nám do become.cz, protože jsme vymysleli způsob, jak získáš zdarma praxi ještě během studia na škole a naučíš se při tom programovat. Zlepšíš se a postupně začneš už i vydělávat na stále náročnějších projektech. Některým z vás prošel po zádech mráz, když jsem vyslovil „stále náročnější“. No ano, programovat není jednoduché. Mozek ti bude na začátku vytékat z hlavy a budeš hladový, ale pokud vydržíš, posbíráš ovoce. Poradím ti: nechci vydělat hned na začátku spoustu peněz. Nevyplatí se ti to a nebudeš mít ani praxi, ani peníze. Buď ochoten dát jistou dobu svému vzdělání bez nároku na výplatu. Jsi ještě student, máš zřejmě rodiče, kteří ti hradí studium. To je obrovská výhoda, kterou je dobré využít. Nepotřebuješ už tehdy vydělávat jako Mark, Steve nebo Milan. Fakt ne :-). Nebo pokud se chceš stát programátorem vedle práce, kterou už nechceš dělat, tak v ní pokračuj, dokud nezískáš zkušenosti v programování natolik, že si můžeš dovolit vzít placený projekt. Ono to začne. Přijde jeden projekt za rok, na další rok dva, potom čtyři, osm, … a exponenciála roste a přináší ovoce. Jen vydrž a nechci všechno hned. Protože tento svět nefunguje. [Image] A zavři už ten článek o příběhu dalšího úspěšného startupu, který získal peníze, ale reálnou hodnotu nevytváří. Je to bublina. Přečti si raději článek o tom, proč zase další (relativně) úspěšný  projekt končí . Nechce se ti to číst? Prozradím ti podstatu: nevydělávají dost peněz na svůj provoz. Zapomeň na milionový startup, udělej něco užitečného pro sebe a své okolí a možná budeš mít štěstí a vyděláš na tom. Potom se bude o tobě psát, ale ty budeš vědět, že úspěch nepřichází přes noc, ale po letech dřiny a odříkání. Dost bylo mudrování, uvedu ti nyní několik zdrojů, ze kterých můžeš čerpat při svém vzdělávání. Vzdělávací programy Apple nabízí osnovu a materiály vzdělávacího programu  programování v jazyce Swift . Ono to je mnoho materiálu, ale bez edukační teorie, samotný materiál nevzdělává, není tam žádná příručka, není to náhrada kurzů. Je určen učitelům, kteří chtějí někoho učit programovat. Podle něj jdu individuálně učit jednoho člověka, který se chce naučit od nuly programovat a hned jde skočit na jazyk Swift a Apple platformu. Abych to uvedl na pravou míru, ten člověk prošel denními kurzy s více účastníky i online kurzy, ale zjistil, že jemu vyhovuje jiné tempo a individuální přístup. Pak zde máme online vzdělávací kurzy. Swiftolog  od  Learn2Code , který jsem připravil já. Má dvě části, v první si projdeš jazykem Swift, v  té druhé  si naprogramuješ ukázkovou aplikaci. Abych byl kompletní, musím uvést i jiné vzdělávací instituce, které nabízejí online kurzy programování pro iOS. Coursera  nabízí  kurzy vývoje pro iOS , jejich nevýhodou i výhodou v našich končinách je anglický jazyk. Takhle v terénu se ho naučíš nejlépe. Některé kurzy jsou placené, jiné zdarma. Stačí si vybrat a studovat. Pak tady je  EdX , ale o iOS je tam toho podstatně méně. Tutoriály Někdy si řekneš, že jdeš si sám nebo sama zkoušet postupy, které někdo dal dohromady. Jak vytvořit hru, jak provést aplikaci podobnou instagramu, atp. Tyto návody jsou pěknou ilustrací toho, jak věci na pozadí aplikací fungují. Pokud chceš vyzkoušet opravdu dobré tutoriály, zajdi na  RayWenderlich.com  a něco pohledej. Tutoriálů jsou tam stovky, od programování jednoduché „Hello World“ appky, přes programování serverové části pro podporu aplikace až po Apple Watch nebo Apple TV. Vybrat si můžeš, většina z nich je zdarma, jinak nabízejí ucelené knihy plné návodů i takových, co se na web nevešly. Možná časem narazíš i na jiný web věnující se návodům, tento je ovšem jeden z nejlepších. Fórum Občas se stane, že se potřebuješ zeptat, jak vyřešit „neřešitelný“ problém, ale ze začátku neznáš nikoho znalého, lepšího než ty, kdo by ti poradil. Proto zajdi na  StackOverflow  a zeptej se tam. Jejich promakaný systém hodnocení otázek a odpovědí dává tomuto fóru jedinečnost v tom, že určitě umíš na první pohled zjistit, která odpověď je vhodná pro tvůj problém. Oni totiž implementovali promyšlenou gamifikaci, která ve své podstatě stojí na kladení otázek, jejich zodpovězení, editaci a hodnocení. Na tomto základě získáváš hodnosti a reputaci na fóru. Ono to funguje výborně, neboť každého člověka to udržuje v aktivitě. Celé fórum je v angličtině samozřejmě. Znovu platí, pokud přetrpíš začátky, že angličtině nerozumíš, tak později porozumíš. A bude to dobré. Jak porozumět angličtiněUž jsem cosi naznačil spíše v článku. Jsou čtyři oblasti angličtiny (i jiných jazyků), které je dobré trénovat: 1. Poslech 2. Čtení  3. Mluvení  4. Psaní  [Image] Poslech  si trénuj tak, že budeš audiovizuální obsah sledovat výlučně v angličtině, i když tomu nebudeš hned rozumět. Slovíčka a fráze se zvyknou opakovat a ty postupně pochopíš kontext vysloveného. Čtení  trénuj dobrým čtením. Nejen tutoriálů a dokumentace, ale také článků na blozích a magazínech, různá fóra. Tak se naučíš, jak se skládají věty, i když mnohdy se mohou vyskytnout chyby. Nic si z toho nedělej, postupně je budeš umět odhalit. Buď sám, nebo s trochou pomoci zběhlejšího překladatele. Mluvení  trénuj mluvením :-) Zapni Siri a něco jí řekni… každý den :-). To by byl začátek. Potom najdi člověka, s kým si můžeš promluvit v angličtině. Ideální ze zahraničí přes Skype. Nebo vycestuj do zahraničí a zkus se něco zeptat. Například zkus  MyEnglishTeacher.eu ,  speaking24.com  nebo si viz  seznam dalších . Při troše snahy lze takových zdrojů najít kvantum, ověř jsi, který ti vyhovuje a jdi na to. Psaní  se sveze vedle tří výše zmíněných aktivit. Totiž musíš umět napsat, co hledáš, napíšeš nějaký komentář pod přečtené nebo svůj vlastní názor na Facebook či  Medium . Stejně tak si domluvíš rozhovor s člověkem ze zahraničí přes email, kde musíš psát také. Při všech aktivitách se neboj dělat chyby. Pár lidí tě zdrbe za to, že si vůbec dovoluješ s takovou angličtinou něco prezentovat. Jenže to je přesně ten správný moment, kdy se naučíš něco nového. Zeptej se těch lidí na to, jak by znění změnili a určitě ti poradí. Tvá cenaNebuď hloupý a neptej mnoho. Jsi junior, začátečník nebo velmi mírně a vlažně pokročilý, ale stále se máš co ušít. Jak to vím? No protože čteš tento článek, jsi jeho cílovka. I profík to musí, ale na jiné úrovni. Nastav si cenu na začátku například. na interval 0€ – 5€/hod. Teď si to v hlavě přepočítáš, zjistíš, že za měsíc (160 hodin) bys vydělal 800 € a za rok 9600 €. Z toho odvést ještě daň, odvody a zůstane ti polovina. Tvá představa však byla alespoň dvou až trojnásobná. No řekněme si pravdu, že abys fakt mohl vydělávat 20000 € ročně a více, potřebuješ si toho dost hodně odprogramovat, abys appku nerealizoval dva měsíce, ale dva týdny. Víš, toho, co ti bude dávat peníze také něco stojíš a dobře si rozmyslí, jestli se mu vyplatí zaplatit profíka na málo hodin nebo začátečníka na spoustu hodin. V konečném důsledku ho to finančně vyjde stejně, [Image] S cenou to je jako se stromem. Teď se asi učíš programovat, jsi na začátku, tak to ber, že jsi zasadil semínko jabloně. Začínáš růst, jak roste malý výhonek, ale od toho výhonku ještě nežádáš, aby ti dal jablka. Sám víš, že dospělou jabloní ještě není. Stačilo by, kdyby přišla myš, okousla kořínek a všechno je v prdeli. Ty jsi také ten výhonek, a když se budeš snažit vydělat co nejvíce, nic z toho nebude, neboť nikdo ti to nedá. Ptej si vodu, kterou cháp projekty, které budeš dělat byť zadarmo. Ze začátku. Na nich se naučíš komunikovat, projektový management, osobní časový management, plánovat a v neposlední řadě i programovat. Ani se nenaděješ ao pár měsíců budeš na úrovni, kdy už budeš i něco vydělávat. ZávěremPřestaň teď číst, přejdi  Swiftologa , otevři Xcode a udělej něco. Případně se mi ozvi ;-) a pak si dej Swiftologa. Autorem blogu je  Peter Druska , který je lektorem online kurzu programování iOS aplikací  Swiftolog . Zajímá tě programování nebo designování? Vyber si některý z našich dalších online a prezenčních kurzů pro začátečníky a mírně pokročilé na  https://skillmea.sk .