Jump to content
Geekforum.cz

Copenhagen

Uživatel
  • Posts

    389
  • Joined

  • Last visited

  • Days Won

    8

Reputation Activity

  1. Like
    Copenhagen reacted to glararan in Chart.js useknutá line, ako pridať min a max +1?   
    Vyhoď stepSize a min + max spočítej jako: diff = (největší hodnota - nejmenší hodnota) / počet y labelů; min = nejmenší hodnota - diff; max = největší hodnota + diff
  2. Like
    Copenhagen got a reaction from Wladass in Marketing Miner - najpoužívanejší SEO nástroj   
    Pred pár dňami sme vydali veľkú novinku v podobe nových profilerov na analýzu domény webu (domain profiler) a na analýzu kľúčových slov (keyword profiler). 
    Domain profiler - ukážka pre alza.cz
    Po zadaní domény a zvolení správneho trhu vám profiler vráti:
    Odhadovanú návštevnosť webu Organické dotazy, na ktoré sa web vyskytuje vo výsledkoch vyhľadávania (odhadovaná návštevnosť z daného dotazu, pozícia, mesačná hľadanosť dotazu a konkrétna podstránka) Platené dotazy, na ktoré web inzeruje v PPC - Google Ads (odhadovaná návštevnosť z daného dotazu, pozícia, mesačná hľadanosť dotazu a konkrétna podstránka) Odkazový profil webu Technológie, ktoré využívajú Podobné konkurenčné weby (aby ste zistili, kto je ešte vaša konkurencia) Pridali sme aj pokročilú možnosť filtrácie na základe viacerých kritérii (napr. SERP rozšrenia = vyfiltrovať si iba tie, kde je knowledge graph, images....).
    Je to vynikajúci spôsob ako si zanalyzovať konkurenciu, na aké dotazy sa vyskytuje v organických výsledkoch vyhľadávania a porovnať si ich s vašimi. Tam kde sa vy nevyskytujete a konkurencia áno, tak viete, že o tie KW sa oplatí rozšíriť váš web (nejakou podstránkou - napr. blogový článok / produkt...).
    Dáta si môžete stiahnuť a ďalej s nimi pracovať v .csv alebo vašom obľúbenom programe. 
    Keyword profiler - ukážka pre slovo počítač
    Po zadaní kľúčového slova vám vyprofiluje nasledujúce metriky:
    Priemerná mesačná hľadanosť kľúčového slova Odhadovaná cena CPC Trendovosť Návrh kľúčových slov (možnosť zvoliť si aj otázky a zamerať sa na optimalizáciu pre knowledge graph) Prvých 10 organických výsledkov vyhľadávania Platené výsledky vyhľadávania V Domain profilery sú zatiaľ dáta za 1 crawl SERPu, o pár dní prebehne ďalší crawl a následne sa budú môcť pri doménach sledovať aj historické údaje. Pri keyword profilery máme pre Česko databázu KW o veľkosti 2,1 miliónov a pre Slovensko 1 milión hľadaných KW. Jedná sa tak o väčšiu databázu ako má napr. Ahrefs. 
    Najbližšie plány sú pridanie tretieho profileru = URL profileru. 
     
     
  3. Thanks
    Copenhagen reacted to glararan in Useful nástroje při vytváření webu   
    Seznam užitečných nástrojů, které používám při tvorbě webů:
    Flat icon (vícebarevné/jednobarevné flat ikonky) Core UI (templaty na bootstrapu bez/s frameworkem vue/react/angular pro administrační panel) Animate.css (css framework pro animace) One page love (inspirace pro one-page templaty) Web design inspiration (inspirace jak by měl web vypadat, vhodné pro první nástřel pokud nemáte design/grafika) Dribbble (inspirace pro UI kity) Pixabay (obrázky bez copyrightu) Unsplash (obrázky bez copyrightu) Coolors (webová aplikace, která vám pomůže sladit barvy designu) Creative Tim (zajímavé placené/volné šablony pro administrační stránku) Font awesome (placené/volné ikonky pro web - light verze pouze v PRO) Themify icons (light ikonky - alternativa k fontawesome) Web gradients (hledáte gradient barvičky? Tak použijte už volně namíchané!) Za mě top stránky, které používám při tvorbě:
    Web design inspiration Coolors Web gradients Pixabay Animate.css Font awesome Creative Tim (v případě, že potřebuji mít zajímavou administraci)  
    Snad jsem na nic nezapomněl 🙂 
     
     
     
     
     
     
     
     
  4. Like
    Copenhagen reacted to Wladass in Remove Image Background   
    Včera jsem objevil zajímavý online nástroj, který ti odstraní backgroung z fotografií. Dostupný na doméně remove.bg

  5. Thanks
    Copenhagen reacted to Milan Pichlík in Jak zrychlit web (nejen) na Wordpressu? Pár šikovných tipů   
    Zdravím,
    rychlost webu je pořád poměrně podceňované téma, a to i přes to, že všichni nesnáší, když musí na stránku čekat. 😛
    Nejen pro affiláky jsme si připravili pár tipů, jak zjednodušit a zrychlit svůj Wordpressový projekt a přilákat tak více návštěvníků.
    Celý návod najdete zde: https://affiliateagency.cz/nacitani-webu/
    TL:DR;
    Zmenšete velikost stránky Komprimujte fotografie Odstraňte zbytečné vizuál Využijte mezipaměti Minifikujte zdrojový kód Zkuste web komprimovat Zkuste AMP Zrychlete hosting Přesuňte se na HTTP/2 protokol Využijte virtuálního serveru Snižte počet požadavků HTTP protokolu Zkombinujte CSS dokumenty Fyzicky se přibližte návštěvníkům Využijte CDN servery Máte další tipy? Určitě budeme rádi za diskusi! 🙂
  6. Like
    Copenhagen reacted to Komalarn in Ako NEVYKONAŤ script na konkrétnej stránke?   
    Tak to udělej jednoduše...
    Všechno nech jak jsi měl původně (v době co jsi psal první příspěvek.
    Dej containeru, do kterýho vypisuješ reklamu, inline styl:

    <div id="tvujContainer" style="display:none;"></div>
    a potom přes podmínku od Glararana

    <script> $(document).ready(function(){ if(window.location.href != "http://hiphopforum.sk/ucp.php?mode=register") { $("#tvujContainer").css("display", "block"); } }); </script>
    Takhle zůstane na registraci skrytá a pro ostatní stránky se beze změny zobrazí.
  7. Like
    Copenhagen reacted to Komalarn in Ako NEVYKONAŤ script na konkrétnej stránke?   
    Dám sem jeden rychlej tip: Pokud děláš na webu jakoukoliv reklamu, nikdy nepoužívej třídy a ID jako ,,ad", ,,advert" nebo tvoje ,,rightad". Všechno tohle a mnoho dalších blokuje adbock. Nejsem si jistej, jestli je to tvůj případ, ale pro jistotu si vypni adblock, ať máš jistotu.
    Ale i tak doporučuju pro reklamy třídy s názvem něco jako ,,sf8angkwqfn" (náhodné znaky).
  8. Like
    Copenhagen reacted to glararan in Ako NEVYKONAŤ script na konkrétnej stránke?   
    if(somethingIsTrue) { var sc = document.createElement('script'); sc.src = 'http://code.jquery.com/jquery-1.5.js'; sc.type = 'text/javascript'; if(typeof sc['async'] !== 'undefined') { sc.async = true; } document.getElementsByTagName('head')[0].appendChild(sc); }
     
    pro somethingIsTrue použij ve tvém případě

    window.location.href != "tvojePožadovanáUrl"
  9. Like
    Copenhagen got a reaction from odysey in Nelze odeslat celý form   
    Možno by si mohol napísať aj riešenie, ako si to vyriešil, aby sa ostatní nepýtali na ten istý problém keď na neho narazia
  10. Like
    Copenhagen got a reaction from Wladass in Nelze odeslat celý form   
    Možno by si mohol napísať aj riešenie, ako si to vyriešil, aby sa ostatní nepýtali na ten istý problém keď na neho narazia
  11. Like
    Copenhagen reacted to Ariczek in [jsoup] Parser webu   
    V dnešním díle nepravidelného cyklu se podíváme na to, jak v javě parsovat html stránku.
     
    Spousta webů dneska se proti parsování snaží bránit. Různý redirecty, javascript a podobně.
    Aby dokázal Java program si poradit i s takovými weby, musí si v principu zahrát na webový prohlížeč.
     
    Na pomoc si vezmeme již vytvořenou knihovnu jsoup - https://jsoup.org/
    Web obsahuje i cookbook, jak se s knihovnou pracuje.
     
    S pomocí této knihovny je napsání parseru poměrně triviální záležitost.
    Ukážeme si to na reálném webu - http://1url.cz/ptb6J, knihovna si poradí i s redirect, takže správně zpracovává až ov.ihned.cz
     
    Jako první krok potřebujeme načíst stránku, to se provede:

    // fetch URI and parse Document doc = Jsoup.connect(url).get();
     
    Hledáme na stránce tabulku, pro každý její řádek chceme vypsat IČO a datum.

    // we are looking for a table Elements tables = doc.select("table"); // there should be just one, but use foreach, just to be sure for (Element table : tables) { // need rows Elements rows = table.select("tr"); for (Element row : rows) { // need columns Elements cols = row.select("td"); // basically, the first row will not have any td, skip if (cols.size() > 2) { // // needed there just to get URL, if wanted // Element link = cols.get(0).select("a").first(); // control what will be printed. ICO, date System.out.println(String.format("%s, %s", cols.get(2).text(), cols.get(4).text()); } } }
     
    Fórko s tím vložením kódu pracuje úplně na nic, tak snad si to rozluštíte
     
    V případě potřeby pro daný záznam máme připraven i link na samotný zápis, který by se zase otevřel a zpracoval.
    Enjoy!
     
    Ariczek
  12. Like
    Copenhagen reacted to ntdrt in [Free] VPS   
    Ano, takže wedos ti smaže eshop kvůli tomu, že tam máš pár obrázků . Je to absurdní stejně jako tato diskuze.
     
    Mimochodem... Jako člen týmu tohoto fóra by si měl pravidla vyžadovat, nikoliv porušovat.
     
    Ty chceš abych ti vykal? To snad ne. Člověk, kterej mě posílal bůh ví kam, sepsal na mě všechny existující urážky a potom mě přál abych umřel. To fakt ne. To po mě nemůžeš chtít . Vykání je forma projevu úcty a to v tomhle případě určitě není na místě.
  13. Like
    Copenhagen reacted to Hookyns in [JS, Node.js] Private property a private metody   
    Čaute lidi,
     
    po dlouhé době zde zase vyvinu nějakou tu aktivitu.
     
    Už dlouho jsem neměl volný čas, a tak můj Node.js framework (pamatuje si vůbec někdo, že jsem se vám o něm zmiňoval? ) stagnoval. Nyní se mu opět věnuji, i když zatím v malé míře, ale postupuji. Že jsem měl takovou delší pauzu má svou výhodu a to velký postup Node.js z verze 0.12 na 7.1, které nyní plně využívá ES6 a nějaké drobnosti z ES7.
     
    V souvislosti s plnou podporou ES6 trochu přepisuji jádro frameworku. Zároveň jsem vytvořil nový přístup k private vlastnostem tříd a JS ES6 synaxi singletonu.
     
    Private vlastnosti řeším přes Mixin, který je v ES6 řešený spíše jako dědičnost. Rovnou uvedu kód.

    function Private(refObject, extend) { var storage = []; var idCounter = 0; var cls = class extends (extend || class {}) { constructor() { super(); // Get new ID this.__privateId = idCounter++; var clsInstance = this; // Define proxy as dynamic prperty accessor storage[this.__privateId] = new Proxy({}, { get: function(target, name) { if (!(name in target)) { return undefined; } return target[name]; }, set: function(target, name, value) { if (typeof value == "function") { target[name] = function(...args) { return value.apply(clsInstance, args) }; } else { target[name] = value; } return true; } }); } }; // Return proxy with access to privae context refObject.accessor = function(self) { return storage[self.__privateId]; }; return cls; } module.exports = Private;
    Private() je funkce, která vrací třídu, buď prázdnou nebo převzatou určenou k podědění. Na třídu naváže ID pro přístup k private uložišti a také vrátí v ref parametru accesor pro přístup do private uložiště.
     
    Příklad použití (rovnou i s ukázkou tvorby singletonu):

    var Private = require("jumbo-core/utils/private"); var accessor = {}, _; class Test extends Private(accessor/*, OptionalParentClass*/) { constructor() { super(); if (new.target != Activator) { // new.target is used constructor throw new Error("You cannot call private constructor!"); } _(this).method = function(name, surname) { console.log("New test: ", name, surname); }; } foo() { _(this).test = "Does it work?"; } bar() { var $this = _(this); // Shortcut $this.method("Foo", "Bar"); return $this.test; } static getInstance() { return Reflect.construct(Test, [], Activator); // Create instance of class Test but use Activator's constructor } } _ = accessor.accessor; // Just for shorting notation; Otherway you must write accessor.accessor(this).propertyName // Used for creating instance class Activator extends Test { } // var t = new Test(); throw error var t = Test.getInstance(); console.log(t instanceof Test); // true t.foo(); console.log(t.bar());
     
     
    BTW, stejně to asi nikdo nepoužijete, ale kdyby náhodou...
  14. Like
    Copenhagen reacted to Hookyns in Jak znáte programovací jazyky?   
    You guessed

    18
    out of

    20
    !

  15. Like
    Copenhagen reacted to Tondas in Přímý tisk ve Visual Basicu 6.0   
    Odpověď je jednoduchá, je mi 65 let a už třicet let programuji v Basicu (pouze pro vlastní potřebu, nikoli profi).Ve Vb6 si naprogramuji vše, co potřebuji. Nemám důvod v mém věku přecházet na něco jiného. Problém, který řeším jsem nevyčetl v žádné knížce. Jde o to poslat soubor přímo na tiskárnu, která je připojena přes paralelní port a není v OS nainstalována, tedy žádný "Print". Jde o malou tiskárnu účtenek LUKHAN LK-T21 na kterou nemůžu sehnat ovladač. Ten co jsem stáhl z internetu nefunguje.
     
    Přeji hezký den.
     
    Tondas
  16. Like
    Copenhagen reacted to Ariczek in Aribeth   
    Ani ne já chápu že no-lifeři na tom budou lépe/dále
  17. Like
    Copenhagen reacted to Xmat in Blogr.cz - rádi uvítáme všechny blogery   
    Tak to je takový argument... Jakože nemá, ale pokud chce, může si ho založit. Ke klasické registraci taky potřebuješ email a jo, jsou lidi, co nemají ani email. Pokud nemá facebook 1% lidí, tak to pro nás asi není problém. To už spíš chápu to, že se někdo přes facebook prostě registrovat nechce.
  18. Like
    Copenhagen reacted to Shoot in Kto sme / ste?   
    Tak, čo sa týka mňa, som ešte študent na vysokej škole - Fakulta informatiky a informačných technológií, STU Bratislava.
     
    Popri škole menežujem webové projekty vo firme DeepMind s.r.o. kde som zároveň spoluzakladateľ spoločnosti a pracujem ako programátor pre NEXT VISION s.r.o.
     
    Vo voľnom čase spolupracujem na projektoch s @Clou.
     
     
    Čo sa týka záľub a aktivít mimo IT, rád si zahrám basketbal, florbal, futbal.
  19. Like
    Copenhagen reacted to ntdrt in Administrátorský Systém   
    Redmine je sračka? No... Takže máš dvě možnosti:
    1. seš hloupý a nedokážeš pochopit jak funguje plnohodnotný software na řízení projektů
    2. jednoduše si to nechtěl pochopit
     
    Vyber si sám... Já pracoval s redmine 2 roky a neměl jsem nic, co bych redmine mohl vytknout. K tomu redmine používá celá hromada projektů, takže si nemyslím, že by chyba byla v redmine. Spíš to bude na tvé straně .
     
    Navíc jak to může nadělat chyby? To by mě taky zajímalo... Kdyby si uvedl příklad, kdy díky redmine vznikl nějaký problém, to bych byl ocenil.
  20. Like
    Copenhagen reacted to Ariczek in Kto sme / ste?   
    Ahoj, jmenuju se ariczek a jsem alkoholik...
     
    THX Bindik za inspiraci
  21. Like
    Copenhagen reacted to LMRig in Jak vybrat správnou herní grafickou kartu   
    Hodně lidí v dnešní době si pořizuje PC jen na hraní her. Proto byste měli svoji pozornost při vybírání věnovat hlavně grafické kartě. Samozřejmě jsou i hry, které těží hlavně z výkonu CPU, patří mezi ně například CS:GO a celkově jejich Source Engine. Většina her, ale těží právě z grafické karty.
     
     
    Hlouposti, na které narazíte:
     
    Větší paměť = více výkonu
    - ano, toto opravdu platí, ovšem pokud karta umí paměť využít a je možno ji využít -> vyšší rozlišení, vysoké nastavení textur.
    Jsou karty (např. GT630), které disponují 4GB VRAM, ovšem jejich jádro je tak slabé, že je v životě nemůžou využít. Není vůbec určena na hraní, maximálně starších her. Je určena hlavně uživatelům, co sledují filmy, pracují v nenáročných programech atp.
     
     
    AMD CPU = AMD GPU / Intel CPU = Nvidia GPU
    - opravdu nemusíte používat tyto kombinace CPU a GK, jsou mezi sebou kompatibilní a nenesou vůbec žádné mínusy nebo problémy. Je úplně jedno jestli dáte Intel CPU, AMD GK, je to to stejné, jako dávat MSI GK do ASRock desky, ničemu to nevadí.
     
     
    Nvidia má lepší grafiky / AMD má lepší grafiky
    - o tomto se již šířilo mnoho debat, válek mezi uživateli obou výrobců. Realita je taková, že žádný z výrobců, není horší nebo lepší. Vždycky konkurence vydá stejně výkonnou kartu, aby mohla soupeřit s kartami toho druhého. Je pravda, že AMD má častěji vyšší spotřebu, to se ale s příchodem nových R9 NANO, Fury,... zlepšilo. Technologie má každý výrobce svoje, většina jsou si podobná, jen každá funguje ve svém teritoriu.
     
     
    GDDR5 = Nekompatibilní s deskami s DDR3
    - toto je samozřejmě nesmysl, je to podobné, jako u kombinace AMD/AMD, Intel/Nvidia. Karta má svoje paměti, deska má svoje paměti, na toto nemusíte brát vůbec ohled.
     
     
    Výběr
     
    Cena
     
    Asi nejdůležitější věc, při výběru karty. Často nejdražší komponenta v sestavě. Rozdělit je můžeme do low-endu, mainstreamu a hi-end.
     
    Pokud budeme počítat s PC na hry, nemá opravdu smysl kupovat karty pod 2500Kč, kde už se pohybují už jenom takové karty, které já nazývám jako "pouze zobrazovače plochy" (730 / 740 / 240).
     
    Takové použitelnější už se jeví 750Ti / 260X po 1050 / 460 .
    Mainstreamem se dnes již myslí R9 270X / 470 až po 290X / 1060 / 480 / 390X / Nano / 970 / 780Ti, pomalu už i 980 a 1070.
    Hi-end samozřejmě 980Ti / Fury X / 1080 ....
     
     
    Brát ohled musíme samozřejmě i na CPU, je zbytečné kupovat i7 k 270X a naopak 980 k i3.
     
     
     
    Externí výrobci
     
    Druhá věc, která bude rozhodovat při vašem výběru, bude od jakého výrobce, nemyslím tím už Nvidia nebo AMD, ale výrobce, kteří kartu upravují po svém - chladič, PCB, součástky, frekvence.
     
    V ČR jsou obecně nejrozšířenější MSI, Gigabyte, ASUS, Sapphire, Evga.
    Méně známí Palit, Gainward, Zotac, na bazarech někdy i Club3D.
     
     
    Kvalitativně jsou na tom nejlépe MSI, Gigabyte, ASUS, Evga. Z těch výrobců, co u nás jsou špatně k sehnání je to např. Club3D, Zotac vyšší verze, Inno3D, KFA2. Bohužel u nás právě jen s dvouletou zárukou.
     
    Dále se karty řadí do různých edic, od limitovaných až po stálé vyšší a nižší. Pokud chcete opravdu tu nejkvalitnější kartu od daných výrobců, jsou to např. tyto:
     
    MSI - Hawk, Lightning
    ASUS - ROG
    Gigabyte - Extreme
    Sapphire - Toxic
    EVGA - Kingpin
     
    Tyto karty mají většinou pár věcí, které ulehčí taktování. Vždy mají lépe řešené chlazení, napájení a více součástek, které pomáhají stabilitě a vyššímu taktování.
     
     
    Zdroj
     
    Ovšem to nejhlavnější, podle čeho musíte kartu vybírat je - zdroj. Nejdůležitější komponenta v PC, s nekvalitním zdrojem, můžete přijít o jednu, ale také o všechny komponenty, pokud jeho ochrana selže.
     
    U nás nejprodávanější kvalitní výrobce zdrojů, je bezpochyby Seasonic, již od OEM verzí až po jejich top edice se jedná o kvalitní zdroje s kvalitními součástkami, nižší verze sice nemají např. opletené kabely nebo mají vyšší zvlnění, ale velmi málo se stává, že by tento zdroj vyhořel a případně s sebou vzal jinou komponentu.
     
    Další, kteří se řadí mezi ty kvalitnější, jsou např. Corsairy. Jejich řady RM a výše, jsou velmi kvalitní. Nejnižší řada, kterou poradím, jsou CXxxxM Buildery.
     
    Celkem nedávno se u nás objevily zdroje od Evgy. Verze G2 a GS jsou to nejkvalitnější, co od těchto výrobců můžete pořídit a přitom stojí na svou kvalitu velmi málo. Po registraci do 14 dní od koupě na ně máte 10 let záruku a nabízí i semipasivní režim.
     
    Většinou můžete v obchodech u karet napsáno "Doporučený výkon zdroje". Tyto hodnoty mohou být docela matoucí, u karet, které potřebují maximálně 250W najdete 600W zdroj, přitom celá sestava bude mít maximálně 500W. Je to hlavně z toho důvodu, když si někdo koupí 600W Zalman, který je rád za to, že se vůbec dostal na trh. Případně kdybyste vlastnili 200W AMD CPU .
     
    Levné dostatečně kvalitní zdroje jsou ještě např. Fortron Hexa+ a Fortron Hyper.
     
     
     
    Rada: Jestliže se rozmýšlíte mezi několika stejnými kartami (např. 4x 1060 atp.). Vyberte si tu nejlevnější nebo tu, která má u sebe nejvíce věcí navíc (bývají to myši, kódy na hry, podložky a jiné...), které můžete prodat. Důvod je jednoduchý, většinou se karty od různých výrobců za podobnou cenu liší jenom tím, jaké mají frekvence, ovšem těchto frekvencí můžete na 90% případů dosáhnout i sami (tento odstavec se netýká karet, které se liší použitým chladičem, tam už je pak rozdíl klidně znatelný - hlučnost, teploty, kvalita PCB a součástek).
     
     
    Pokud vás napadá, co bych mohl doplnit nebo mám někde chyby, dejte prosím vědět.
    Díky a přeju šťastný výběr.
  22. Like
    Copenhagen reacted to EeRa in Funny topic - Věci co vás pobavily   
  23. Like
    Copenhagen reacted to odysey in Funny topic - Věci co vás pobavily   
    Fronta na iPhone 5
  24. Like
    Copenhagen reacted to Hookyns in [Serial Node.js] Díl 1. Úvod   
    Zdravím,
     
    posledních pár let se věnuji JavaScriptu a konkrétně Node.js skoro rok. Předpokládám, že z mých dřívějších příspěvků na fóru již víte, co to Node.js je, takže to nemusím rozvádět.
     
    Hned v počátku mého nástupu na Node.js jsem si vzal velký krajíc, obecně jako vždy když začínám něco nového, a pustil jsem se do tvorby webového frameworku. Webový framework na Node.js je něco co zatím ještě neexistuje nebo alespoň ne v takovém měřítku, jak klasické webové frameworky, například z PHP, vnímáme v dnešní době. To že žádný takový framework zatím ještě neexistuje je má motivace. Node.js je svým způsobem novinka. Spousta lidí říká, že Node.js není určený k tvorbě webových stránek. Ale proč k tomu není určený? No protože třeba pro PHP existuje spousta hotových frameworků a k nim spousta CMS, eshop systémů aj. Proč tedy dělat něco nového? Node.js pro to není určené, protože se to nikomu dělat nechce. Node.js je už spíše na úrovni C#, Javy a jiných nízkoúrovňových jazyků. Takže webový framework se na Node.js vytvoří asi stejně jako v C# nebo Javě. Vytvoříte Socket server, který poslouchá na nějakém portu, přijmete požadavek, uděláte nějakou magii a pošlete výsledek z5. Tak to prostě funguje, avšak s tím rozdílem, že Node.js má připravenou funkcionalitu k http komunikaci, takže vytvořit na něm webový framework bude o chlup jednodušší než třeba v holém C# či Javě.
     
    Motivací pro tento seriál je právě rozšíření znalostí v oblasti Node.js, a tím podpoření mého frameworku. Název mého frameworku je Jumbo. Už teď je Jumbo schopný vytvořit plnohodnotné stránky stejně jednoduše jako to jde s Nette. Nette je mimo jiné předlohou Jumba, protože Nette je v česku široce rozšířený framework, a tak se s ním lidem bude lépe pracovat, když bude mít podobné konstrukce.
     
    Co vše si tedy v seriálu řekneme/ukážeme?
    V úvodu si společně zprovozníme Node.js a vytvoříme jednoduchou aplikaci, ke které budeme moci přistoupit z prohlížeče.
     
     
    Malé opakování JS
    Node.js je eventově řízený jazyk. To v podstatě znamená, že všechny akce - nebo alespoň většina - běží "asynchronně". Proto je Node.js plné callback funkcí bez kterých by to prostě nešlo.
     
    Proto si v rámci opakování ukážeme práci s anonymními fcemi a práci s closure a scope.
    A právě scope a closure jsou dle mého "dvě" věci, které dělají lidem v JS problém, proto ho moc lidí nevyužívá na programování, protože pochopení scope a closure v JS není jednoduché a je příčinou hodně problémů.
     
    První ukážu kód a následně jej vysvětlím.
     

    /** * Proměnná definovaná v globálním scope * @type {String} */ var globalniPromenna = "global"; var druhaGlobalniPromenna; var tretiGlobalniPromenna; (function () { var prvniLokalniPromenna = "Ahoj "; })(); (function () { druhaGlobalniPromenna = ", Nazdar "; })(); (function () { tretiGlobalniPromenna = ", Zdravím "; }); (function (param) { var lokalniPromenna = ", Čau "; /** * * @param {String} parametr * @param {Function} callback * @returns {String} */ var anonymniFunkce = function (parametr, callback) { var prvniGlobalniPromenna = prvniGlobalniPromenna || ""; if (!callback) { throw new Error("Nemáte nastaven callback"); } if (typeof callback != "function") { throw new Error("Callback není funkce"); } setTimeout(function () { if (parametr == "throw") { throw new Error("Je libo nezachytitelnou vyjímku?"); } if (parametr == "callback-error") { callback(null, new Error("Tady máš ten svůj error, klidně si ho chyť.")); return; } callback(typeof parametr == "string" ? (globalniPromenna + " " + param + ": " + prvniGlobalniPromenna + druhaGlobalniPromenna + tretiGlobalniPromenna + lokalniPromenna + " | " + parametr).toUpperCase() : "Tak když mi nedáš data co chci, tak ti vrátím prd!"); }, 1000); }; var result; // Zavoláme se správným parametrem, ale bez callbacku try { result = anonymniFunkce("Test"); } catch (err) { console.log("Špatné volání vrátilo: ", result); console.log(err.message); } // Zavoláme se správným parametrem, ale se špatným callbackem try { result = anonymniFunkce("Test", "Zde má být callback fce, ne string"); } catch (err) { console.log("Druhé špatné volání vrátilo: ", result); console.log(err.message); } // Zavoláme se špatným parametrem try { result = anonymniFunkce(true, function (data) { alert(data); }); console.log("Třetí špatné volání vrátilo: ", result); } catch (err) { console.log(err.message); } // Konečně zavoláme správně try { var dalsiPromenna = "A výsledek je: "; result = anonymniFunkce("Test", function (data) { alert(dalsiPromenna + data); }); console.log("Správné volání vrátilo: ", result); } catch (err) { console.log(err.message); } // Teď si zkusíme chytit asynchronní Error try { result = anonymniFunkce("throw", function (data) { alert(dalsiPromenna + " | " + data); }); console.log("Throw volání vrátilo: ", result); } catch (err) { console.log(err.message); } // Teď si zkusíme chytit callback Error try { result = anonymniFunkce("callback-error", function (data, err) { if (err instanceof Error) { console.log("Callback chyba: ", err.message); return; } alert(dalsiPromenna + " | " + data); }); console.log("Callback err volání vrátilo: ", result); } catch (err) { console.log(err.message); } })("pozdravy");
     
    Tak script je delší než jsem původně plánoval, ale je to tak dobře. Script ukazuje práci se scope a closure a zároveň ukazuje fci callbacků a zachytávání chyb v Node.js.
     
    Když se na script podíváte, uvidíte několik anonymních fcí a několik proměnných.
    Dokážete si tipnout, jaké výsledné data vrátí callback správného volání?
     
    Script si vyzkoušejte normálně v prohlížeči a podívejte se, co vrátí konzole.
     

    tmp.html:48 Špatné volání vrátilo: undefined tmp.html:49 Nemáte nastaven callback tmp.html:57 Druhé špatné volání vrátilo: undefined tmp.html:58 Callback není funkce tmp.html:67 Třetí špatné volání vrátilo: undefined tmp.html:81 Správné volání vrátilo: undefined tmp.html:93 Throw volání vrátilo: undefined tmp.html:110 Callback err volání vrátilo: undefined tmp.html:29 Uncaught Error: Je libo nezachytitelnou vyjímku?(anonymous function) @ tmp.html:29 tmp.html:103 Callback chyba: Tady máš ten svůj error, klidně si ho chyť.
     
    Všechny návratové hodnoty jsou undefined, protože volaná fce jednoduše nic nevrací. To co má fce vrátit, tak předává do callbacku jako parametr.
     
    Vysvětlení scriptu
    Ještě před vysvětlením scriptu vám ukážu jednoduché příklady na dílčí problémy
     
    Scope a closure
    Closure je zapouzdření, které vytvoříme pomocí function() {}
    Vytvořením closure nám v podstatě vzniknou 2 scope, a to globální a lokální.
    Proměnné, které jsou deklarovány uvnitř funkce jsou lokální a mimo tuto funkci nejsou viditelné.
    Naopak vše co bylo vytvořeno nad function() {} je pro closure jeho globální scope.
     
    Příklad

    var opravduGlobalniPromenna = ", která je definovaná ve skutečném globálním scopu aplikace, není zapouzdřena žádnou fcí."; // Vytvoříme closure; anonymní fci, kterou i ihned zavoláme (function() { var lokalniPromenna = "Lokální promenná pro toto closure"; var funkce = function() { var dalsiLokalniPromenna = "Lokální promenná pro toto closure"; // dalsiLokalniPromenna je pro toto closure lokální proměnnou a localniPromenna je globální proměnnou společně s opravduGlobalniPromennou // Zde jednoduše vidím vše co bylo definováno zde i dříve; Co však bylo definováno zde, není vidět venku }; })();
     
    Schválně jsem se díval ještě na internet, jak bych to mohl pěkně vysvětlit a líbil se mi příklad podobný tomuto.

    <script> function soucet(a) { return function(b) { return a + b; } } var prictiPetKCislu = soucet(5); console.log(prictiPetKCislu(10)); // Vrátí 15 var pristiOsmKCislu = soucet(8); console.log(prictiPetKCislu(3)); // Vrátí 11 </script>
    Vytvořil jsem funkci soucet, která přijímá jeden parametr. Uvnitř této funkce v lokálním scope je dostupný tento parametr a.
    Funkce nedělá nic jiného, než že vrací anonymní fci, která také přijímá jeden parametr.
    Uvnitř anonymní fce je dostupný parametr b, který je v lokálním scope, a parametr a, který fce zdědila z globálního scope.
    Je jedno, že jsme funkci soucet zavolali dříve než fci, kterou nám soucet vrátil. Vrácená anonymní fce si svá scope pamatuje celý život aplikace.
     
    Když tedy v prvním případě použití zavolám fci soucet() s parametrem 5, uloží se mi do proměnné prictiPetKCislu anonymní fce, tedy:

    prictiPetKCislu = function(b) { return a + b; };
    K tomu si tato fce pamatuje její globální scope, tedy ten scope ve kterém byla vytvořena. Tím pádem si bude celý zbytek aplikace pamatovat, že existuje nějaká proměnná a a že její hodnota je 5. Může tedy vrátit součet proměnné a a svým parametrem b.
     
    Konečně vysvětlení scriptu
    Doufám, že jste již problematiku scope pochopili, tak pro vás již nebude problém pochopit hlavní script.
     
    Na začátku sciptu deklaruju 3 globální proměnné. Hodnotu přiřazji jen první proměnné. Hodnota ostatních zůstává undefined.
     
    Poté tam mám 3 anonymní fce. První vytváří jen lokální proměnnou, takže dál ve scriptu nebude vůbec dostupná a dotaz na tuto proměnnou vyhodí error.
    Druhá anonymní fce v pořádku přistoupí ke globální proměnné a přiřadí ji hodnotu.
    Třetí fce by udělala to samé, jenže ji pouze vytvářím, ale nevolám. Na konci chybí závorky () naznačující volání. Hodnota této proměnné tedy zůstane undefined.
     
    Pak vytvářím anonymní fci na zapouzdření zbytku kódu. Tato fce přijímá jeden parametr.
    Uvnitř je deklarována lokální proměnná a je jí také přiřazena hodnota.
     
    Dále vytvářím fci a ukládám si ji do proměnné. Tato fce přijímá 2 parametry.
    Na začátku fce dělám nějakou magii s prvniGlobalniPromennou. Musím to udělat pro vaše zmatení. Kdybych to neudělal, tak později aplikace vyhodí error, protože do výpisu chci přiřadit tuto proměnnou, ale není deklarovaná. Proto ji deklaruji zde.
     
    Pod manévrem na zmatení je ověření callbacku. První testuji, jestli je vůbec callback nastaven. Pokud není, tak vyhodím vyjímku.
    To samé hned pod tím. Testuji, jestli je callback function.
    Tyto vyhozené vyjímky je možné zachytit try-catch blokem, protože je vyjímka vyhozena v době volání funkce.
     
    Pod ověřením mám setTimeout(), abych nasymuloval nějakou tu asynchronní akci.
    Uvnitř setTimeout() první ověřuji parametr. Parametrem vlastně říkám co se má stát, je to kvůli simulaci.
    První podmínka vyhodí vyjímku, kterou však nepůjde zachytit, protože script už je dávno za voláním této funkce, takže už je dávno mimo try-catch blokem. Vyjímka tedy nebude zachycena a script skončí chybou a dále nepokračuje.
    Druhá podmínka také hodí chybu, ale už stylem Node.js. Jednoduše ji předá do callbacku jako poslední parametr.
     
    No a nakunec tu máme náš výpis, jehož výsledek jste měli uhodnout.
     
    Pokud je parametr string, tak vracím:

    (globalniPromenna + " " + param + ": " + prvniGlobalniPromenna + druhaGlobalniPromenna + tretiGlobalniPromenna + lokalniPromenna + " | " + parametr).toUpperCase()
    globalniPromenna je normálně dostupná a obsahuje global
    param je pro volanou fci z globálního scope, je to parametr předaný anonymní zapoudřující fci. Je také dustupný a obsahuje pozdravy.
    prvniGlobaniPromenna obsahuje prázdný řetězec. Byla původně deklarována uplně nahoře, ale v lokálním scope. Já jsem ji předefinoval na prázdný řetězec, jinak by zde vyletěla chyba a script by skončil.
    druháGlobalniPromenna obsahuje , Nazdar.
    tretiGlobalniPromenna je undefined.
    localniPromenna obsahuje , Čau.
    a parametr se různí podle volání.
     
    Tohle všechno spojím a převedu na velké znaky a máme výsledek.
     
    Doufám že to chápete. Pokud ne, ptejte se.
     
     
    Instalace Node.js
    Instalace Node.js je poměrně jednoduchá.
    Jděte na adresu https://nodejs.org/en/download/stable/ a stáhněte si to co máte.
    Instalátory obsahují samotné Node.js a npm (package manager), který si rozhodně také nainstalujte.
     
    Myslím že instalaci nemusím nijak složitě vysvětlovat. Pokud by se vyskytly nějaké neočekávané problémy, tak vám jistě strejda google rád poradí.
     
     
    První Node.js script
    Tak a jdeme "noudit".
     
    Kdekoliv na disku si vytvořte soubor, například prvni-node-script.js
    Do toho souboru můžete již psát jakýkoliv JavaScript.
     
    Já jsem pro vás napsal základní scriptík na otestování:

    var a = 5; var b = 6; console.log("a = ", a); console.log("b = ", b); console.log("a + b = ", a + b);
     
    Myslím že script nemusím složitě popisovat.
    Vytvořil jsem 2 proměnné a vypsal jsem jejich součet.
     
    Jak script spustit?
    Normálně z konzole/terminálu.
     
    /misto/kde/mate/node.exe /misto/kde/mate/vas/prvni-node-script.js
     
    Můžete si zkusit hrát a trochu si to osahat.
    Ale s využitím základního JavaScriptu toho moc neuděláte. Obzvlášť když zde není žádné window, document a celá DOM struktura.
    Každopádně si můžete hrát s třídama a vytvořit si něco. Třeba nějakou hru s rytířem a drakem.
     
     
    HTTP server
    Zde se dostaneme k praktickému využití Node.js a už se konečně seznámíme i s nějakými věcmi, které Node.js k JavaScriptu přidává.
     
    První věc co musím vysvětlit je fce require(). Dělá přesně to co si asi myslíte. Načítá jiné soubory. Ale nedělá to asi tak jak si myslíte.
     
    Fce require opravdu načítá soubory, ale nevrací její obsah a už vůbec ho nevloží do místa volání jako require v PHP. Funkce require zavolá daný soubor a samostatně jej spustí. Tím samostatně myslím opravdu samostatně, protože se v daném souboru nelze dostat k proměnným ani jiným věcem ze souboru, který jej volá. -- Lze to přes globální objekt global, na který můžete přidávat vlastnosti, ale o tom se moc nemluví. --
     
    Na co tedy require je, když z něj nic nedostanu?
    Dostanete. Vše co chcete ze souboru (v Node.js jsou tyto requirované soubory spíše moduly) pustit ven, musíte nastavit do objektu module.exports.
     
    Pomocí require tedy načítáme moduly. Pokud načítáme základní moduly z Node.js, udáváme pouze jejich název, bez cesty, bez přípony souboru. Pokud chceme načíst naše vlastní moduly, musíme to udělat i s cestou a příponou souboru.
     
    Takže.. Abychom mohli vytvořit nějaký http server, budeme potřebovat modul http. Můžete si k němu dohledat informace v API, které je asi největším zdrojem informací.
     
    Podle API, http má metodu createServer, která pžijímá jeden parametr. Parametrem je funkce, která je zaregistrována jako requestListener -> tzn. když dojde na server request, zavolá se váše callback funkce.
    Váš callback dostane 2 parametry, request a response, díky kterým získáte informace o příchozím dotazu a dostanete možnost a něj i odpovědět.
     
    Rovnou ukážu základní příklad ze stránek Node.js

    const http = require('http'); const hostname = '127.0.0.1'; const port = 80; http.createServer(function(req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write("A jak jinak začít než se známou klasikou.\n"); res.end('Hello World\n'); }).listen(port, hostname, function() { console.log("Server running at http://", hostname, ":", port); });
    Ve scriptu tedy vytváříme http server. Serveru dáváme callback, ve kterém zpracujeme každé příchozí spojení.
    Na serveru poté zavoláme metodu listen() a předáme jí IP a port, na kterém má server běžet.
     
    Nyní si můžete v prohlížeči normálně otevřít http://127.0.0.1 a uvidíte vaše Hello World!
     
    Nastavujeme content-type odpovědi na plain text, takže budou špatně vykresleny diakritické znaky.
    Trochu si to upravíme a vrátíme už nějaké to HTML.
     

    const http = require('http'); const hostname = '127.0.0.1'; const port = 80; http.createServer(function(req, res) { // Zapíšeme čas startu console.time("request-time"); res.writeHead(200, { 'Content-Type': 'text/html' }); res.write("<!DOCTYPE html>" + "<html>" + "<head>" + "<meta charset='UTF-8'>" + "<title>Hello World page - special HTML edition</title>" + "<style>" + "body, html {margin:0;padding:0;} body { background: #222; color: #eee; padding: 10px;}" + "</style>" + "</head>" + "<body>" + "<h1>Hello World</h1>" + "<p>A co ta naše speciální diakritika?</p>" + "</body>" + "</html>" ); res.end(); // Odešleme odpověď // Vypíšeme si dobu zpracování dotazu console.timeEnd("request-time"); }).listen(port, hostname, function() { console.log("Server running at http://", hostname, ":", port); });
    Zde už vracíme plnohodnoutnou HTML stránku, plus jsem přidal výpis do konzole s dobou provádění dotazu.
     
    To je asi v tomto dílu vše. Pokud máte nějaké dotazy či připomínky, klidně piště.
    Budu rád, když vám to bude všem fungovat, zalíbí se vám to a u Node.js zůstanete.
     
    Kdy bude další díl těžko říct. Možná ho napíšu ještě dnes.
    V dalším díle bych bych už vytvořil nějaký vlastní modul. Nějak bych rozšířil tento základ.
     
    Až tak ve třetím díle bych se pustil třeba do využití Node.js jako pozadí pro AJAX.
    Vytvořil bych třeba AngularJS clienta a všechna data by tahal z Node.js serveru.
     
    No a samozřejmě jak jsem měl tento díl skoro hotový, tak jsem zmáčkl nějakou kravinu a přepsala se mi záložka. Když jsem dal z5, tak se objevil automaticky uložený obsah 20 minut z5. Teď už fakt nemám náladu to dopisovat, takže doplním zítra.
     
    EDIT: Doplnil jsem zatím část s opakováním.
    EDIT: Doplněno
  25. Like
    Copenhagen reacted to Hookyns in [Node.js] Jumbo - web framework   
    Po delší odezvě jsem zase něco málo udělal na frameworku.
     
    Vylepšil jsem formuláře, Locator, přidal jsem RAM cache pro templaty, podporu cookie, db, aj.
    Jako testovací app v repu je teď chat se správou místností.
     
    Do Jumba (btw název toho frameworku) se teď opřu, protože jsem s jedním člověkem dohodnutý, že mu na tom postavím e-shop.
    Samozřejmě jsem ho obeznámil s tím, co je Node.js zač a nabídl jsem mu za to podstatnou slevu, protože to budu brát i jako vlastní projekt.
     
    Tím pádem vlastně i zvýším potencionální zájem o Node.js - konkrétně o Jumba - protože už bude existovat i CMS a eshop systém, takže už by to mohlo mít i nějaké využití.
     
    Jinak s přidanou cache je jeden dotaz zpracovaný za cca 4ms v průměru.
×
×
  • Create New...