Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  

bLuma

Members
  • Content count

    2523
  • Joined

  • Last visited

  • Days Won

    19

Posts posted by bLuma


  1. Pokud používáš doporučený ovladač k dané grafice a problém přetrvává i po reinstalaci systému tak je to pravděpodobně jedna z následujících možností:

    • vadná grafická karta
    • přehřívání grafické karty
    • nedostatečné napájení grafické karty

     

    Dobré by bylo, kdyby byla možnost otestovat grafiku v jiné sestavě jinak se bez dalších informací (typ GK, crashlog driveru, ...) blbě určí příčina.

    • Upvote 1

  2. Dotaz by jsi ušetřil leda u součtu na statusu, nicméně lepší jeden optimalizovanej dotaz než sčítání pomocí mysql_num_rows nebo ještě huře.

    EDIT: https://bitbucket.org/wtfko/wowapi/src/0632912cec34/WApi/WApi.php#cl-31 lepší a zároveň univerzální řešení neexistuje.

    Za optimalizovaný dotaz bych osobně považoval takový, kterému stačí využít index. Což sloupce online a race nesplňují. Osobně jsem měl na mysli, provést SELECT s GROUP BY a počty týmů a celkový součet sečíst v PHP. Ale o kolik by to bylo rychlejší/pomalejší nebudu spekulovat.

     

    Pleteš si lazy-loading a autoloading. Lazy-loading tam je, viz storage.

    Ups, tady jsem opravdu prohodil pojem :) Ale jinak výtku mám - singleton u storage není dobré řešení. Pokud budu mít dva realmy stejného emulátoru tak to nebude fungovat.

    • Upvote 1

  3. Vypadá to zajímavě, ale u většiny lidí to povede ke zbytečnému zvýšení zátěže db. Protože to udělají jako ve tvém příkladu a místo jednoho dotazu na počty hráčů použijí hned tři... Tím, že to degraduješ na předávání SQL dotazů neumožníš žádné mezi výpočty nebo v aktuálním stavu vracení více výsledků (TOP10 aj.).

     

    Lazy loading tam opravdu nemáš.

    require_once WAPI_DIR."/WApiInterfaces.php";

    require_once WAPI_DIR."/WApiExceptions.php";

    require_once WAPI_DIR."/WApiDrivers.php";

    require_once WAPI_DIR."/WApiEmulators.php";

    require_once WAPI_DIR."/WApiStorage.php";

    require_once WAPI_DIR."/WApi.php";

     

    To cachování prakticky nemá význam. Takovýhle dotaz použiješ na stránce jednou možná dvakrát a mezi různými HTTP requesty to necachuješ. Dobře napsaný web to nepoužije vůbec.

     

    Nápad zajímavý, ale z mého pohledu to není momentálně dobrá koncepce/architektura.

    • Upvote 2

  4. Process.h také i když není v ANSI C. Pod W32 platformou a některými dalšími je ten soubor dostupný. Pokud to jó chceš ANSI C tak si to přepiš. Ovšem tady nešlo o to v jakém je to hlavičkovém souboru. Ani o to rýpat se v tom, co je lepší pro C/C++. Vzhledem k lineární složitosti toho algoritmu by pro určité aplikace šlo vymyslet rychlejší varianty (binární půlení, hashování, ...). Což by bylo užitečnější než rýpat do těchto detailů.


  5. Když je [C++ Návod] v názvu, tak proč řešíš že já používám std::map? Nicméně, ani bLuma tam nemá čistý Céčko (viz. std::cout).

     

    Tady jde o použitelnost té funkce, ve stejném znění ji můžeš použít v C.

     

    #include <stdio.h>
    #include <string.h>
    #include <process.h>
    
    unsigned int chooseFrom(const char* input, const char** choices)
    {
       const char** choice = choices;
       while (*choice)
       {
           if (!strcmp(input, *choice))
               return choice-choices;
    
           choice++;
       }
    
       return (unsigned int)-1;
    }
    
    int main()
    {
       const char* inp = "abc";
    
       const char* choices[] =  {"baf", "abc", "holala", 0};
       switch (chooseFrom(inp, choices))
       {
           case 0: printf("baf\n"); break;
           case 1: printf("abc\n"); break;
           case 2: printf("holala\n"); break;
           default: printf("unkown\n"); break;
    
       }
       system("pause");
       return 0;
    }

     

     

     

    Ale tvé první řešení v první řadě neřeší obecnost problému výběru z řetězců. Omezuješ se na WinAPI a k tomu navíc konzolový interface. V mnoha případech může být nutné vybírat na základě textu v souboru nebo jinak neinteraktivně a tam je podobná omáčka nežádoucí.

     

    Ad C#: Java donedávna také nepodporovala switch nad Stringem. V poslední verzi 7 tuto možnost přidali.


  6. V první řadě jsou první dvě verze nefunkční. Pokud tu proměnnou chceš uchovat musíš ji dát do třídy Player a ne do metody Player::Update. Vhodné je k ní vytvořit gettry a settry, případně ji můžeš dát jako veřejnou, ale to z principu OOP není vhodné. Poté ta proměnná bude dostupná, když bude hráč online, ale stále je nutné vyřešit zachování skillu po případném odhlášení. Pokud to chceš zachovat musíš rovněž upravit metody, které se starají o ukládání do db a poté vytváření charakteru při načtení z db.

     

    int skill = skill + 1;

    Je maximální možná kravina, vytváříš si novou proměnnou skill, kterou chceš plnit z proměnné skill (kterou jsi teď udělal a nemá definovanou hodnotu) + 1. Pokud použiješ gettry a settry musíš přistoupit k tomu hráči a získat obsah proměnné...

    int skill = chr->GetMySkillValue();
    skill++;
    chr->SetMySkillValue(skill);

     

    Případně pokud použiješ public přístup k proměnné...

    chr->myskill++;
    if (chr->myskill > 123)


  7. dokud není poslední variace {
     nastav "pozici" na poslední prvek;
     dokud {
       inkrementuj prvky[pozici] (s případným přetečením na první prvek ze seznamu)
       nastav pozici na předchozí prvek
     } (prvky[pozice+1] == první prvek ze seznamu)
    
     yield(prvky);
    }

     

    Mám prvky 0,1, tučně značím co projde na yield. Začnu s variací 000 (tu je nutné ošetřit samostatně, psal jsem triviální algoritmus). Inkrementuju poslední 001. Inkrementuju poslední (přeteče) 000, uplatní se vnitřní cyklus a inkrementuji druhou pozici 010. Inkrementuji poslední 011. Inkrementuji poslední (přeteče) 010, posunu se, inkrementuji (přeteče) 000, posunu se, 100. Atd...

     

    Pokud si to napíšeš dostatečně obecně dá se to použít na znaky (string) i velké rozsahy čehokoliv (pole).

  8. Chyba


    Když na konci souboru máš else a otevřený blok příkazů, tak ho taky musíš ukončit. Uzavření php tagem neplatí a pokud to do konce souboru neuděláš vznikne tato chyba.


  9. Píšeš kraviny bobisu, když neumíš tu chybu ani přeložit tak se nevyjadřuj.

     

    Po přidání příkazu, zkompiloval jsi celý projekt pomocí "build all"? A jaký byl výsledek build logu? Nějaké chyby nebo se vše zkompilovalo správně? A poté samozřejmě otázka, jestli jsi si spustil tuto zkompilovanou verzi (která je v debug/release složce u zdrojáků) a ne tu původní?


  10.   while(list($guid, $name, $race, $class, $level, $gender, $online, $money, $map, $zone, $latency) = mysql_fetch_row($query)) {
      $output[$count]['guid'] = $guid;
      $output[$count]['name'] = $name;
      $output[$count]['race'] = $race;
      $output[$count]['class'] = $class;
      $output[$count]['level'] = $level;
      $output[$count]['gender'] = $gender;
      $output[$count]['online'] = $online;
      $output[$count]['money'] = $money;
      $output[$count]['map'] = $map;
      $output[$count]['zone'] = $zone;
      $output[$count]['latency'] = $latency;
      $count++;
     }
    

    porovnej s

    while($row = mysql_fetch_assoc($query)) {
       $output[] = $row;
    }


  11. [*]fce mysql_result nevrací int, přesto tam někde máš něco jako if(mysql_result > 0), tady by se měla použít fce mysql_num_rows

     

    Blbost, mysql_result vrací hodnotu sloupečku z výsledku a je to tam vždy použito v dotazu typu SELECT COUNT(), takže to dává smysl a používat mysql_num_rows je neefektivní, pokud nás zajímá jen počet výsledků a ne jejich hodnoty.

     

    Jinak taky mám připomínky:

    Metody GetSide, expansion, ... Nahradit vyhledáním v poli. Zpřehledníš tím kód.

    session_register, session_is_registerer používáš naprosto nesprávně. Buď použij _SESSION proměnnou nebo tyto funkce, ale nemíchej to. Tyto funkce jsou navíc deprecated.

    Uchovávání údajů pro přístup do db je bezpečnostní riziko, ty údaje se mají zničit ihned po připojení. Označit ty proměnné navíc za public je další hazard.

    Mysql::query - dotaz je dotaz a ne připojení do db. Tuhle blbost dělá spousta lidí. Připojení na tomhle místě nemá co dělat.

    V logoutu rušíš cookies, které jsi nikdy předtím nepoužil a tedy u klienta neexistují.

    Na některých místech počítáš hash hesla až po escapování uživatelského jména, ale to je špatný postup operací.


  12. Možná to už bude zapisovat do db, ale pro útočníka to dá přímý přístup do databáze v podobě SQL injection: mysql_real_escape_string($novinka); Toto je opravdu nesmysl, ta funkce vrací vyčištěný řetězec, což ty zcela ignoruješ a hlavně to musíš udělat na jednotlivé části, které do toho sql dotazu vkládáš. Takhle by ti to vrátilo totálně zkomolené sql celého insertu.


  13. Spuštění Authserveru a jeho configu

    while true; do nice -n 20 /cesta/cesta/cesta/cesta/authserver -c /cesta/cesta/cesta/cesta/authserver.conf; sleep 5; done

     

    Spuštění Worldserveru a jeho configu

    while true; do nice -n 19 /cesta/cesta/cesta/cesta/worldserver -c /cesta/cesta/cesta/cesta/worldserver.conf; sleep 30; done

     

    Proč si vědomě degraduješ výkon serveru použitím nice opravdu nechápu.

    • Upvote 1

  14. Co používáš za kompilátor (označení, verze), jaký režim kompilace máš nastaven (32/64b, release/debug)?

     

    Hlavičky pro winsock by měli být u MSVC 2008 Express a vyšších automaticky. U Express 2005 a starších je třeba instalovat Platform SDK.


  15. Předtím to byla chyba v syntaxi, teď to ovšem znamená, že cpeš update pack na nesprávnou strukturu db (chybí předchozí updaty, chybná výchozí struktura, ...). To už se ale na dálku vydedukovat nedá, co jsi s tím prováděl.


  16. Až na to, že musíš nastavit include directories a library directories. Případně přímo u projektu v linkeru je "Additional library directories", v záložce Input pak "Additional Depencies", kam přijde jméno knihovny.

    • Upvote 1

  17. A doplnil jsi si odkazy na tyhle složky do nastavení projektu/globálního nastavení pro hledání knihoven/hlavičkových souborů? Případně použij absolutní cestu nebo si to zkopíruj do pracovního adresáře.

     

    Osobně bych tedy vůbec #pragma nepoužil a nastavil to přímo do nastavení projektu.

×