abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 15:33 | IT novinky

    Po 26 letech od protiprávního policejního zásahu, který byl spuštěn na základě podnětu společnosti Microsoft, Obvodní soud pro Prahu 2 rozsudkem potvrdil, že Mironet prokázal významnou část svého nároku na náhradu škody vůči Ministerstvu spravedlnosti ČR. Soudem nyní přiznaná část nároku znamená rekordní odškodné, jaké kdy české soudy přiznaly za nesprávný postup státu. Spor byl rozdělen na několik škod, u pravomocně uzavřených částí

    … více »
    Ladislav Hagara | Komentářů: 10
    dnes 15:22 | Nová verze

    Lehké desktopové prostředí LXQt bylo vydáno ve verzi 2.4.0. Jde o převážně opravné vydání s drobnými vylepšeními podpory Waylandu.

    |🇵🇸 | Komentářů: 0
    dnes 12:44 | IT novinky

    Počítačová hra Kingdom Come: Deliverance 2 českého studia Warhorse získala cenu BAFTA v kategorii nejlepší příběh. V konkurenci pěti dalších nominovaných děl porazila i úspěšnou francouzskou hru Clair Obscur: Expedition 33, která v letošním ročníku získala cenu za nejlepší hru roku.

    Ladislav Hagara | Komentářů: 1
    dnes 12:22 | Komunita

    Projekt KDE oslaví v říjnu 30 let. Matthias Ettrich poslal 14. října 1996 do diskusní skupiny comp.os.linux.misc zprávu, která započala historii projektu. Důležité milníky jsou zobrazeny na časové ose KDE.

    Ladislav Hagara | Komentářů: 1
    dnes 02:55 | Komunita

    Byly vyhlášeny výsledky letošní volby vedoucí/ho projektu Debian (DPL, Wikipedie). Poprvé povede Debian žena. Novou vedoucí je Sruthi Chandran. Letos byla jedinou kandidátkou. Kandidovala již v letech 2020, 2021, 2024 a 2025. Na konferenci DebConf19 měla přednášku Is Debian (and Free Software) gender diverse enough?

    Ladislav Hagara | Komentářů: 15
    dnes 00:55 | Nová verze

    Byla vydána nová verze 10.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Přidána byla podpora Orange Pi 4 LTS. Přibyl balíček Prometheus.

    Ladislav Hagara | Komentářů: 0
    včera 18:55 | Nová verze

    Implementace VPN softwaru WireGuard (Wikipedie) pro Windows, tj. WireGuard pro Windows a WireGuardNT, dospěly do verze 1.0.

    Ladislav Hagara | Komentářů: 2
    včera 16:11 | IT novinky

    V Pekingu dnes proběhl 2. ročník půlmaratonu humanoidních robotů. První 3 místa obsadili roboti Honor Lightning v různých týmech. Nový rekord autonomního robota je 50 minut a 26 sekund. Operátorem řízený robot to zvládl i s pádem za 48 minut a 19 sekund. Řízení roboti měli časovou penalizaci 20 %. Před rokem nejrychlejší robot zvládl půlmaraton za 2 hodiny 40 minut a 42 sekund. Aktuální lidský rekord drží Jacob Kiplimo z Ugandy s časem 57 minut a 20 sekund [𝕏].

    Ladislav Hagara | Komentářů: 5
    17.4. 17:11 | Zajímavý článek

    Stanislav Fort, vedoucí vědecký pracovník z Vlčkovy 'kyberbezpečnostní' firmy AISLE, zkoumal dopady Anthropic Mythos (nový AI model od Anthropicu zaměřený na hledání chyb, který před nedávnem vyplašil celý svět) a předvedl, že schopnosti umělé inteligence nejsou lineárně závislé na velikosti nebo ceně modelu a dokázal, že i některé otevřené modely zvládly v řadě testů odhalit ve zdrojových kódech stejné chyby jako Mythos (například FreeBSD CVE-2026-4747) a to s výrazně nižšími provozními náklady.

    MakeIranBombedAgain❗ | Komentářů: 8
    17.4. 12:44 | IT novinky

    Federální návrh zákona H.R.8250 'Parents Decide Act', 13. dubna předložený demokratem Joshem Gottheimerem a podpořený republikánkou Elise Stefanik coby spolupředkladatelkou (cosponsor), by v případě svého schválení nařizoval všem výrobcům operačních systémů při nastavování zařízení ověřovat věk uživatelů a při používání poskytovat tento věkový údaj aplikacím třetích stran. Hlavní rozdíl oproti kalifornskému zákonu AB 1043 a kolorádskému SB26-051 je ten, že federální návrh by platil rovnou pro celé USA.

    MakeIranBombedAgain❗ | Komentářů: 13
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 1365 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: Grafy v PHP z MySQL

    10.9.2013 19:12 Pavel | skóre: 17
    Grafy v PHP z MySQL
    Přečteno: 2614×
    Zdravím, mám aplikaci, která každou minutu ukládá data do DB. Na serveru generuju v php grafy a zobrazuji průběhy za předchozí 3 dni od půlnoci do půlnoci. Dělám to tak, že vyčtu data z DB a předám je pro graf, to funguje výborně, problém je, když se v datech udělá hodinová mezera. Tímto způsobem jí nezjistím. Chci udělat nějakou funkci která by do mezer zapsala hodnoty NULL, ať již zpětně do DB, nebo pokaždé při vykreslení grafu. Mělo by to vypadat nějak takto:

    - inkrementuj minuty od datumu now()-3 day zaokrouhleno na dni - pro každou minutu doplň data z databáze, není li v DB hodnota uložena, použij NULL -vykresli graf

    Nejjednodušší by bylo ošetřit to přímo v aplikaci, která data ukládá, ale potřebuji aby to fungovalo i když server vypadne, takže musím ty data kontrolovat až zpětně. Primárně mi tedy jde o to najít funkci, která k základnímu datumu přičte počet minut. Něco jako
    date("Y-m-d 0:0:0", strtotime("-2 days + ".$min." minutes"));
    což ale nefunguje, neboť to přičítá k základnímu času a až potom ořízne čas.

    Odpovědi

    10.9.2013 20:51 NN
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Zkusil bych to jinak, nezapisoval bych data z aplikace primo do databaze, ale napsal bych jednoduchy wrapper, ktery bude kazdou minutu cekat na odezvu od apliace.
    10.9.2013 21:16 Pavel | skóre: 17
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Ano, to jsem psal, ale jak zajistim, aby po výpadku el. energie byly data správně? Spustit vždy při startu script který doplní null do všech časů které nebudou v DB?

    Toto řešení je ale na dlouho, protože data dostávám z url adresy pomocí get. Když bych to přeci jen chtěl dělat až zpětně, jak udělat, aby mi funkce date("Y-m-d 0:0:0", strtotime("-2 days")) vrátila počet vteřin právě k té půlnoci? Ta funkce nejprve odečte 2 dni a až pak ořízne čas, to právě potřebuji opačně.
    11.9.2013 02:02 vojakp
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    A co takhle? Vyčíst čas a hodnoty z databáze do pole. Projít pole čas
    for($i=0;$i<$cas[count($cas)];$i++)
    a hledat
    if(60 > ($cas[$i] - $cas[$i-1]) < 120)
    tím dostanete ty hodnoty co chcete, ostatním přiřadíte NULL. Samozřejmě, že to chce ošetřit začátek, kdy i = 0 a pak také nějak zyvšovat $cas[$i-1] o 60 pokud neni nalezen časový vzorek. Kdyžtak odpoledne mohu poslat kus kodu.
    11.9.2013 23:40 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Lze dostat z DB plnou číselnou řadu, džojnováním vůči pomocné tabulce obsahující číselnou řadu, ale pro takový rozsah a vůči sloupci DATETIME na je to velmi-velmi časově náročné.
    Jinak chápu co chceš na vásledku, ale nevím jak toho chceš dosáhnout, tak nějaké inspirační ukázky:
    <?php
    $d1 = new DateTime('-2 days');
    $d1 = new DateTime($d1->format('Y-m-d H:i:00'));
    $i1 = new DateInterval('PT1M');
    for($i=0;$i<10;$i++)
      echo $d1->add($i1)->format('Y-m-d H:i:00'), "\n";
    echo "\n",$d1->add(new DateInterval('PT1440M'))->format('Y-m-d H:i:00'), "\n";
    
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d-%H:%i:00');
    
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    12.9.2013 01:00 Pavel | skóre: 17
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Děkuji všem za radu, nakonec jsem to udělal takto:
    $today_start  = date("Y-m-d 0:0:0", strtotime("-2 days"));
    $today_stop = date("Y-m-d 0:0:0", strtotime("+1 days"));
    
    $vysledek =  mysql_query("SELECT cas,hum FROM mereni WHERE (cas > '$today_start') AND (cas < '$today_stop') ORDER BY cas");
      while($zaznam = MySQL_Fetch_Array($vysledek)) {
        $cas[] = $zaznam['cas'];
        $hum[] = $zaznam['hum'];	
    	
      }
    $cas_old = strtotime($today_start);
    $j = 0;
    for($i=0;$i<count($hum);$i++){  
      $str_cas = strtotime($cas[$i]);
      if($str_cas >= ($cas_old + 60)){
        if($str_cas < ($cas_old + 120)){
          $hum2[$j] = $hum[$i];
          $j++;
          $cas_old = $str_cas;  
        }
        else{ 
          while($str_cas >= ($cas_old + 120))  {
            $hum2[$j] = NULL;
            $j++;
            $cas_old += 60;
          }
          $hum2[$j] = $hum[$i];
          $j++;
          $cas_old = $str_cas;
          
        }
      }  
    }
    
    Zde uvádím pro přehlednost verzi bez ošetření případných chyb. V proměné $hum2 jsou naměřené hodnoty, které odpovídají od půlnoci předpředchozího do poslední měřené hodnoty, s krokem 1 minuta
    rADOn avatar 12.9.2013 15:03 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Proc to nenajoinujes na casy jak psal sangala vyse? Usetris spoustu kodu a NULLy ti tam budou padat samy.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    12.9.2013 17:14 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Ono smolit v PHP není moc výhra, nicméně to co jsem psal udělat nad sloupcem DATETIME neumím rychle a efektivně. Jak to lze udělat efektivně, víš?.

    Když si vytvořím testovací data:

    CREATE TABLE t (
      id int(11) NOT NULL auto_increment,
      d datetime DEFAULT NULL,
      data varchar(20) DEFAULT NULL,
      PRIMARY KEY (id)
    );
    
    delimiter $$
    CREATE PROCEDURE prepare_test_data()  
    BEGIN    
    DECLARE 
      i INT DEFAULT 0; 
      WHILE i < 8000 DO
         INSERT INTO t (d, data) VALUES (DATE_FORMAT(NOW() - INTERVAL i MINUTE,
               '%Y-%m-%d-%H:%i:00'),CONCAT('VAL:',i));
         INSERT INTO tt (d, data) VALUES (DATE_FORMAT(NOW() - INTERVAL i MINUTE,
               '%Y-%m-%d-%H:%i:00'),CONCAT('VAL:',i));      
      SET i = i + 12;    
    END WHILE;  
    END$$
    delimiter ;
    call prepare_test_data();
    DROP PROCEDURE prepare_test_data;
    
    CREATE TABLE series (
      id int(11) NOT NULL auto_increment,
      PRIMARY KEY (id)
    );
    
    delimiter $$
    CREATE PROCEDURE prepare_series_data()  
    BEGIN    
    DECLARE 
      i INT DEFAULT 0; 
      WHILE i < 4320 DO
         INSERT INTO series () VALUES();      
      SET i = i + 1;    
    END WHILE;  
    END$$
    delimiter ;
    call prepare_series_data();
    DROP PROCEDURE prepare_series_data;
    

    Pokud jsou data již ukládána ze sekundama: 00 (je zvolen interval od NOW())

    SELECT IFNULL(t.d,DATE_FORMAT(NOW() - INTERVAL series.id MINUTE,'%Y-%m-%d-%H:%i:00')) AS dt, t.data FROM series  
       LEFT JOIN t ON t.d = CONVERT(DATE_FORMAT(NOW() - INTERVAL series.id MINUTE,'%Y-%m-%d-%H:%i:00'),DATETIME)
           ORDER BY series.id ASC;
    
    Za: 9.61 sec

    Pokud NEjsou data již ukládána ze sekundama: 00 (je zvolen interval od NOW())

    SELECT IFNULL(t.d,DATE_FORMAT(NOW() - INTERVAL series.id MINUTE,'%Y-%m-%d-%H:%i:00')) AS dt, t.data FROM series  
       LEFT JOIN t ON CONVERT(DATE_FORMAT(t.d - INTERVAL series.id MINUTE,'%Y-%m-%d-%H:%i:00'),DATETIME) 
                      = CONVERT(DATE_FORMAT(NOW() - INTERVAL series.id MINUTE,'%Y-%m-%d-%H:%i:00'),DATETIME)
           ORDER BY series.id ASC;
    
    Za: 15.64 sec

    Efektivní, ale odstranit duplicitu už efektivně neumím:

    (SELECT d, data FROM t WHERE d > NOW() - INTERVAL 4320 MINUTE) 
       UNION
    (SELECT DATE_FORMAT(NOW() - INTERVAL series.id MINUTE,'%Y-%m-%d %H:%i:00') AS d, NULL AS data FROM series)
      ORDER BY d ASC;
    
    Za: 0.02 sec

    Pominul jsem možnost udělat temporary table

    A nakonec uklidím:

    DROP TABLE t;
    DROP TABLE series;
    

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    12.9.2013 17:46 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Nějak jsem vložil nepromazanou fci prepare_test_data() - druhý insert tam nepatří, tedy znovu celý první blok:

    Když si vytvořím testovací data:

    CREATE TABLE t (
      id int(11) NOT NULL auto_increment,
      d datetime DEFAULT NULL,
      data varchar(20) DEFAULT NULL,
      PRIMARY KEY (id)
    );
     
    delimiter $$
    CREATE PROCEDURE prepare_test_data() 
    BEGIN   
    DECLARE
      i INT DEFAULT 0;
      WHILE i < 8000 DO
         INSERT INTO t (d, data) VALUES (DATE_FORMAT(NOW() - INTERVAL i MINUTE,
               '%Y-%m-%d-%H:%i:00'),CONCAT('VAL:',i));
      SET i = i + 12;   
    END WHILE; 
    END$$
    delimiter ;
    call prepare_test_data();
    DROP PROCEDURE prepare_test_data;
     
    CREATE TABLE series (
      id int(11) NOT NULL auto_increment,
      PRIMARY KEY (id)
    );
     
    delimiter $$
    CREATE PROCEDURE prepare_series_data() 
    BEGIN   
    DECLARE
      i INT DEFAULT 0;
      WHILE i < 4320 DO
         INSERT INTO series () VALUES();     
      SET i = i + 1;   
    END WHILE; 
    END$$
    delimiter ;
    call prepare_series_data();
    DROP PROCEDURE prepare_series_data;
    

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    rADOn avatar 12.9.2013 18:53 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Genitalni napad:

    Na hodiny a minuty a sekundy staci mit tabule s 24 a 60 radkama, najoinovat a z toho uz time nejakou funkci upatlas. Denni rozsahy uz by byly zakernejsi, nejspis bych to zbrutalnil jedenacti unionama. Porad lepsi nez to psat v php :-P
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    rADOn avatar 12.9.2013 19:11 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Vlastne kdyz v tabuli z mesicema bude pocet dni tak se to prihodi do podminky joinu a obejde se to bez unionu. Prestupny roky se vyzehli zvlast, beztak je to zraly na view… Cili z tabule o sedesati radcich se da zkonstruovat libovolny rozsah dat.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    12.9.2013 20:49 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Napiš to, nepobral jsem jak se vyhneš parsování DATETIME v klausuli ON, nebo jej tak minimalizovat, že to nebude mít dopad na výkon.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    rADOn avatar 13.9.2013 16:58 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Joinujes jednotlivy slozky casu, na DATETIME prevedes az vystup. Kdyz chci dejme tomu vsechny minuty ve dni:

    SELECT MAKETIME(hod.id, min.id, 0), hod.id, min.id FROM mod60 min JOIN mod60 hod ON hod.id < 24 order by hod.id, min.id;

    Kdyz bys chtel i vteriny, staci pridat join. At zije kartezsky soucin :-) Vykon by mel byt v poho pokud databaze bude dost chytra aby nevyrabela radky mimo rozsah ktery si z toho vyberes.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    13.9.2013 20:45 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL

    Asi bys nepochopil jak jsem přemýšlel :-), myslel jsem že řešíš to co neumím vyřešit :).
    Ono i tímto způsobem, který mě nevím proč nenapadl:

    SELECT t1.d AS dt, t.data FROM 
     (SELECT CONVERT(DATE_FORMAT(NOW() - INTERVAL series.id MINUTE,'%Y-%m-%d-%H:%i:00'),DATETIME) AS d FROM series) AS t1
       LEFT JOIN t ON t.d = t1.d
           ORDER BY dt ASC;
    
    Mám 2.7 sec ale pokud si předgeneruji sérii do do pomocné tabulky tak dostávám 2.6 sec, takže dál to nelze.

    Zatím vždy, když jsem řešil něco podobného, definoval jsem ID záznamové tabulky jako 'tick' v tomto případě minuta a měl jsem definovaný posun (tick nula se rovná tomuto datu-času) a při zakládání záznamu jsem spočítal tick z NOW() a prdl to do ID. Následný jakýkoliv join řady se děje nad INT a je to pohoda a šlahá to.

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    rADOn avatar 18.9.2013 17:19 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Já s tím joinováním na souvislou řadu nepolemizuju, jen mě napadlo jestli by se to nechalo udělat bez předžvýkaný tabulky.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    Josef Kufner avatar 14.9.2013 17:39 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Btw, DATETIME není pro potřebu logování vůbec vhodné, neboť neumí časová pásma. Použij TIMESTAMP. Až se bude měnit čas ze zimního na letní nebo zpět, tak to oceníš. Musíš si jen dát pozor, aby jak MySQL, tak PHP pracovaly ve stejném časovém pásmu, a to Europe/Prague, nikoliv +2 nebo +1 hodina.

    Ad vyplňování mezer: Netrap tím databázi a detekuj je při kreslení grafu. Pokud použiješ javascriptové zobrazovadlo, např. Flot, ušetříš si výkon na serveru.
    Hello world ! Segmentation fault (core dumped)
    15.9.2013 15:03 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Opravdu si myslíš, že doplnění serie/řady je lepší až na úrovní scriptu.
    Obvykle tedy ty řady/série chci mít úplné z DB, a to s jedinou výjimkou a to jsou právě tyto datumovočasové řady tohoto charakteru, kde nelze jednoduchou posloupností to dát dohromady.
    OT: A už jsem si vzpomněl proč mám všude u MySQL TIMESTAMP - dík ;-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    Josef Kufner avatar 15.9.2013 16:53 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Grafy v PHP z MySQL
    Ta data nejsou nijak poškozená, jen prostě chybí. Tím, že je doplníš až na konci ušetříš výkon všude po cestě. Udělat vykreslovací algoritmus tak, aby sám počítal tiky na ose a dohledával data z dodané děravé tabulky je snadné.
    Hello world ! Segmentation fault (core dumped)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.