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

poniedziałek, 4 marca 2024

Pytanie: ...Nie mogę pobrać aktualizacji wyników losowań system Windows10

Klient zgłosił pytanie jak w tytule ze zrzutem ekranu:

Odp: Jeżeli komunikat "wyskoczył" od razu przy starcie programu to znaczy że program był źle zainstalowany. Natomiast gdy jednak instalacja jest OK a komunikat wyświetla się podczas aktualizacji wyników to najprawdopodobiej zainstalowanie nowej wersji zadziałało ale nie ma w katalogu LottoCad-a odpowiedniej biblioteki. Jeżeli "awaria" polegała na wyświetleniu komunikatu "Nie mozna załadować biblioteki dll" to zapewne w katalogu głównym jej nie ma. Mechanizm wczytywania bublioteki do aktualizacji wyników polega na tym ze program z bazy danych odczytuje jaka biblioteka aktualnie odpowiada za ściaganie wyników. W najnowaszej wersji jest to biblioteka (plik dll) o nazwie downsql.dll, która powinna znajdować się w katalogu głównym programu np C:\Program Files (x86)\Wojar Software\Lotto CAD 2.32lottocad.

Zależności przedstawia dobrze rysunek ( jeżeli wpis w bazie jest inny lub nie ma tej biblioteki w katalogu głównym, to nalezy go tam umiesćić. Bibliotekę można ściągnąć z downsql.zip. Po rozpakowaniu umieść go w katalogu głównym programu lottocad.)

Polecam pobranie pełnej instalacji z poprawkami. Poprawki dotyczyły głównie instalatora i deinstalatora. Dobrze jest aby zrobić to dwukrotnie, raz zainstalować (wgrany będzie nowy uninstaler) , potem odinstalować programem uninstall.exe z katalogu głównego (uninstaler usunie wszystkie śmieci) i po usunięciu zainstalować program jeszcze raz już bez śmieci na czysto.>/p>

Uwaga : Nowy moduł pobierania wyników pobiera również wyniki Keno i Szybkie600. Z uwagi na wielkość baz losowań (losownia są przecież co 4 minuty). Dla pobrania zaległości wymagane jest kilkukrotne wywołanie opcji "Pobierz" w module pobierania wyników losowań. Moduł pobiera na raz maksymalnie 5000 wyników z każdej gry.

środa, 11 stycznia 2023

Sposób na utworzenie i aktualizację baz dla gier MULTI_14 i MULTI_22

 Łatwy sposób na tworzenie i aktualizację baz MULTI_14 i MULTI_22. 

 Otwórz "Managera gier". 

Zrób kopię plików bazy wszystkich lub tylko tych o nazwie MULTI_14 i MULTI_22 z katalogu

    C:\Users\Klient\AppData\Roaming\LottoCad232R

    lub w wesji spolszczonej bedzie to ściezka jak na zdjęciu. Gdzie Klient oznacza indywidualną

    nazwę Twojego udziału np "Wojtek", "Marek" poprostu TY.

    W podkatalogu zaznacz wpisy tabel o nazwach MULTI_14 i MULTI_22 (4 pliki) i przenieś ja na chwilę

    np na pulpit. Zabezpieczy Cię to jak coś zepsujesz. Zawsze możesz wrócić przenosząc je spowrotem.

    

Otwórz "Manager Gier", przejdź do zakładki SQL. Wklej w edytor ponizszy skrypt. Następnie wciśnij przycisk wykonaj. I już bazy zostaną rozdzielone na dwie bazy ze wzgledu na wpis o godzinie losowania.


/* początek skryptu, komentarze otoczone parą ukośnik, gwiazdka nie biorą udziału
   to tylko informacja co wykonuje linia polecenia */
EMPTY TABLE MULTI_14;
/* Czyści tabelę wyników gry MULTI_14 */

INSERT INTO MULTI_14 SELECT * FROM multi_multi WHERE (EXTRACT(HOUR FROM "Date")< 15);
/* zapytanie wybiera z bazy te losowania których czas
   losowania jest przed godziną 15:00:00 czyli losowania
   południowe */

EMPTY TABLE MULTI_22;
/* Czyści tabelę wyników gry MULTI_22 */

INSERT INTO MULTI_22 SELECT * FROM multi_multi WHERE (EXTRACT(HOUR FROM "Date")> 15);
/* zapytanie wybiera z bazy te losowania których czas
   losowania jest po godzinie 15:00:00 czyli losowania
   wieczorne */
/* koniec skryptu */

niedziela, 12 września 2021

Keno i Szybkie600, kłopoty

 Dostałem wiadomość że nie działa skrypt do sciągania wyników Szybki600 i Keno. Jak sie okazało skrypt działa. Przyczyną niepowodzenia mogą być zabezpieczenia w skrypcie wykonywanym w programie, usłudze : powershell.

Jak sprawdzić czy powershell ściąga wyniki. W paczce znajduje się wykonywalny skrypt powershell o nazwie dwn.ps1.

Jak go uruchomic aby sprawdzić czy ściągane są wyniki losowań.

Wybierz w eksploratorze katalog gdzie są skrypty dla nowych gier jak w poprzednim poście: LottoCad: Keno i Szybkie600 w LottoCAD-zie. Wybierz menu "Plik" a z niego uruchom powershell lub jezeli masz ustawione inaczej to polecenie otwierające konsolę "cmd".

Otworzy się okno "powershell" lub "cmd". Jeżeli będzie to okno "cmd" wpisz " "powershell dwn.ps1" natomiast gdy będzie to okno "powershell" wpisz polecenie jak na rysunku "./dwn.ps1"

Po wykonaniu skryptu w oknie powinny pojawić sie dane z usługi ściągania wyników ze strony "lotto.pl". Poniższe zrzuty ekranu wyjaśnią wiele.

Przypominam: okna powershell czy cmd powinny byc otworzone z pełna ścieżką jak na zrzutach.







poniedziałek, 30 sierpnia 2021

Keno i Szybkie600 w LottoCAD-zie

 Witam...

Wprowadziłem skrypty i można wprowadzić nowe dwie gry do LottoCADa:

  • Keno
  • Szybkie600
Spakowaną w formacie zip paczkę skryptów można pobrać z linku :


To gry losowane co 4 minuty i trzeba tu zmienić koncepcję gry. Analiza gry na bieżąco wydaje się niemożliwa, podczas sesji w ciągu 4 minut trzeba by było ściągnąć i zapisać wyniki, wykonać analizę czy predykcję, wygenerować zakłady no i je wysłać. Ściąganie wyników na bieżąco i "gra zaraz po grze" wydaje się więc niemożliwa ale można ściągnąć np zawsze ostatnie 500 wyników i analizować do gry na przyszłe kilka losowań niekoniecznie na następne. Czyli sesję zaczynamy od ściągnięcia 500 wyników czyli ok dwa dni losowań. 

W paczce znajdują się pliki :
  • download500_Keno.php  - ściąga wyniki dla gry Keno, maximum 500
  • download500_Szybkie600.php   - ściąga wyniki dla gry Szybkie600, maximum 500  
  • keno_config.ini - plik w formacie ini dane do założenia gry Keno
  • Szybkie600_config.ini - plik w formacie ini dane do założenia gry Szybkie600
  • Keno_create_new_game.php - skrypt tworzący zapytania tworzące gre Keno
  • Szybkie600_create_new_game.php  - skrypt tworzący zapytania tworzące gre S600

a w podkatalogu "szablony" pliki:
  • newgame_config.ini  - przykładowy plik konfiguracji do tworzenia przyszłych gier
  • newgame_to_sql.php - przykładowy skrypt do tworzenia przyszłych gier
Jak to zrobić najlepiej wyjaśni film.






 

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