Jeżeli chcesz komentować kliknij na tytuł artykułu, wyświetli się tylko ten artykuł z możliwością komentowania.

wtorek, 3 listopada 2020

Prognozy przypomnienie i "paskuda" czyli prognozy nieco inaczej...

 Cykliczność występowania liczb w kolejnych losowaniach jest podstawą działania predykcji w module "Prognozy" programu "LottoCAD". Do obejrzenia na YouTube...

Prognozy cz.1 na YouTube


Prognozy cz.2 na YouTube


Prognozy cz.3 na YouTube



Ale w module "Prognozy" okresy cykli są o stałej szerokości a sposób wybierania polega na podziale częstosci w zadany stosunek procentowy liczb pobieranych z histogramów czestosci (czyli podział na liczby "zimne" - rzadziej wystepujace i liczby "gorące" czesciej wystepujace naprzemian w kolejnych okresach o stałej szerokości (ilości losowań).

Wyniki gry z zastosowaniem "prognoz" są zachęcajace i okresowo mozna liczyc na dobre prognozowane wyniki. Dlatego spróbowałem napisać skrypt który szuka podobnych zaleznosci ale nieco inaczej.
    // wirtualny układ matrycy parametrów (wiersze kolumny):
    // [4, 6 ,8]
    // [1, 1 ,1]
    // [0, 1 ,2]
    // Przykład parametrów w kodzie PHP odpowiada powyższej matrycy:
    $back_range = array(4,6,8); // przedziały wstecz (w trzech cyklach po 4,6,8 = 18 losowań)
	$back_level = array(1,1,1); // poziom trafień w histogramie z każdego przedziału
	$back_mode  = array(0,1,2); // kryteria -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy
  • Okresy i zawartość okresów zadajemy parametrami. Zawartymi w tablicy prostokatnej (matrycy) np: jak powyżej
  • Parametry to matryca o ilosci wierszy = 3 elementy, natomiast kolumny to parametry dla poszczególnych okresów analizy
  • Kolejne okresy są badane a liczby spełniające kryteria są wybierane a ich wspólne elementy przechodzą selekcję (są wybierane jako prognoza, ponieważ spełniają kryteria)
  • Ponieważ cięzko jest z góry okreslić zestaw parametrów dlatego stworzyłem drugi skrypt "symulator" który losowo wybiera zestaw parametrów, szereguje je w tablicy wg skutecznosci trafień (ranking=0 jezeli żadna liczba nie trafiła lub ranking=1 /100%/ jeżeli wszystkie liczby trafiły w następnym losowaniu) od danego offsetu (przesuniecia od odtatniego losowania). Ostatnie losowanie ma offset= 0 /zero/.
Skrypty mozna pobrać z linku : Tu pobierzesz skrypty spakowane do archiwum zip Przykład jak skrypt wybiera liczby znajdziesz w komentarzu w skrypcie "paskuda-symulator" :

Skrypt paskuda

<php
error_reporting(5);
require_once("include/class_Utils.php");
/*

            Skrypt wybiera liczby które w zadanych przedziałach spełniają kryteria
            podane w ustawieniach zmiennych, dla offsetów większych niż jeden
            skrypt podaje trafienia wybranych liczb.
            Należy tak dobrać kryteria aby uzyskać najwięcej trafień.
            Ilść zakresów i kryterium jest dowolna ale ilść kryterium
            powinna być równa ilości zakresów. Należy o tym pamiętać ( float $arg );

Kryteria oznaczaj1 :

$back_range = array(4,6,8); // przedziały wstecz (pierwszy ostatnie losowanie)
$back_level = array(1,1,1); // poziom trafień w przedziałach
$back_mode  = array(0,1,2); // -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy

wybierz liczby które w 4 ostatnich losowaniach trafione były dokładnie jeden raz
        a w następnych 6 losowaniach trafione były więcej niż 1 raz

*/

//-------------------------------------- ustawienie zmiennych---------------------------------------

$offsetstart=0;
$offsetstop=200;
//[ 14,  7,  ]
//[  1,  3,  ]
//[  1,  1,  ]
$back_range = array(14,7); // przedziały wstecz (pierwszy element od ostatniego losowania)
$back_level = array(1,3); // poziom trafień w przedziałach
$back_mode  = array(1,1); // liczba oznacza -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy

// -------------------------------------------------------------------------------------------------

    $back_array=array($back_range,$back_level,$back_mode);
    $offset = 0; // ostatnie losowanie w bazie
    
    $cutting = $offsetstop+array_sum($back_range)+100;
    $drawtable= delphi_get_draw_arr();
    Utils::draw_to_set_array($drawtable);
    $drawtable = array_reverse($drawtable);
    $drawtable = array_splice($drawtable,0,$cutting);
    $out=array();    
         for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) {   // dla każdego offsetu
        //echo "offset $offset\n";

            $rank=get_paskuda($drawtable,$offset,$back_array);            // wybiera paskudę

            if ($offset>0) {                                              // jeżeli offset>0 sprawdza trafienia tej paskudy
                $lastdraw=$offset-1;
                $xhit=array_intersect ( $rank,$drawtable[$lastdraw]);
                $countXHit = count($xhit);
                $rankcount = count($rank);
                //echo sprintf("cnt.rank : %3d, cnt.hit: %3d\n",$rankcount,$countXHit);
                if ($countXHit>0) {
                    $ranking = $countXHit/$rankcount;
                    $out[]=array("offset"=>$offset, "rank"=>$ranking,$back_array,"psk"=>$rank,"hit"=>$xhit);
                } else
                continue;
            }

        } // for   
        foreach ($out as $arr) {
            echo sprintf ("offset: %3d ranking: %1.2f\n%s%s",$arr['offset'],$arr['rank'],array2line("paskuda:",$arr['psk']),array2line("    hit:",$arr['hit']));
            echo params2matrix($arr[0]);
        }

//    for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) {   // dla każdego offsetu
//        $rank=get_paskuda($drawtable,$offset,$back_array);            // wybiera paskudę
//        print array2line("paskuda : ",$rank);
//        if ($offset>0) {                                              // jeżeli offset>0 sprawdza trafienia tej paskudy
//            $lastdraw=$offset-1;
//            $xhit=array_intersect ( $rank,$drawtable[$lastdraw]);
//            echo array2line("trafila : ",$xhit); // wypisuje trafienia
//        }
//    print " ----------- offset $offset ------\n";
//    }


function array2line($title,$arr) {
$s="";
foreach($arr as $item)  $s.=sprintf("%2d ",$item);
$s=trim($s);
return sprintf("%s (%3d): %s\n",$title, count($arr),$s);
}

function params2matrix($arr) {
  $s="";
  foreach($arr as $line) {
     $s.="[ ";
     foreach($line as $par) {
           $s.=sprintf("%2d, ",$par);
     }
     $s.=" ]\n";
  }
return $s;
}

function get_paskuda($draw,$offset,$back_array) {       // procedura paskuda                                     // ostatnie losowanie danego offsetu
$zx=array();
$lastdraw=$offset;                                           // delkaracja tablicy zx
foreach($back_array[0] as $brkey=>$br) {                // dla kazdej tróki parametru $back_range
$blevel=$back_array[1][$brkey];
$bmode=$back_array[2][$brkey];


$x=array();
$z=array();                                              // tablice pomocnicze
// oblicza kolejne grupy wg kryterii
for ($i=0;$i<$br ;$i++) {                                // robi harmonogram liczb w zakresach z parametrami
    foreach($draw[$lastdraw] as $num)
        if (isset($z[$num]))
          $z[$num]++;
        else
          $z[$num]=1;
        $lastdraw++; // zwiększ licznik o jeden
   };


foreach($z as $nkey=>$num) {
       if ($bmode==-2) {
        //echo $num." < ".$blevel."\n";                             // dodaje liczby do tablicy $x jeżeli :
       if ($num<$blevel) $x[]=$nkey;                   // jeżeli mode==-2 (trafienia mniejsze niż $blevel)
        }
   elseif ($bmode==-1) {                               
        if ($num<=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia mniejsze
        }
   elseif ($bmode==0) {                                
        if ($num==$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia równe
        }
   elseif ($bmode==1) {
        //echo $num." >= ".$blevel."\n";
        if ($num>=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia większe    
        }
   elseif ($bmode==2) {
        if ($num>$blevel) $x[]=$nkey;                  // jak wyżej ale trafienia większe lub równe
        };
   
}

$zx[$brkey]=$x;  // tablicę $x ładuje do odpowiedniej tablicy zakresu $zx
};

$out=$zx[0]; // bierze tablicę pierwszego zakresu 

foreach($zx as $key=>$arr)
     if ($key>0) $out=array_intersect ( $out, $arr); // i wybiera wspólne liczby z wszystkich zakresów
return $out; // zwraca te liczby jako paskudę.
}

Skrypt paskuda, symulator

<php
error_reporting(5);
require_once("include/class_Utils.php");
/*
Znaleziona paskuda z parametrami jak powyżej. Prognoza znalazła 
18 liczb z czego w następnym losowaniu zostało trafione 7 liczb
co stanowi skuteczność 18%. Po znalezieniu tych parametrów wpisujemy
je do skryptu paskuda i robimy analizę dla np 100 offsetów. Obserwując 
wyniki patrzymy na obliczona skuteczność (ranking) stwierdzany jak 
często uzyskujemy dobry wynik.
Parametry kolejnych okresów losowań są w kolumnach matrycy:

offset:  16 ranking: 0.39 paskuda: paskuda: ( 18): 43 34 42 22 46 32 18 58 53 75  4 13 11  9 16 63 35 40 hit: hit: (  7): 34 58 53 75 13 16 35
[ 14,  7,  ]
[  1,  3,  ]
[  1,  1,  ]

Jak to jest budowane? Skrypt pobiera pierwszą kolumnę (pack=0) i buduje 
w okresie back=14 losowań histogram częstości wystąpień liczb. Dla mode=1 i level=1 Wybiera
z histogramu częstości te liczby które wystąpiły w tych 14 losowaniach (back=14) 
wiecej lub równo (mode=1) jeden raz (level=1). Więc są to wszystkie liczby z tego zakresu.
W histogramie widać częstość a tablica jest posortowana wg częstości właśnie. Przykład:
liczba 65 w 14 losowaniach wystąpiła 7 razy, liczba 60 pieć razy a liczba 77 trzy razy. 
########################## back=14 level=1 mode=1
---  pack : 0 ---
--- histo : 7  6  6  6  6  6  6  6  6  6  5  5  5  5  5  5  5  5  5  5  5  5  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  1  1  1  1  1  1
--- liczby:65 45 16 35 30 70 11 20 27 79 60  2 17 56 41  6 42 40 69 51 49 78 75 73 55  5 12 24  1 26  7 64 37 38 39 48 80 33 72 77 21 57  9 15 25 50 61 47 10 14 29 53 59 58 13 44 68  8 31 52 32 28 46 18 62 19 74  4 54 23 36 76 71 34 43 63 66 22 67

To samo robi z paczką drugą (druga kolumna parametrów) back=7 level=3 mode=1 
Jak widać ma za zadanie z paczki następnych back=7 losowań, zrobic histogram
częstości i wybrać z niego liczby które wystąpiły (więcej lub równo (mode=1) 
3 krotnie (level=3)). Poniżej to liczby z linii (---output)

--- output :65 45 16 35 30 70 11 20 27 79 60  2 17 56 41  6 42 40 69 51 49 78 75 73 55  5 12 24  1 26  7 64 37 38 39 48 80 33 72 77 21 57  9 15 25 50 61 47 10 14 29 53 59 58 13 44 68  8 31 52 32 28 46 18 62 19 74  4 54 23 36 76 71 34 43 63 66 22 67
--- select :43 34 42 22 46 32 18 58 53 75  4 13 11  9 16 63 35 40
--- output :43 34 42 22 46 32 18 58 53 75  4 13 11  9 16 63 35 40

teraz paczkę z pierwszej kolumny (---output) porównuje z paczką z drugiej kolumny
(---output) robi logiczną operację I (AND) na zbiorach liczb i pobiera jako paskudę 
(---output) zestaw wspólny (liczb występujących w obu zbiorach)


Paczkę tę sprawdza z losowaniem następnym od losowania offset (następne losowanie)
  
*/

//-------------------------------------- ustawienie zmiennych---------------------------------------
    $offsetstart=0;                          // od offsetu zero ostatnie losowanie
    $offsetstop=20;                         // ilosc sprawdzanych offsetow
    $ranges["back_range"]= array(1,20);      // zakres paczek losowan (okresy)
    $ranges["back_level"]=array(0,10);       // ilosc trafien w zakresie od zero do 10
    $ranges["back_mode"]=array(-2,2);        // zakresy od -2 do 2 oznaczaja rodzaj porownania "<, <=, =, >=, >"
    $ranges["count"] = 2;                    // ilosc okresow glownych
    $iterations = 100;                      // ilosc losowan kombinacji parametr??//-------------------------------------------------------------------------------------------------------

    $cutting = ($offsetstop-$offsetstart)+($ranges["count"]*$ranges["back_range"][1])+100;
    $drawtable= delphi_get_draw_arr();
    Utils::draw_to_set_array($drawtable);
    $drawtable = array_reverse($drawtable);
    $drawtable = array_splice($drawtable,0,$cutting);


//    $back_range = array(4,6,8); // przedzia3y wstecz (pierwszy element od ostatniego losowania)
//    $back_level = array(1,1,1); // poziom trafien w przedzia3ach
//    $back_mode  = array(1,1,1); // liczba oznacza -2:mniejszy; -1:mniejszy lub rowny 0:równy 1:wiekszy lub równy 2:wiekszy



// Pętla główna    
// -------------------------------------------------------------------------------------------------

    $items=array();
    For ($i=$ranges["back_range"][0];$i<=$ranges["back_range"][1];$i++) {
        For ($j=$ranges["back_level"][0];$j<=$ranges["back_level"][1];$j++) {
            For ($k=$ranges["back_mode"][0];$k<=$ranges["back_mode"][1];$k++) {
                $items[]=array($i,$j,$k);
            }
        }
    }
    
    
    $cnt = count($items);
    
    $out=array();
    
    do {
    $back_range = array();
    $back_level = array();
    $back_mode  = array();
        for ($i=0;$i<$ranges["count"];$i++) { // dla każdej kolumny (okresu)
            $rnd = rand(0,$cnt);
            //echo "rand: $rnd, i: $i, cnt: $cnt\n";
            $back_range[] = $items[$rnd-1][0];
            $back_level[] = $items[$rnd-1][1];
            $back_mode[]  = $items[$rnd-1][2];
        }
  
    $back_array=array($back_range,$back_level,$back_mode);
    //echo params2line($back_array);
    $offset = 0; // ostatnie losowanie w bazie
     
        for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) {   // dla każdego offsetu
        //echo "offset $offset\n";
            $rank=get_paskuda($drawtable,$offset,$back_array);            // wybiera paskudę

            if ($offset>0) {                                              // jeżeli offset>0 sprawdza trafienia tej paskudy
                $lastdraw=$offset-1;
                $xhit=array_intersect ( $rank,$drawtable[$lastdraw]);
                $countXHit = count($xhit);
                $rankcount = count($rank);
                //echo sprintf("cnt.rank : %3d, cnt.hit: %3d\n",$rankcount,$countXHit);
                if ($countXHit>0) {
                    $ranking = $countXHit/$rankcount;
                    $out[]=array("offset"=>$offset, "rank"=>$ranking,$back_array,"psk"=>$rank,"hit"=>$xhit);
                } else
                continue;
            }

        } // for
    $iterations--; 
    //echo "iteracja $iterations\n";
    } while ($iterations>0);

usort($out,"cmp");

foreach ($out as $arr) {
echo sprintf ("offset: %3d ranking: %1.2f %s %s\n",$arr['offset'],$arr['rank'],array2line("paskuda:",$arr['psk']),array2line("hit:",$arr['hit']));
echo params2matrix($arr[0]);
}
//echo "rank: {$out["ranking"]}";
//echo ", params:"


 
// Koniec programu zasadniczego    
// funkcje pomocnicze

function params2line($arr) {
  $s=sprintf("[%2d %2d %2d], [%2d %2d %2d], [%2d %2d %2d]\n",$arr[0][0],$arr[0][1],$arr[0][2],$arr[1][0],$arr[1][1],$arr[1][2],$arr[2][0],$arr[2][1],$arr[2][2]);
return $s;
}

function params2matrix($arr) {
  $s="";
  foreach($arr as $line) {
     $s.="[ ";
     foreach($line as $par) {
           $s.=sprintf("%2d, ",$par);
     }
     $s.=" ]\n";
  }
return $s;
}


function array2line($title,$arr) {
$s="";
foreach($arr as $item)  $s.=sprintf("%2d ",$item);
$s=trim($s);
return sprintf("%s (%3d): %s",$title, count($arr),$s);
}

function get_paskuda($draw,$offset,$back_array) {       // procedura paskuda                                     // ostatnie losowanie danego offsetu
$zx=array();
$lastdraw=$offset;                                           // delkaracja tablicy zx
foreach($back_array[0] as $brkey=>$br) {                // dla kazdej tróki parametru $back_range
$blevel=$back_array[1][$brkey];
$bmode=$back_array[2][$brkey];
//echo "########################## back=$br level=$blevel mode=$bmode\n";
$x=array();
$z=array();                                              // tablice pomocnicze
// oblicza kolejne grupy wg kryterii
for ($i=0;$i<$br ;$i++) {                                // robi harmonogram liczb w zakresach z parametrami
    foreach($draw[$lastdraw] as $num)   $z[$num]++;
    $lastdraw++; // zwiększ licznik o jeden
   };
    arsort($z);
    //echo "---  pack : $brkey ---\n";
    //echo "--- histo :",Utils::printTicket($z),"\n";
    //echo "--- liczby:",Utils::printTicket(array_keys($z)),"\n";
    
foreach($z as $nkey=>$num) {
       if ($bmode==-2) {                               // dodaje liczby do tablicy $x jeżeli :
       if ($num<$blevel) $x[]=$nkey;                   // jeżeli mode==-2 (trafienia mniejsze niż $blevel)
        }
   elseif ($bmode==-1) {                               
        if ($num<=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia mniejsze
        }
   elseif ($bmode==0) {                                
        if ($num==$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia równe
        }
   elseif ($bmode==1) {                            
        if ($num>=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia większe    
        }
   elseif ($bmode==2) {
        if ($num>$blevel) $x[]=$nkey;                  // jak wyżej ale trafienia większe lub równe
        };
}

$zx[$brkey]=$x;  // tablicę $x ładuje do odpowiedniej tablicy zakresu $zx
};


$out=$zx[0]; // bierze tablicę pierwszego zakresu 

//echo "offset: $offset  -------------------\n";
//echo "lastdraw: $lastdraw  ---------------\n";
//echo params2matrix($back_array);
foreach($zx as $key=>$arr) { 
  //  echo "--- output :",Utils::printTicket($out),"\n"; 
    if ($key>0) $out=array_intersect ( $arr,$out); // i wybiera wspólne liczby z wszystkich zakresów
  //  echo "--- select :",Utils::printTicket($arr),"\n";
  //  echo "--- output :",Utils::printTicket($out),"\n";   
    }
return $out; // zwraca te liczby jako paskudę.
}


function cmp($a, $b)
{
    if ($a["rank"] == $b["rank"]) {
        return 0;
    }
    return ($a["rank"] < $b["rank"]) ? 1 : -1;
}

niedziela, 18 października 2020

Skrypt "podzielnik", dzieli długie zestawy liczb na części w zestawy po tyle liczb co w parametrze $chunk w linii 7. Parametrami można ustawiać również sortowanie lub kolejność losową.


image
<?php
require_once("include/class_Utils.php");

//------------ parametry -------- poczatek------------
$chunk=3;  // podział po n kolumn
$schuffle = false; // true = miesza wyniki, false = tak jak jest
$sort = false;    // true = sortuje wyniki, false = tak jak jest
//------------ parametry -------- koniec -------------

srand((float)microtime() * 1000000);
$sets=delphi_str_memoa(); // pobiera set z pola zaklady
$set_lines=preg_split("'\r?\n'", trim($sets));

$outarr=array();

$outarr=array();
foreach($set_lines as $line) {
   $ary = preg_split("/[^0-9]+/",trim($line));
   if ($schuffle) shuffle($ary);
   if ($sort) sort($ary);
   $hk = array_chunk($ary, $chunk);
   foreach($hk as $id=>$cols) $outarr[$id][] = $cols;

   }

   foreach($outarr as $cols) {
     echo Utils::printTickets($cols),"\n\n";
   }
?>

wtorek, 6 października 2020

Android - Macrodroid skrypt przypominający o lekarstwach.

/*If you need to translate an article, you can find the translation options in the right toolbar at the top.*/
Choruję na cukrzycę. Ze względu na obowiązki zdarza mi się zapominać o regularnym pobieraniu lekarstw czy iniekcji insuliny. Znalazłem aplikację na Androida która daje wiele możliwości dla naszej kreatywności w stworzeniu potrzebnych zadań dla naszego smartfona. 
Program Macrodroid można pobrać ze sklepu Play-Google. Program pobierzesz z linku Macrodroid ze sklepu play.google.com. W wersji bezpłatnej można stworzyć do pięciu własnych zadań- skryptów. Pełna wersja nie ma reklam i ograniczeń a kosztuje naprawdę niewiele. Można to traktować jak mniej więcej 5 piw postawionych autorowi :) za jego dobrą pracę.

Każdy skrypt głównie składa się z kilku sekcji a podstawowe są dwie sekcje o których wspomnę a mianowicie : 
  • sekcja wyzwalaczy 
  • sekcja akcji
Wyzwalacze służą do inicjacji skryptu czyli są to zdarzenia na które skrypt czeka aby uruchomić akcje z następnej sekcji. Program zabezpiecza możliwość uruchomienia skryptów akcji na wiele sposobów. Może to być np czas, kalendarz, czujniki smartfona, dotyk, sms, połączenie telefoniczne, komunikator WhatsUp lub inne zdarzenie. Wybór jest ogromny.

Akcje również posiadają bogaty repertuar a mianowicie mozna uruchamiać programy, wysyłać powiadomienia, reagować na sms, robić zdalnie fotografie, nagrywać dźwięk, znajdować zgubiony smartfon, zabezpieczać przed uruchomieniem i wiele wiele innych zadań zależnych tylko od własnej wyobraźni.

To podsunęło mi pomysł napisania skryptu wg własnego pomysłu:
Podstawą są trzy wyzwalacze uruchamiające skrypt w porach pobierania lekarstw. o godzinach 9:00, 14:00 i 20:00. Robiąc skrypt dla rodziców, dziadka, niepełnosprawnego sąsiada, łatwo można dodać np wysyłanie sms od nich do osoby sprawującej opiekę że wszystko OK lub np od dłuższego czasu pacjent nie reaguje. Myslę że nie jeden z Was myślał o czymś takim no i w czasach pandemii ograniczy to kontakty tylko do niezbędnych.Wyzwalacze skryptu który nazwałem "Diabetyk" uruchamiają akcje które zebrane są w trzy jednakowe logiczne bloki :

  1. Jeżeli  był wywołany wyzwalacz o godzinie 9:00 to :
    • wybudź ekran
    • ustaw zmienną globalną enableAction = Prawda
      • Wykonuj akcje dokąd zmienna globalna enableAction = Prawda
        • Czytaj na głos tekst ze zmiennej messageBreakfest (zawiera przypomnienie o wzięciu lekarstw porannych) - warunkowo gdy macroEnable = Prawda  
        • Odczekaj 5 minut -  warunkowo gdy enableAction = Prawda
        • Czytaj na głos ponaglenie wzięcia lekarstw zawarte w zmiennej messageRemind -  warunkowo gdy enableAction = Prawda
        • Czekaj minutę i powtórz sekwencję tej pętli wykonuj akcje dotąd.
      • Koniec pętli : Wykonuj akcje dokąd enableAction = Prawda, akcję przerywa inne makro o nazwie "Semafor" które uruchamiane jest aktywnością użytkownika który musi przytulic lub dotknąć smartfon zadziała wówczas czujnik zbliżeniowy. Wówczas zmienna globalna enableAction ustawia na Fałsz co przerywa akcję powtórzeń komunikatów.
    • koniec akcji wyzwalacza godziny 9:00 
  • 2. Jeżeli  był wywołany wyzwalacz o godzinie 14:00 to : bloki takie same jak powyżej
  • 3. Jeżeli  był wywołany wyzwalacz o godzinie 20:00 to : bloki takie same jak powyżej

Drugie makro to wyzwalacz uruchamiany "przytuleniem" smartfona w opcji "blisko" co powoduje akcję ustawiania zmiennej globalnej enableAction = Fałsz co wyłącza zapętlenie komunikatów w interwałach czasowych co ok 6 minut gdy pacjent nie reaguje oraz opcjonalnie gdy zmienna globalna enableGlucometer jest ustawiona na True, uruchamia odmierzanie czasu ok 120 minut do komunikatu o konieczności pomiaru stężenia cukru glukometrem.  Wg przepisu stężenie cukru we krwi badać należy na czczo oraz dwie godziny po posiłkach.

Algorytm skryptu który nazwałem Semafor:

  • Jeżeli wyzwalacz Czujnika zbliżeniowego jest "Blisko" tzn. dotykam lub "przytulam smartfon. cały skrypt ma dodane ograniczenie- warunek (enableAction=Prawda). Makro nie będzie uruchamiane gdy jest konieczne.
    • Ustaw zmienną enableAction=na Fałsz przez odwrócenie tzn gdy była prawda odwracamy na Fałsz.
    • Jeżeli zmienna enableGlukometer = Prawda to:
      • Czekaj 120 minut
      • Czytaj tekst : "Mineły dwie godziny od posiłku, możesz zmierzyć cukier glukometrem".
    • Koniec akcji jeżeli zmienna enableGlukometer = Prawda.
  • Koniec akcji wyzwalanej Czujnikiem zbliżeniowym.
Po wgraniu obu skryptów należy wprowadzić wczskając przycisk "Zmienne", zmienne globalne, poniżej opis w układzie nazwa zmiennej (typ) = wartość :
  • alarmOff(string) ="No dobrze już nie będę Ci więcej truła"
  • enableAction(Boolean)=Fałsz
  • enableGlucometer(Boolean)=Fałsz
  • messageLunch(string)="Pamiętaj o lekarstwach, zażyj dawkę przed obiadem. Tylko tabletka Siofor1000"
  • messageBreafest(string)="Pamietaj o lekarstwach, zazyj dawkę przed śniadaniem. Tabletki Siofor, Telmizek, Beto i wstrzyknij dawkę 14 jednostek insuliny".
  • messageDinner(string)="Pamiętaj o lekarstwach, zażyj dawkę przed kolacją.Tabletki Siofor,Acard i Suwardio i wstrzyknij dawkę 12 jednostek insuliny.
  • messageGlucometer(string)="Mijaja własnie dwie godziny od posiłku, wiec zmierz cukier glukometrem".
  • messageRemind(string)="Na boga weź wreszcie że te lekarstwa"

graficzny skrypt "Diabetyk" w języku Polskim:


Script "Diabetyk" in English.



Skrypt "Semafor" w języku Polskim.




Script "Semafor" in English.


pod adresem są spakowane skrypty : pobierz skrypty


czwartek, 1 października 2020

Skrypt PHP, uzupełnia wyniki w grach "córkach" gry multilotek, rozdziela losowania ze względu na godziny losowania i wprowadza je do gier MULTI22 i MULTI14

Skrypt pobiera wyniki z gry "multi-multi", rozdziela je ze wzgledu na godzine losowania i wprowadza je do odpowiednich gier.

W programie Lottocad

  • otwórz z menu "Skrypty PHP">>> "Skrypty PHP Edytor".
  • utwórz nowy plik w edytorze kliknij przycisk "Nowy"
  • skopiuj z tego postu kod skryptu
  • wklej go w edytor
  • zapisz skrypt pod dowolną nazwę jako plik "nazwa.php"
  • uruchom plik w edytorze przyciskiem "PHP" [lub klawiszem F9]
  • komunikaty o wykonaniu zobaczysz w polu tekstowym "zakłady" lub polu "wyniki"

 

<?php
error_reporting(5);
$src_tbname = "multi-multi";
$d22_tbname = "MULTI_22";
$d14_tbname = "MULTI_14";
// pytamy bazę MULTI_22 o id i datę ostatniego losowania w bazie

$sql="Select max(Date) as maxdate, max(ID) as maxid from MULTI_22;";
$wynik22=delphi_exec_sql($sql);
echo "Ostatnie losowanie zapisane w tabeli $d22_tbname ma id= {$wynik22[0]['maxid']} jest z dnia {$wynik22[0]['maxdate']}\n";

// pytamy bazę MULTI_14 o id i datę ostatniego losowania w bazie

$sql="Select max(Date) as maxdate, max(ID) as maxid from MULTI_14;";
$wynik14=delphi_exec_sql($sql);
echo "Ostatnie losowanie zapisane w tabeli $d14_tbname ma id= {$wynik14[0]['maxid']} jest z dnia {$wynik14[0]['maxdate']}\n";

$dta = $wynik22[0]["maxdate"]." 23:59:59";
$sql = "Select * from multi_multi where \"Date\">'$dta'";
//echo "Dla tabeli: $d22_tbname ",$sql,"\n";
$wynik2222=delphi_exec_sql($sql);
//echo "Dla tabeli: $d22_tbname count= ",count($wynik2222),"\n";
//print_r($wynik2222);
// filtrujemy
$pass=0;
foreach ($wynik2222 as $id=>$rec) {
                $pos = strpos($rec['Date'], "21",9);
                echo $pos;
        if ($pos>10) {
           $w=delphi_exec_sql(create_insert_query($d22_tbname,$rec));
           if ($w) {
           echo "do tabeli $d22_tbname dodano $w losowanie z dnia {$rec["Date"]}\n";
           $pass+=1;
           }
           }
        }
if ($pass==0) echo "Nie ma jeszcze nowych wyników dla teabeli $d22_tbname\n";



$dtb = $wynik14[0]["maxdate"]." 23:59:59";
$sql = "Select * from multi_multi where \"Date\">'$dtb'";
//echo "Dla tabeli: $d14_tbname ",$sql,"\n";
$wynik1414=delphi_exec_sql($sql);
//echo print_r($wynik1414,true);
//echo "Dla tabeli: $d14_tbname count= ",count($wynik414),"\n";

// filtrujemy
$pass=0;
   foreach ($wynik1414 as $id=>$rec) {
                $pos = strpos($rec['Date'], "14",9);
                //echo $pos;
                if ($pos>10) {
                $w=delphi_exec_sql(create_insert_query($d14_tbname,$rec));
                if ($w) {
                echo "do tabeli $d14_tbname dodano $w losowanie z dnia {$rec["Date"]}\n";
                $pass+=1;
                }
                }
        }
if ($pass==0) echo "Nie ma jeszcze nowych wyników dla teabeli $d14_tbname\n";




function create_insert_query($tablename, $array) {
    //$array['RecordID']='NULL';
    $key = array_keys($array);
    $val = array_values($array);
    $val[0]='NULL';
    $val[2]="'".substr($val[2],0,10)."'";
    //sanitation needed!
    $query = "INSERT INTO $tablename (" . implode(', ', $key) . ") "
         . "VALUES (" . implode(", ", $val) . ")";

    return($query);
}

 

Powodzenia

czwartek, 11 czerwca 2020

Skrypty PHP, trzy skrypty obróbki danych...

Skrypt ten służy do segregacji wierszy utworzonych w panelu prognoz.
W polu zakłady są wygenerowane prognozy w wyniku działania skryptu okresy gorące i zimne są pogrupowane w dwa bloki. Ułatwia to ich przenoszenie i dalszą obróbkę.

<?php
/*
Skrypt pomocniczy do segregacji liczb z panela prognoz...
Włącz panel prognozmenu Plik-> Paski narzędzi -> Panel Prognoz
w opcjach panelu zaznacz w polu zakłady i zaznacz AmsMode
wykonaj prognozę klawiszem Red lub Blue
Wyswietlą sie prognozy z zadanego okresu ze sprawdzeniem trafień
Uruchom skrypt PHP
skrypt rozdzieli okresy zimne i gorace, pogrupuje i wyswietli w polu wyniki
z pomocą zaznaczenia i kopiowania kolumnami
trzymając jednoczesnie klawisze ctrl+alt strzałkami zaznacz
blok liczb bez dad i nawiasów do skopiowania i dalszej obróbki.
*/

require_once("include/class_Utils.php");
$sets=delphi_str_memoa();
$lines=preg_split("'\r?\n'",trim($sets));
$red="";
$blue="";
foreach($lines as $line) {
     $l=trim($line);
     if ($l[0]=="{") $red.=$line."\n";
     if ($l[0]=="~") $blue.=$line."\n";
     }
echo "hot:\n$red\n";
echo "cold:\n$blue\n";
?>


drugi skrypt to skrypt sprawdzajacy zestawy umieszczone w polu zakłady z zestawem umieszczonym w polu "losowania" skrypt wypisuje linie trafione i grupuje trafieniami.

<?php
// ilosc trafien zestawu z pola edycji w zestaw z pola zaklady
// wyswietlane sa  trafienia sortowane opadajaco od najwyzszych
// do najnizszych i linie trafien
// hit 6 linie: 1 12 36
// hit 5 linie: 4  9 44
// ...
// hit 0 linie: 2  8 32 65
error_reporting(E_ALL);
require_once("include/class_Utils.php");

$sets=delphi_str_memoa();
$arrlines = Utils::parse_str_to_set_array($sets);

$mtable = preg_split("'[^0-9]+'", trim($mainedit));


$out=array();
foreach($arrlines as $nbrline=>$linearr) {
    $ht= count(array_intersect($linearr,$mtable));
    $out[$ht][]=$nbrline+1;
}
krsort($out);
foreach($out as $ht=>$line) {
echo sprintf("hit %2d line: %s\n",$ht,Utils::printTicket($line,'%3d '));
} ?>

Skrypt wybiera z z lewego pola te zaklady ktore ktorych numer linii jest w zmiennej $list = "2,7,11,21,26" pamietaj ze lista musi sie zawierac w apostrofach ""

<?php
/*
    Skrypt wybiera z z lewego pola te zaklady
    ktore ktorych numer linii jest w zmiennej
    $list = "2,7,11,21,26"
    pamietaj ze lista musi sie zawierac w apostrofach ""
*/

error_reporting(E_ALL);
require_once("include/class_Utils.php");

// parametr zmieniany przez uzytkownika
$list = "2,7,11,21,26"; // wybiera trafienia wieksze lub rowne niz
// parametr zmieniany przez uzytkownika - koniec

$sets=delphi_str_memoa();
$lmatrix = Utils::parse_str_to_set_array($sets);
$line = Utils::parseLineToNumArr($list);

foreach($line as $num) {
    echo Utils::printTicket($lmatrix[$num-1]),"\n";
}
?>

czwartek, 19 marca 2020

Koronawirus, jak sobie poradziłem z maską ochronną.

Radzimy sobie z Koronawirusem...

Spotkała nas niespodzianka. Niestety jak było do przewidzenia nasi rządzący nie stanęli na wysokości zadania. Mimo ze zwolennicy jak zawsze chcą ich zagłaskać to pomimo tego że wirus na świecie szaleje od ponad 2 miesięcy nic nie zrobili chociażby aby zabezpieczyć społeczeństwo w wystarczającą ilość sprzętu medycznego , masek ochronnych i urządzeń do dezynfekcji i środków dezynfekujących nie mówiąc o testach których brakuje a wciskają kłamstwa ze Oni nad wszystkim panują.
Jestem w grupie ryzyka wiek, cukrzyca, choroba serca a ostatnio dowiedziałem się że jeszcze grupa krwi A którą mam rokuje najgorzej. Jesteśmy emerytami i zaszyliśmy się w domu. Zaczyna brakować żywności i trzeba wyjść do sklepu. A mieszkam na zadupiu. Do najbliższego miasteczka 11km. Jeździ jeszcze sklep objazdowy ale gotówki też brakło.  Maseczek nie ma a nawet jak by były to byłyby wykupione zanim bym mógł kupić. W Internecie są opisy jak takie maseczki uszyć. Przykład propozycji You Tube gdy szukałem materiałów. Wynika z tego że wszędzie przespali środki ochrony, co nie usprawiedliwia naszych gamoni.




Miedzy innymi na stronie : http://www.craftpassion.com/?p=26304 Więc postanowiłem uszyć. Zalecają użycie flaneli ale u nas akurat jej nie ma. Wpadłem na pomysł aby użyć włókniny ze ściereczek które można kupić w Biedronce. Sa to "ściereczki wiskozowe" firmy "Zosia samosia". Jako filtr zastosowałem to co miałem a mianowicie septyczne chusteczki nasączane dla niemowląt "Dada". Z jednej ściereczki wychodzą dwie maseczki. Do jednej maseczki zużywam trzy chusteczki nawilżane DADA i kawałek gumki. Miałem gumkę taką do majtek około 8mm szeroką wiec przeciąłem na pół aby zbytnio nie uwierała za uchem. Są takie gumki okrągłe w oplocie a w ostateczności można zaszyć recepturkę.

A więc do roboty.




  • 1.  Drukuje na papierze A4 wzór maseczki z w/w strony link wzór do wydrukowania w formacie PDF.
  • 2. Wybieram ściereczkę w kolorze ulubionym. Składam na pół i przecinam. 
  • 3. Przeciętą składam na pół i kładę na niej papierowy wzór (są 4 rozmiary męski, żeński, i dwa dla dzieci.). Papier można obciąć do rozmiaru zostawiając margines ok 1 cm z każdej strony.
  • 4. przeszywam przez papier ale tylko nosek (krzywa linia). 
  • 5. Obcinam nadmiar ściereczki zostawiając margines ok 1 cm. Usuwam papier wydzierając go przez szew. 
  • 6. rozkładam szew noska (linia krzywa) i przeszywam z obu stron szwa. A przez środek szew główny przeszywam zygzakiem. 
  • 7. Obszywam naokoło zakładając ten 1 cm. 
  • 8. W środek maseczki wszywam trzy złożone razem chusteczki "DADA". Po wyschnięciu włóknina służy jako doskonały filtr. Obcinam nadmiar chusteczek do granicy maseczki. Nieco zmodyfikowałem ponieważ nadmiar chusteczek dada zawinąłem na brzegach w rulon i tak zaszyłem i stanowią dodatkowe uszczelnienie wokół nosa i ust. Ale można tylko obciąć nadmiar. 
  • 9. Zakładam brzegi maseczki i przeszywam zakładkę stanowiącą ślówkę dla gumek mocowania za uszy. 
  • 10. Przeciągam gumki, wiążę lub przeszywam na odpowiedni rozmiar. 11. Końcowe wykończenie to na butelce wypycham i modeluje nosek maseczki. 
No i maseczka gotowa.
 Aha na kanale Youtube DamienChen MadeInChina https://www.youtube.com/channel/UC8qoEv552CgX2_EwnGdYz5A w jednym z odcinków o Chinach zobaczyłem że w górny brzeg zaszyty w kształt kanału można wsunąć miękki drucik który pozwoli uformować maseczkę aby uszczelnić okolice nosa i policzków. W przeciwnym razie wydychane gorące i zawilgocone  powietrze będzie dmuchało w oczy co (sprawdziłem) powoduje że sie pocisz a okulary zaparowują. Po załozeniu maseczki uformuj własnie okolice nosa i policzków.

Ostatnio uszyłem maseczki trochę lżejsze z samych włóknin wysuszonych chusteczek dla niemowląt "Dada" obszywając je naokoło i zawijając własnie okolice nosa formujac kanalik w który wsuwam zakończony łagodnie (zagięty na końcach w ciasną pętelkę) miekki drucik. Tak drucik wkładają nieraz w kwiaciarniach, daje się łatwo formować. Na bokach maseczk przyszywam gumke sciegiem ZIGZAG. Brzegi formuję w krótkie dwie zakładki fałdki. Takie fałdki ułatwiają po rozłożeniu uformowanie na krzywiźnie twarzy.

Powodzenia, uważajcie na siebie.  


Zdjęcie nowej zamieszczę tutaj:
Uformowany nosek :
 Nie uformowany





piątek, 24 stycznia 2020

Skrypt podział na strefy.

Dziś skrypt który zestawy liczb z pola zakłady dzieli na strefy.
przykład:
W polu zakłady są liczby:

Po uruchomieniu skryptu zostana podzielone na zadane parametrem strefy. (tutaj po liczb w strefie: 3,3,2,1) i oddzielone sekwencją zadanych znaków w drugim parametrze.

 tekst skryptu w pierwszych liniach parametry podziału :

<?php
//------------ parametry -------- poczatek------------
$sel = array(3,3,2,1);  // po ile strefy. w ostatniej strefie jak
                        // do konca liczb -> to wpisac duża liczbe np 100
                        
$space="     ";         // ile spacji w odstepach miedzy sekcjami
//------------ parametry -------- koniec -------------

$sets=delphi_str_memoa(); // pobiera set z pola zaklady
$set_lines=preg_split("'\r?\n'", trim($sets));
$outarr=array();
$offset=0;
foreach($set_lines as $line) {
$arr=preg_split("/[^0-9]+/",trim($line));
//asort($arr);
$all[]=$arr;
}

foreach($all as $ary) {
        $offset=0;
 $out=array();
 foreach($sel as $ile) {
 $out[]=array_slice($ary, $offset, $ile);
 $offset+=$ile;
}
$outarr[]=$out; 
}

foreach($outarr as $sets) {
 foreach($sets as $set) {
  echo printTicket($set),$space;
 }
 echo "\n";
}


    function printTicket($arr, $format = '%2d ')
    {
        $result = '';
        foreach ($arr as $key => $num) {
            $result .= sprintf($format, $num);
        }
        return $result;
    }
 
?>