Python: events per programmatori di coccio

gennaio 18, 2019 Lascia un commento

Ci sono mille modi per utilizzare la programmazione EVENT-DRIVEN e ci sono mille librerie perfette per tale scopo.
Detto in soldoni, il flusso del programma che scriviamo, cambia a seconda del verificarsi di un determinato evento.
Tipico esempio di programmazione EVENT-DRIVEN è un programma dotato di interfaccia grafica.
Cliccare su un pulsante implica il verificarsi di un evento e di conseguenza l’esecuzione di un codice ben definito.
Ecco ad esempio come wx utilizza e gestisce gli eventi: wx events and event handlers.

I programmi event-driven sono composti tipicamente da brevi sotto-programmi, chiamati event-handlers (gestori degli eventi), che sono eseguiti in risposta agli eventi esterni, e da un dispatcher, che effettua materialmente la chiamata.
Il dispatcher utilizza una coda degli eventi, che contiene l’elenco degli eventi già verificatisi, ma non ancora “processati”.
In molti casi i gestori degli eventi possono, al loro interno, innescare (“trigger”) altri eventi, producendo una cascata di eventi.

Ecco un primo esempio semplicissimo di programmazione event-driven.

# eventdrivensimple.py

class Observer():
    _observers = []
    def __init__(self):
        self._observers.append(self)
        self._observables = {}
    def observe(self, event_name, callback):
        self._observables[event_name] = callback


class Event():
    def __init__(self, event_name, data, autofire=True):
        self.name = event_name
        self.data = data
        if autofire:
            self.fire()
    def fire(self):
        for observer in Observer._observers:
            if self.name in observer._observables:
                observer._observables[self.name](self.data)


class Listener(Observer):
    def __init__(self, name):
        self.name = name
        super(Listener, self).__init__()
        print("<%s> is waiting for events..." % self.name)

    def on_event(self, event_type, data=None):
        print("[%s] event '%s' received!" % (self.name, event_type))

Analizziamo la prima classe definita, Observe.

class Observer():
    _observers = []
    def __init__(self):
        self._observers.append(self)
        self._observables = {}
    def observe(self, event_name, callback):
        self._observables[event_name] = callback

La classe Observer definisce, a livello di classe, un lista di observers (ovvero le istanze della classe Listener
che vedremo più avanti) e in fase di creazione dell’istanza, un dizionario che avrà come chiavi, i tipi di evento e come valori, le callbacks da chiamare al verificarsi di tale evento.

La seconda classe definita è l’oggetto evento vero e proprio, Event.

class Event():
    def __init__(self, event_name, data, autofire=True):
        self.name = event_name
        self.data = data
        if autofire:
            self.fire()
    def fire(self):
        for observer in Observer._observers:
            if self.name in observer._observables:
                observer._observables[self.name](self.data)

In fase di creazione di un’istanza evento, diamo un nome all’evento e possiamo anche passargli dei dati, ad esempio l’istanza stessa.
L’argomento autofire=True serve per chiamare un automatico il metodo fire() in fase di creazione.
Questo metodo cicla sulla lista _observers della classe Observer.
Per ogni observer della lista, controlla che nel dizionario _observables, sia presente quello specifico evento.
In caso di presenza, chiama la callback associata a tale chiave, passando gli eventuali argomenti (data).

Infine abbiamo la classe Listener, che semplicemente estende la prima classe Observer

class Listener(Observer):
    def __init__(self, name):
        self.name = name
        super(Listener, self).__init__()
        print("<%s> is waiting for events..." % self.name)

    def on_event(self, event_type, data=None):
        print("[%s] event '%s' received!" % (self.name, event_type))

In fase di creazione dell’istanza, tramite super il listener stesso viene aggiunto alla lista degli observers.

Ora vediamo il funzionamento, creiamo per prima cosa un listener:

>>> from eventdrivensimple import Observer, Event, Listener
>>> listener1 = Listener(name="listener1")
<listener1> is waiting for events...

Siccome listener eredita da Observer, con il metodo observe() ereditato, gli diciamo
di aggiungere al dizionario la coppia evento:callback ovvero “event1”: listener.on_event

listener1.observe('event1',  listener1.on_event)

Quando si verificherà il tal evento (event1), si innescherà il ciclo precedentemente visto, ciòè tutti i listeners che avranno tale
evento nel proprio dizionario, chiameranno la callback associata:

>>> listener1.observe(event_name="event1", callback=listener1.on_event)
>>> Event(event_name="event1", data="foo")
[listener1] event 'foo' received!
<eventdrivensimple.Event object at 0x00866650>
>>> Event(event_name="event2", data="bar")
<eventdrivensimple.Event object at 0x00866690>

Come si nota il secondo evento non viene ricevuto, non avendo registrato il listener per tale evento.
Chiaramente la cosa funziona anche con diversi listeners:

>>> listener1 = Listener(name="listener1")
<listener1> is waiting for events...
>>> listener2 = Listener(name="listener2")
<listener2> is waiting for events...
>>> listener1.observe(event_name="event1", callback=listener1.on_event)
>>> listener1.observe(event_name="event2", callback=listener1.on_event)
>>> listener2.observe(event_name="event2", callback=listener2.on_event)
>>> Event(event_name="event1", data="foo")
[listener1] event 'foo' received!
<eventdrivensimple.Event object at 0x00625E90>
>>> Event(event_name="event2", data="bar")
[listener1] event 'bar' received!
[listener2] event 'bar' received!
<eventdrivensimple.Event object at 0x00625EB0>

Questo è uno dei metodi più semplici di utilizzo degli eventi, con tutti i contro del caso.
In realtà i pattern di questo tipo sono molto più complicati, ma esistono librerie apposite che compiono questo lavoro perfettamente.
Il fine è solo quello di capirne il meccanismo.

Ad esempio si potrebbe utilizzare una classe Dispatcher che esegua il compito che fino ad ora abbiamo svolto
all’interno della stessa classe Event, autochiamando il metodo fire() ad ogni creazione di un’istanza evento.

Ecco un esempio un po’ più complesso:

# eventdrivenmedium.py

class Event:
    def __init__(self, event_name, data=None):
        self._name = event_name.lower()
        self._data = data
        
    @property 
    def name(self):
        return self._name
        
    @property
    def data(self):
        return self._data


class EventDispatcher:
    def __init__(self):
        self._events = dict()
        
    def __del__(self):
        self._events = None
    
    def has_listener(self, event_name, listener):
        if event_name in self._events.keys():
            return listener in self._events[event_name]
        else:
            return False
        
    def add_event_listener(self, event_name, listener):
        if not self.has_listener(event_name, listener):
            listeners = self._events.get(event_name, [])
            listeners.append(listener)
            self._events[event_name] = listeners
    
    def remove_event_listener(self, event_name, listener):
        if self.has_listener(event_name, listener):
            listeners = self._events[event_name]
            if len(listeners) == 1:
                # Only this listener remains so remove the key
                del self._events[event_name]
            else:
                # Update listeners value
                listeners.remove(listener)
                self._events[event_name] = listeners

    def dispatch_event(self, event):
        if event.name in self._events.keys():
            listeners = self._events[event.name]
            
            for listener in listeners:
                listener(event)  # fire!


class Listener:
    def __init__(self, name, event_dispatcher):
        self.name = name
        self.event_dispatcher = event_dispatcher

    def add_to_events(self, event_name, listener):
        self.event_dispatcher.add_event_listener(event_name=event_name, 
                                                 listener=self.on_event)

    def on_event(self, event):
        """
        Callback to override when extend Listener class
        """
        pass

La classe Event, sempre quella è.
La classe EventDispatcher crea un dizionario del tipo event_name:listeners, dove event_name è il tipo di evento, mentre listeners è la lista di tutte le callbacks associate a tal evento.
I metodi del dispatcher sono:

has_listener(event_name, listener):

...
    def has_listener(self, event_name, listener):
        if event_name in self._events.keys():
            return listener in self._events[event_name]
        else:
            return False

controlla che event_name sia presente tra le chiavi del dizionario degli eventi, se sì, ritorna True se nella lista dei listeners associati a tale evento, è presente il listener passato come argomento, oppure ritorna False.

add_event_listener(event_name, listener):

...
    def add_event_listener(self, event_name, listener):
        if not self.has_listener(event_name, listener):
            listeners = self._events.get(event_name, [])
            listeners.append(listener)
            self._events[event_name] = listeners

Se il listener non è già presente nel dizionario, ottengo dal dizionario stesso la lista dei listeners ed aggiungo il listener passato come argomento, poi aggiorno il valore per quella chiave evento, con la nuova lista di listeners aggiornata.

remove_event_listener(event_name, listener):

...
    def remove_event_listener(self, event_name, listener):
        if self.has_listener(event_name, listener):
            listeners = self._events[event_name]
            if len(listeners) == 1:
                # Only this listener remains so remove the key
                del self._events[event_name]
            else:
                # Update listeners value
                listeners.remove(listener)
                self._events[event_name] = listeners

fa il percorso inverso del metodo precedente. Se il listener è presente, lo rimuove ed aggiorna il valore con la lista dei listeners aggiornata, se la lista rimane vuota, viene eliminata la chiave di quell’evento, dal dizionario degli eventi.

dispatch_event(event):

Il cuore del dispatcher! Se l’evento è nel dizionario degli eventi, chiamo tutti i listeners associati ad esso.

...
    def dispatch_event(self, event):
        if event.name in self._events.keys():
            listeners = self._events[event.name]
            
            for listener in listeners:
                listener(event)  # fire!

L’ultima classe definita, è un classe generica di Listener, che estenderemo al bisogno.

class Listener:
    def __init__(self, name, event_dispatcher):
        self.name = name
        self.event_dispatcher = event_dispatcher

    def add_to_events(self, event_name, listener):
        self.event_dispatcher.add_event_listener(event_name=event_name, 
                                                 listener=self.on_event)

    def on_event(self, event):
        """
        Callback to override when extend Listener class
        """
        pass

Riceve, oltre al nome, un’istanza di dispatcher.

add_to_events(event_name, listener)

Aggiunge al dizionario degli eventi del dispatcher, un evento (event_name) associato alla callback (listener) da chiamare quando si verifica tale evento.

on_event(event)

callback vuota che verrà sovrascritta quando erediteremo dalla classe Listener.
E’ la callback che verrà invocata al presentarsi di un determinato evento.

Ecco un esempio chiarificatore: creiamo una classe Site ed una User che ereditino da Listener.
Poi definiamo i due event_name che utilizzeremo nell’esempio.

CHECK = "check logged in users"
RESPOND = "respond to check"


class Site(Listener):
    def __init__(self, name, event_dispatcher):
    	super(Site, self).__init__(name, event_dispatcher)
    	self.add_to_events(event_name=RESPOND, listener=self.on_event)
        
    def on_event(self, event):
        """
        Event handler for the RESPOND event type
        """
        print("<<< I'm logged in [{0}]".format(event.data.name))

    def check(self):
        print(">>> Who are logged in? [{0}]".format(self.name))
        self.event_dispatcher.dispatch_event(Event(event_name=CHECK, data=self))
        

class User(Listener):
    def __init__(self, name, event_dispatcher):
    	super(User, self).__init__(name, event_dispatcher)
    	self.add_to_events(event_name=CHECK, listener=self.on_event)
        
    def on_event(self, event):
        """
        Event handler for 'CHECK' event type
        """
        self.event_dispatcher.dispatch_event(Event(event_name=RESPOND, 
        	                                       data=self))

L’istanza di Site una volta creata aggiungerà al dizionario degli eventi l’evento RESPOND e la callback on_event ereditata ed opportunamente modificata. Stessa cosa per User; l’istanza registrerà la propria callback all’evento CHECK.
Quando site effettuerà un check con l’apposito metodo, chiamerà il metodo dispatch_event del dispatcher sull’evento CHECK.
Il dispatcher cercherà sul dizionario tutti i listener collegati a CHECK, nel nostro caso gli users che, una volta istanziati hanno aggiunto la propria callback all’elenco di listeners relativi all’evento stesso.
Trovati tali listeners, verranno invocate le relative callbacks (metodo on_event di User).
Tali callbacks, tramite il metodo dispatch_event del dispatcher, genereranno l’evento RESPOND.
Il listener collegato a tale evento è on_event di site, che risponde pertanto alla chiamata.

>>> from eventdrivenmedium import EventDispatcher, Site, User
>>> dispatcher = EventDispatcher()
>>> site = Site(name="examlpe.com", event_dispatcher=dispatcher)
>>> user1 = User(name="bancaldo", event_dispatcher=dispatcher)
>>> user2 = User(name="anonymous", event_dispatcher=dispatcher)
>>> site.check()
>>> Who are logged in? [examlpe.com]
<<< I'm logged in [bancaldo]
<<< I'm logged in [anonymous]

Questi sono appunti sui principi di funzionamento della programmazione event-driven. Gli esempi sono MOLTO semplificati.

Annunci
Categorie:python Tag:,

Django channels: chat

gennaio 15, 2019 Lascia un commento

Django-channels è stato creato per gestire, con django, i protocolli di comunicazione asincrona come i websockets.
Oltre alla gestione dei websockets, channels permette di eseguire processi asincroni in background.

In ogni tipica applicazione Django, il traffico HTTP è gestito in maniera Sincrona, ovvero, quando un browser manda una request,
aspetta che questa venga instradata a Django, il quale dopo le opportune elaborazioni rispedirà al mittente una response.

Invece la cosa è molto più versatile con i websockets, perchè la comunicazione è di tipo bidirezionale.
Quando una connessione ad un websocket viene stabilita, il browser può spedire e ricevere messaggi e la visualizzazione avviene automaticamente senza bisogno di “ricaricare” ogni volta il browser.

Vediamo un esempio chiarificatore.
Creiamo una chat (è il solito esempio che troverete sul web in migliaia di forme simili) con django e django-channels.

Per prima cosa creiamo un virtual-environment:

C:\tmp\django-dev>python -m venv venv

lo attiviamo:

C:\tmp\django-dev>venv\Scripts\activate

ed installiamo le librerie necessarie:

(venv) C:\tmp\django-dev>pip install django

Prima di installare channels, installiamo Twisted da wheel per non incorrere in un fastidioso errore.
Da questo sito scaricare la versione corretta, nel mio caso quella per python 3.7 a 32 bit e posizionare il file scaricato, all’interno del venv creato in precedenza. Installare il file:

(venv) C:\tmp\django-dev>pip install venv\Twisted-18.9.0-cp37-cp37m-win32.whl
Processing c:\tmp\django-dev\venv\twisted-18.9.0-cp37-cp37m-win32.whl
...
Installing collected packages: Twisted
Successfully installed Twisted-18.9.0

Installato twisted procedere con i pacchetti channels ed asgi_redis:

(venv) C:\tmp\django-dev>pip install channels channels_redis pywin32

Pywin32 è necessario per poter utilizzare Redis-server su windows.

La fase successiva è quella di creare il progetto django e l’applicazione chat:

(venv) C:\tmp\django-dev>django-admin startproject djangosite
(venv) C:\tmp\django-dev>cd djangosite
(venv) C:\tmp\django-dev\djangosite>python manage.py startapp chat

Ora andremo a modificare il codice per creare la nostra chat.
Nel file djangosite\setiings.py aggiungere channels e chat:

...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'chat',
    'channels',
]

...

Ora puntiamo al nostro server REDIS, sempre nel file djangosite\setiings.py:

...

ASGI_APPLICATION = "djangosite.routing.application"

CHANNEL_LAYERS = {
    'default': {'BACKEND': 'channels_redis.core.RedisChannelLayer',
                'CONFIG': {"hosts": [('127.0.0.1', 6379)], }, },
                 }

Come si nota nella prima riga di codice inserita, puntiamo ad un file routing, che ora andiamo a creare:

# djangosite/routing.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing


application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(chat.routing.websocket_urlpatterns)
    ),
}
)

Qui viene definito il ProtocolTypeRouter e si richiamano le “url” riferite ai websockets dell’applicazione chat.
Dobbiamo quindi creare anche il file routing.py dell’applicazione chat:

# chat/routing.py

from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^ws/chat/$', consumers.ChatConsumer),
]

Come si nota, qui importiamo e facciamo riferimento ad un Consumer (ChatConsumer).
I consumers sono l’equivalente delle views in una app tradizionale di Django.
Per approfondimenti sui Consumers fare riferimento alla doc ufficiale.

Creiamo il file consumers quindi:

# chat/consumers.py

from asgiref.sync import AsyncToSync
from channels.generic.websocket import WebsocketConsumer
import json


class ChatConsumer(WebsocketConsumer):
    @property
    def _topic_name(self):
        return "topic_DjangoWebsocketTest"

    @property
    def _chat_channel_name(self):
        return "DjangoWebsocketTest"

    def connect(self):
        AsyncToSync(self.channel_layer.group_add)(
            self._chat_channel_name,
            self.channel_name)
        self.accept()

    def disconnect(self, close_code):
        AsyncToSync(self.channel_layer.group_discard)(
            self._chat_channel_name,
            self.channel_name)

    def receive(self, text_data):

        json_text_data = '{"message": "%s"}' % text_data
        text_data_json = json.loads(json_text_data)
        message = text_data_json['message']

        AsyncToSync(self.channel_layer.group_send)(
            self._chat_channel_name,
            {
                'type': 'chat_message',
                'message': message
            })

    # Handles the "chat_message" event when it's sent to our group
    def chat_message(self, event):
        message = event['message']
        self.send(text_data=message)

Ora dobbiamo modificare i vari file urls, cominciando con quello principale:

# djangosite\urls.py

from django.contrib import admin
from django.conf.urls import include, url

urlpatterns = [
    url(r'^', include('chat.urls')),
    url(r'^admin/', admin.site.urls),
]

Poi, richiamandolo tramite include, creiamo quello specifico della app chat:

# chat\urls.py

from django.contrib import admin
from django.conf.urls import include, url
from chat import views

urlpatterns = [
    url(r'^chat$', views.chat, name='chat'),
]
Creiamo la views per effettuare la chat:

# chat/views.py

from django.shortcuts import render

# Create your views here.


def chat(request):
    return render(request, 'chat/chat.html', {})

Ed infine creiamo le templates, partendo da quella base. Creare quindi la solita directory sotto chat e
dentro quest ultima, creaiamo un’altra sottodirectory chat. Creeremo quindi due file:

chat\templates\chat\base.html
chat\templates\chat\chat.html

Il file base dal quale erediteremo sarà:

{% load staticfiles %}
{% load static %}
{# Load the tag library #}
{# Load CSS and JavaScript #}

{% block head %}
{% endblock %}

<title>{% block title %}Channels Chat{% endblock %}</title>

{% block navbar %}
{% endblock %}

<html>

  <head>
      {% block script %}{% endblock script %}
  </head>

  <body>
      {% block content %}{% endblock %}
  </body>

</html>

il file specifico invece che erediterà, sarà:

{% extends 'chat/base.html' %}

{% block title %}<title>Channels Chat</title>{% endblock %}

{% block content %}
  <html>
   <script>
    window.onload = function() {

      // Get references to elements on the page.
      var form = document.getElementById('message-form');
      var messageField = document.getElementById('message');
      var messagesList = document.getElementById('messages');
      var socketStatus = document.getElementById('status');
      var closeBtn = document.getElementById('close');
      var wsurl = "ws://127.0.0.1:8000/ws/chat/";

      // create a new socket
      var socket = new WebSocket(wsurl);

      // event listener all'apertura del socket
      socket.onopen = function open(event) {
            socketStatus.innerHTML = 'Connected to: ' + event.currentTarget.url;
            socketStatus.className = 'open';
       };

    // Send a message when the form is submitted.
    form.onsubmit = function(e) {
      e.preventDefault();

      // Retrieve the message from the textarea.
      var message = messageField.value;

      // Send the message through the WebSocket.
      socket.send(message);

      // Add the message to the messages list.
      messagesList.innerHTML += '<li class="sent"><span>Sent:</span>' + message +
                                '</li>';

      // Clear out the message field.
      messageField.value = '';

      return false;
    };

    // Handle messages sent by the server.
    socket.onmessage = function(event) {
      var message = event.data;
      messagesList.innerHTML += '<li class="received"><span>Received:</span>' +
                                 message + '</li>';
    };

    };
    </script>

   <body>
   <b><font color="green">Django Chat</font></b>
    <div id="page-wrapper">
        <h1>WebSockets with Django and Channels</h1>

        <div id="status">Connecting...</div>

        <ul id="messages"></ul>

        <form id="message-form" action="#" method="post">
          <textarea id="message" placeholder="Write your message here..." required></textarea>
          <button type="submit">Send Message</button>
          <button type="button" id="close">Close Connection</button>
        </form>
      </div>
    </body>
  </html>
{% endblock %}

Ora vediamo che tutto funzioni a dovere.
Da un altro prompt dei comandi, lanciamo il server redis con l’eseguibile redis-server:

(venv) C:\tmp\redis>redis-server.exe
...
[1780] 15 Jan 12:11:24.518 # Server started, Redis version 3.2.100
[1780] 15 Jan 12:11:24.518 * DB loaded from disk: 0.000 seconds
[1780] 15 Jan 12:11:24.518 * The server is now ready to accept connections on port 6379

e lanciamo il nostro server Django:

(venv) C:\tmp\django-dev\djangosite>python manage.py runserver
Django version 2.1.5, using settings 'djangosite.settings'
Starting ASGI/Channels version 2.1.6 development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Channels è attivo come si può notare:

Starting ASGI/Channels version 2.1.6 development server at http://127.0.0.1:8000/

Ora proviamo a raggiungere la pagina chat all’indirizzo http://127.0.0.1:8000/chat:

La console di django con debug attivo, mi direbbe che tutto funziona a dovere:

HTTP GET /chat 200 [0.05, 127.0.0.1:52135]
WebSocket HANDSHAKING /ws/chat/ [127.0.0.1:52139]
WebSocket CONNECT /ws/chat/ [127.0.0.1:52139]

Proviamo a scrivere un messaggio, otterremmo ciò che segue.

Il messaggio che spediamo, viene anche ricevuto inquanto per come abbiamo strutturato il consumer, facendo parte del gruppo su cui scriviamo, riceviamo lo stesso messaggio spedito.

Se ora aprissimo un secondo browser e ci collegassimo allo stesso indirizzo, la chat funzionerebbe.
Spediamo pertanto un paio di messaggi da entrambi i browser e verifichiamo che tutto funzioni.
Scrivo dal Secondo client:

Ricevo dal Primo client:

Scrivo dal Primo Client:

Ricevo dal Secondo Client:

Non resta che chiudere la connessione con l’apposito pulsante, disconnessione che verrà mostrata correttamente anche nella console di django:

WebSocket DISCONNECT /ws/chat/ [127.0.0.1:52200]
WebSocket DISCONNECT /ws/chat/ [127.0.0.1:52139]

Link utili:
django
django-channels
redis
example code on github

Mqtt e python: esempio pratico

gennaio 11, 2019 Lascia un commento

Dopo i primi passi su Mqtt, vediamo un esempio con un’app wx.
Creiamo un frame con all’interno un semplice widget.
Usiamo per comodità una static text, in modo da poterne cambiare il background colour ed il testo contenuto.

# monitor.py
#
# A simple wx app with mqtt client example
# Send command from another client to change the widget colour.
# ON and OFF commands are accepted.

import time
import paho.mqtt.client as paho
import wx


BROKER = "test.mosquitto.org"
PORT = 1883
TOPIC = "bancaldo/test/monitor"


class MonitorPanel(wx.Panel):
    def __init__(self, parent):
        super(MonitorPanel, self).__init__(parent=parent)
        self.text = wx.StaticText(self, size=(200, 200))


class MonitorFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MonitorFrame, self).__init__(parent=parent, title=title)
        self.client = None
        self.parent = parent
        self.panel = MonitorPanel(parent=self)

        self.Bind(wx.EVT_CLOSE, self.on_quit)

        self.panel.SetBackgroundColour(wx.WHITE)
        self.SetSize((200, 200))
        self.Center()

    # Mqtt client on_message callback
    def on_message(self, client, userdata, message):
        time.sleep(1)
        com = str(message.payload.decode("utf-8"))
        print("[DEBUG] received message =", 
        	  str(message.payload.decode("utf-8")))
        if com.upper() == "ON":
            self.panel.text.SetLabel('LIGHT ON!')
            self.panel.text.SetBackgroundColour(wx.GREEN)

        elif com.upper() == "OFF":
            self.panel.text.SetLabel('LIGHT OFF!')
            self.panel.text.SetBackgroundColour(wx.WHITE)
        else:
            self.panel.text.SetLabel("Unknown command:\n"
                                     "'%s'\n Use 'ON' or 'OFF' commands only!"
                                     % com)
            self.panel.text.SetBackgroundColour(wx.RED)

    def init_client(self):
        self.client = paho.Client("Mqtt Monitor")
        self.client.on_message = self.on_message
        print("connecting %s to broker " % self.client._client_id)
        self.client.connect(BROKER, PORT)
        print("subscribing %s to topic '%s'..." % (self.client._client_id,
        	                                       TOPIC))
        self.client.subscribe(TOPIC)
        self.client.loop_start()

    def on_quit(self, event):
        self.client.loop_stop()
        self.client.disconnect()
        self.Destroy()


class MQTTApp(wx.App):
    def OnInit(self):
        monitor = MonitorFrame(parent=None, title='MQTT Monitor')
        monitor.Show()
        monitor.init_client()
        return True


if __name__ == '__main__':
    app = MQTTApp(False)
    app.MainLoop()

Ha molta importanza la callback on_message, che personalizziamo qui:

class MonitorFrame(wx.Frame):
    ...
    # Mqtt client on_message callback
    def on_message(self, client, userdata, message):
        time.sleep(1)
        com = str(message.payload.decode("utf-8"))
        print("[DEBUG] received message =", 
        	  str(message.payload.decode("utf-8")))
        if com.upper() == "ON":
            self.panel.text.SetLabel('LIGHT ON!')
            self.panel.text.SetBackgroundColour(wx.GREEN)

        elif com.upper() == "OFF":
            self.panel.text.SetLabel('LIGHT OFF!')
            self.panel.text.SetBackgroundColour(wx.WHITE)
        else:
            self.panel.text.SetLabel("Unknown command:\n"
                                     "'%s'\n Use 'ON' or 'OFF' commands only!"
                                     % com)
            self.panel.text.SetBackgroundColour(wx.RED)

In pratica preleviamo il messaggio da payload e a seconda del
suo valore, coloro il widget in modo diverso.

L’assegnazione della callback, avviene durante l’inizializzazione del client mqtt,
che avviene nel metodo init_client:

class MonitorFrame(wx.Frame):
    ...
    def init_client(self):
        self.client = paho.Client("Mqtt Monitor")
        self.client.on_message = self.on_message
        print("connecting %s to broker " % self.client._client_id)
        self.client.connect(BROKER, PORT)
        print("subscribing %s to topic '%s'..." % (self.client._client_id,
        	                                       TOPIC))
        self.client.subscribe(TOPIC)
        self.client.loop_start()
    ...

class MQTTApp(wx.App):
    def OnInit(self):
        monitor = MonitorFrame(parent=None, title='MQTT Monitor')
        monitor.Show()
        monitor.init_client() # inizializzo il client mqtt
        return True


if __name__ == '__main__':
    app = MQTTApp(False)
    app.MainLoop()

Per testarne invece il funzionamento, utilizziamo l’applicazione MQTTfx,

ma andrebbe benissimo anche una shell di python, dove poter creare un client
e dare i comandi sul topic corretto:

>>> from paho.mqtt.client import Client
>>> client = Client("Mqtt Client 1")
>>> topic = "bancaldo/test/monitor"
>>> broker = "test.mosquitto.org"
>>> client.connect(broker, port=1883)
0
>>> client.publish(topic, "ON")
<paho.mqtt.client.MQTTMessageInfo object at 0x0221C750>

>>> client.publish(topic, "OFF")
<paho.mqtt.client.MQTTMessageInfo object at 0x0222A330>

>>> client.publish(topic, "FOO")
<paho.mqtt.client.MQTTMessageInfo object at 0x0221C750>

Se controlliamo la shell dove abbiamo lanciato l’app monitor.py, troveremo i messaggi di log ricevuti
grazie alla callback on_message:

(venv) C:\tmp>python monitor.py
connecting b'Mqtt Monitor' to broker
subscribing b'Mqtt Monitor' to topic 'bancaldo/test/monitor'...
[DEBUG] received message = ON
[DEBUG] received message = OFF
[DEBUG] received message = FOO
Categorie:iot, mqtt, python, wxPython Tag:, , ,

Lista Calciatori Gazzetta 2018-2019: giornata 19

dicembre 31, 2018 Lascia un commento

tutte i file sono compatibili con Fantalight, FantaLega e
FantaStat 2.0

link files in formato txt scaricabili

tutte le giornate

100|ARESTI|CAG|0.0|0.0|1
101|AUDERO|SAM|5.0|7.0|16
102|BARDI|FRO|0.0|0.0|1
103|BELEC|SAM|0.0|0.0|1
104|BERISHA E.|ATA|5.0|7.0|16
105|BERNI|INT|0.0|0.0|1
106|CONSIGLI|SAS|-1.0|5.0|12
107|CONTINI|NAP|0.0|0.0|1
108|CRAGNO|CAG|8.0|7.0|20
109|DA COSTA|BOL|0.0|0.0|1
110|DAGA|CAG|0.0|0.0|1
111|DINI|PAR|0.0|0.0|1
112|DONNARUMMA G.|MIL|6.0|7.0|19
113|DONNARUMMA A.|MIL|0.0|0.0|1
114|DRAGOWSKI|FIO|0.0|0.0|3
115|FALCONE|SAM|0.0|0.0|1
116|FRATTALI|PAR|0.0|0.0|1
117|FUZATO|ROM|0.0|0.0|1
118|GASPARINI|UDI|0.0|0.0|1
119|GIACOMEL|EMP|0.0|0.0|1
120|GOLLINI|ATA|0.0|0.0|5
121|GOMIS|SPA|4.0|6.0|12
122|GUERRIERI|LAZ|0.0|0.0|1
123|HANDANOVIC|INT|6.5|6.5|22
124|ICHAZO|TOR|0.0|0.0|4
125|KARNEZIS|NAP|0.0|0.0|10
126|LAFONT|FIO|6.5|6.5|16
127|MARCHETTI|GEN|0.0|0.0|8
128|MERET|NAP|4.0|6.0|11
129|MILINKOVIC V.|SPA|0.0|0.0|6
130|MIRANTE|ROM|0.0|0.0|2
131|MUSSO|UDI|6.0|6.0|12
132|PADELLI|INT|0.0|0.0|1
133|PAVONI|CHI|0.0|0.0|1
134|PEGOLO|SAS|0.0|0.0|1
135|PERIN|JUV|4.0|5.0|6
136|PINSOGLIO|JUV|0.0|0.0|1
137|PLIZZARI|MIL|0.0|0.0|1
138|POLUZZI|SPA|0.0|0.0|1
139|PROTO|LAZ|0.0|0.0|1
140|PROVEDEL|EMP|5.0|6.0|5
141|RADU I.|GEN|6.5|6.5|10
142|RADUNOVIC|ATA|0.0|0.0|1
143|RAFAEL A.|CAG|0.0|0.0|1
144|REINA|MIL|0.0|0.0|3
145|ROSATI|TOR|0.0|0.0|1
146|ROSSI F.|ATA|0.0|0.0|1
147|SANTURRO|BOL|0.0|0.0|1
148|SATALINO|SAS|0.0|0.0|1
149|SCUFFET|UDI|0.0|0.0|6
150|SECULIN|CHI|0.0|0.0|2
151|SEPE|PAR|4.5|6.5|16
152|SIRIGU|TOR|5.0|6.0|20
153|SKORUPSKI|BOL|3.0|6.0|13
154|SORRENTINO|CHI|7.0|7.0|17
155|SPORTIELLO|FRO|5.0|6.0|12
156|STRAKOSHA|LAZ|5.0|6.0|17
157|SZCZESNY|JUV|0.0|0.0|23
158|TERRACCIANO|EMP|0.0|0.0|6
159|TOZZO|SAM|0.0|0.0|1
160|VIGORITO|FRO|0.0|0.0|1
161|VODISEK|GEN|0.0|0.0|1
162|ZACCAGNO|TOR|0.0|0.0|1
163|RAFAEL|SAM|0.0|0.0|1
164|OLSEN|ROM|6.5|6.5|17
165|FULIGNATI|EMP|0.0|0.0|1
166|NICOLAS|UDI|0.0|0.0|1
167|IACOBUCCI|FRO|0.0|0.0|1
168|SEMPER|CHI|0.0|0.0|1
169|BAGHERIA|PAR|0.0|0.0|1
170|OSPINA|NAP|0.0|0.0|8
171|GHIDOTTI|FIO|0.0|0.0|1
200|ABATE|MIL|6.0|6.0|6
201|ACERBI|LAZ|6.5|6.5|20
202|ADJAPONG|SAS|0.0|0.0|6
203|ADNAN|ATA|0.0|0.0|4
204|ALBIOL|NAP|5.0|5.0|14
205|ALEX SANDRO|JUV|5.0|5.0|19
206|ALVES|PAR|6.0|6.0|13
207|ANDERSEN|SAM|0.0|0.0|9
208|ANDREOLLI|CAG|0.0|0.0|4
209|ANGELLA|UDI|0.0|0.0|3
210|ANSALDI|TOR|6.5|6.5|10
211|ANTONELLI|EMP|5.5|5.5|6
212|ARIAUDO|FRO|0.0|0.0|5
213|ASAMOAH|INT|6.5|6.5|9
214|BANI|CHI|6.0|6.5|6
215|BARZAGLI|JUV|0.0|0.0|5
216|BASTA|LAZ|0.0|0.0|4
217|BASTONI|PAR|6.5|6.5|6
218|BASTOS|LAZ|0.0|0.0|7
219|BENATIA|JUV|0.0|0.0|12
220|BERESZYNSKI|SAM|0.0|0.0|7
221|BETTELLA|ATA|0.0|0.0|1
222|BIANDA|ROM|0.0|0.0|2
223|BIRAGHI|FIO|5.5|6.0|12
224|BIRASCHI|GEN|6.5|6.5|8
225|BONIFAZI|SPA|5.5|5.5|7
226|BONUCCI|JUV|0.0|0.0|16
227|BREMER|TOR|0.0|0.0|4
228|BRIGHENTI|FRO|0.0|0.0|3
229|BRIGNANI|BOL|0.0|0.0|1
230|CACCIATORE|CHI|0.0|0.0|7
231|CACERES|LAZ|0.0|0.0|8
232|CALABRESI|BOL|0.0|0.0|6
233|CALABRIA|MIL|6.5|6.5|10
234|CALDARA|MIL|0.0|0.0|12
235|CANCELO|JUV|0.0|0.0|19
236|CAPUANO|FRO|3.5|4.5|4
237|CASTAGNE|ATA|6.0|6.5|9
238|CECCHERINI|FIO|5.5|5.5|5
239|CEPPITELLI|CAG|4.0|5.0|7
240|CESAR|CHI|0.0|0.0|3
241|CHIELLINI|JUV|7.0|7.0|19
242|CHIRICHES|NAP|0.0|0.0|4
243|CIOFANI M.|FRO|0.0|0.0|5
244|CIONEK|SPA|5.5|5.5|6
245|COLLEY|SAM|6.0|6.0|8
246|CONTI|MIL|0.0|0.0|9
247|COSTA|SPA|5.5|5.5|6
248|CREMONESI|SPA|0.0|0.0|3
249|CRISCITO|GEN|6.0|6.0|12
250|D'AMBROSIO|INT|0.0|0.0|13
251|DALBERT|INT|0.0|0.0|6
252|DANILO|BOL|10.5|6.0|9
253|DE MAIO|BOL|4.5|5.0|5
254|DE SCIGLIO|JUV|6.5|6.5|9
255|DE SILVESTRI|TOR|6.0|6.0|18
256|DE VRIJ|INT|6.0|6.0|21
257|DELL'ORCO|SAS|0.0|0.0|4
258|DI CESARE|PAR|0.0|0.0|5
259|DI LORENZO|EMP|0.0|0.0|8
260|DICKMANN|SPA|5.0|5.0|4
261|DIJKS|BOL|6.0|6.0|6
262|DIKS|FIO|0.0|0.0|4
263|DIMARCO|PAR|0.0|0.0|6
264|DURMISI|LAZ|0.0|0.0|5
265|EL YAMIQ|GEN|0.0|0.0|4
266|FARAGO'|CAG|6.0|6.0|8
267|FAZIO|ROM|6.0|6.0|17
268|FELIPE|SPA|6.5|6.5|7
269|FERRARI G.|SAS|0.0|0.0|15
270|FERRARI A.|SAM|5.5|6.0|4
271|FLORENZI|ROM|6.0|6.0|18
272|GAGLIOLO|PAR|5.0|5.0|8
273|GAZZOLA|PAR|0.0|0.0|5
274|GHIGLIONE|FRO|5.5|5.5|2
275|GHOULAM|NAP|6.0|6.0|11
276|GOBBI|PAR|0.0|0.0|5
277|GOLDANIGA|FRO|6.0|6.0|7
278|GOMEZ|MIL|0.0|0.0|3
279|GONZALEZ|BOL|0.0|0.0|5
280|GOSENS|ATA|0.0|0.0|10
281|GUNTER|GEN|0.0|0.0|4
282|HANCKO|FIO|0.0|0.0|4
283|HATEBOER|ATA|6.5|6.5|15
284|HELANDER|BOL|5.5|5.5|5
285|HEURTAUX|UDI|0.0|0.0|4
286|HRISTOV|FIO|0.0|0.0|2
287|HYSAJ|NAP|0.0|0.0|10
288|IACOPONI|PAR|5.5|5.5|7
289|IMPERIALE|EMP|0.0|0.0|1
290|IZZO|TOR|6.0|6.5|13
291|JAROSZYNSKI|CHI|0.0|0.0|4
292|JUAN JESUS|ROM|6.0|6.0|8
293|KARSDORP|ROM|0.0|0.0|4
294|KOLAROV|ROM|5.5|6.0|24
295|KONATE'|SPA|0.0|0.0|4
296|KOULIBALY|NAP|0.0|0.0|19
297|KRAFTH|BOL|0.0|0.0|4
298|KRAJNC|FRO|0.0|0.0|3
299|LAKICEVIC|GEN|0.0|0.0|4
300|STRYGER LARSEN|UDI|7.5|7.0|10
301|LAURINI|FIO|5.5|5.5|4
302|LEMOS|SAS|0.0|0.0|5
303|LETSCHERT|SAS|0.0|0.0|3
304|LEVERBE|SAM|0.0|0.0|1
305|LIROLA|SAS|4.5|4.5|10
306|LUIZ FELIPE|LAZ|6.0|6.5|9
307|LUPERTO|NAP|0.0|0.0|4
308|LYANCO|TOR|0.0|0.0|4
309|LYKOGIANNIS|CAG|0.0|0.0|6
310|MAIETTA|EMP|0.0|0.0|5
311|MAKSIMOVIC|NAP|5.5|5.5|6
312|MANCINI|ATA|11.5|7.0|17
313|MANOLAS|ROM|6.0|6.0|17
314|MARCANO|ROM|0.0|0.0|8
315|MARCHIZZA|SAS|0.0|0.0|2
316|MARCJANIK|EMP|0.0|0.0|4
317|MARIO RUI|NAP|6.0|6.0|9
318|MARUSIC|LAZ|4.0|5.0|12
319|MASIELLO|ATA|0.0|0.0|11
320|MBAYE|BOL|0.0|0.0|9
321|MILENKOVIC|FIO|6.5|6.5|13
322|MIRANDA|INT|0.0|0.0|8
323|MOLINARO|FRO|0.0|0.0|4
324|MORETTI|TOR|6.0|6.0|7
325|MURRU|SAM|5.5|5.5|10
326|MUSACCHIO|MIL|0.0|0.0|6
327|NKOULOU|TOR|6.5|6.5|18
328|NUYTINCK|UDI|6.0|6.5|8
329|OLIVERA|FIO|0.0|0.0|3
330|OPOKU|UDI|7.0|7.0|4
331|PAJAC|CAG|5.5|5.5|5
332|PALOMINO|ATA|8.0|7.0|11
333|PASQUAL|EMP|6.0|6.0|12
334|PAZ|BOL|0.0|0.0|4
335|PELLEGRINI LU.|ROM|0.0|0.0|2
336|PELUSO|SAS|4.5|4.5|4
337|PEREIRA|GEN|0.0|0.0|5
338|PEZZELLA GE.|FIO|6.5|6.5|14
339|PEZZELLA GI.|UDI|0.0|0.0|4
340|PISACANE|CAG|5.0|5.0|6
341|POLVANI|EMP|0.0|0.0|2
342|RADU S.|LAZ|6.0|6.0|9
343|RANOCCHIA|INT|0.0|0.0|4
344|RASMUSSEN|EMP|5.5|5.5|4
345|RECA|ATA|0.0|0.0|4
346|REGINI|SAM|0.0|0.0|4
347|RODRIGUEZ R.|MIL|6.0|6.0|12
348|ROGERIO|SAS|4.5|4.5|6
349|ROLANDO|SAM|0.0|0.0|3
350|ROMAGNA|CAG|5.5|5.5|8
351|ROMAGNOLI A.|MIL|5.5|5.5|16
352|ROMAGNOLI S.|EMP|0.0|0.0|3
353|ROSSETTINI|CHI|6.0|6.0|5
354|RUGANI|JUV|5.5|6.0|8
355|RUSSO|FRO|0.0|0.0|2
356|SALA|SAM|5.0|5.0|5
357|SALAMON|FRO|5.5|5.5|4
358|SAMIR|UDI|0.0|0.0|7
359|SANTON|ROM|0.0|0.0|6
360|SCAGLIA|PAR|0.0|0.0|4
361|SERNICOLA|SAS|0.0|0.0|1
362|SIMIC|MIL|0.0|0.0|2
363|SKRINIAR|INT|6.5|6.5|17
364|SPINAZZOLA|JUV|0.0|0.0|4
365|SPOLLI|GEN|0.0|0.0|4
366|SRNA|CAG|4.5|4.5|11
367|STRINIC|MIL|0.0|0.0|4
368|TANASIJEVIC|CHI|0.0|0.0|1
369|TAVARES|SAM|0.0|0.0|4
370|TER AVEST|UDI|0.0|0.0|6
371|TERRANOVA|FRO|0.0|0.0|6
372|TOLOI|ATA|7.5|6.5|11
373|TOMOVIC|CHI|6.0|6.0|7
374|TONELLI|SAM|0.0|0.0|9
375|UNTERSEE|EMP|6.0|6.0|4
376|VAISANEN|SPA|0.0|0.0|3
377|VALJENT|CHI|0.0|0.0|3
378|VARNIER|ATA|0.0|0.0|4
379|VENUTI|FIO|0.0|0.0|4
380|VESELI|EMP|5.0|5.0|4
381|VICARI|SPA|6.0|6.0|9
382|VITOR HUGO|FIO|0.0|0.0|8
383|WAGUE|UDI|0.0|0.0|4
384|WALLACE|LAZ|5.0|5.0|4
385|ZAPATA C.|MIL|6.0|6.5|7
386|ZUKANOVIC|GEN|0.0|0.0|5
387|SIERRALTA|PAR|0.0|0.0|2
388|PATRIC|LAZ|0.0|0.0|6
389|MATTIELLO|BOL|6.0|6.0|8
390|DJOUROU|SPA|0.0|0.0|7
391|TRIPALDELLI|SAS|0.0|0.0|1
392|LUKAKU|LAZ|0.0|0.0|7
393|MAGNANI|SAS|5.5|4.5|6
394|GILLEKENS|FIO|0.0|0.0|1
395|GABBIA|MIL|0.0|0.0|1
396|BELLANOVA|MIL|0.0|0.0|1
397|VRSALJKO|INT|7.0|6.0|12
398|LOPEZ|GEN|0.0|0.0|4
399|SILVESTRE|EMP|6.0|6.0|11
400|MALCUIT|NAP|6.5|6.0|9
401|ANDERSON|LAZ|0.0|0.0|4
402|FERIGRA|TOR|0.0|0.0|1
403|CORBO|BOL|0.0|0.0|1
404|BARBA|CHI|6.0|6.0|6
405|AINA|TOR|0.0|0.0|9
406|DJIDJI|TOR|6.5|7.0|9
407|ZAMPANO|FRO|0.0|0.0|8
408|SIMIC|SPA|0.0|0.0|4
409|MARLON|SAS|5.0|5.0|9
410|DJIMSITI|ATA|6.0|6.0|6
411|TROOST-EKONG|UDI|6.5|6.5|10
412|VERGARA|CAG|0.0|0.0|2
413|SALVI|SPA|0.0|0.0|1
414|FERRARESI|SAS|0.0|0.0|1
415|KLAVAN|CAG|0.0|0.0|8
416|RIGIONE|CHI|0.0|0.0|2
417|ROMERO|GEN|6.0|6.0|6
418|DI MAGGIO|PAR|0.0|0.0|1
500|ACQUAH|EMP|5.5|5.5|7
501|ALLAN|NAP|5.5|6.0|18
503|BADU|UDI|0.0|0.0|4
504|BALIC|UDI|0.0|0.0|4
505|BANDINELLI|SAS|0.0|0.0|3
506|BARAK|UDI|0.0|0.0|15
507|BARELLA|CAG|5.5|5.5|17
508|BARILLA'|PAR|5.5|6.0|10
509|BARRETO|SAM|0.0|0.0|8
510|BASELLI|TOR|6.0|6.0|19
511|BAUMGARTNER|SAM|0.0|0.0|1
512|BEGHETTO|FRO|5.0|5.5|6
513|BEHRAMI|UDI|10.5|6.5|9
514|BENASSI|FIO|5.5|5.5|21
515|BENNACER|EMP|5.5|6.0|10
516|BENTANCUR|JUV|0.0|0.0|12
517|BERENGUER|TOR|0.0|0.0|11
518|BERISHA V.|LAZ|0.0|0.0|10
519|BERNARDESCHI|JUV|6.0|6.0|19
520|BERTOLACCI|MIL|0.0|0.0|5
521|BESEA|FRO|0.0|0.0|2
522|BESSA|GEN|6.5|6.5|15
523|BIGLIA|MIL|0.0|0.0|12
524|BIRSA|CHI|6.0|6.0|15
525|BOATENG|SAS|6.5|5.5|20
526|BONAVENTURA|MIL|0.0|0.0|24
527|BORINI|MIL|0.0|0.0|8
528|BORJA VALERO|INT|6.0|6.0|9
529|BOURABIA|SAS|5.0|5.0|9
530|BRIGHI|EMP|0.0|0.0|4
531|BROZOVIC|INT|0.0|0.0|18
532|CALHANOGLU|MIL|7.0|6.0|16
533|CALIGARA|CAG|0.0|0.0|1
534|CALLEGARI|GEN|0.0|0.0|1
535|EMRE CAN|JUV|6.0|6.0|17
536|CANDREVA|INT|0.0|0.0|14
537|CAPEZZI|EMP|0.0|0.0|5
538|CASSATA|FRO|0.0|0.0|6
539|CASTRO|CAG|0.0|0.0|17
540|CATALDI|LAZ|0.0|0.0|8
541|CHIBSAH|FRO|6.0|6.0|9
542|CHIESA|FIO|7.0|7.0|24
543|CIGARINI|CAG|0.0|0.0|9
544|COLOMBATTO|CAG|0.0|0.0|3
545|CORIC|ROM|0.0|0.0|6
546|COULIBALY|UDI|0.0|0.0|3
547|CRISETIG|FRO|5.0|5.5|4
548|CRISTANTE|ROM|10.5|6.5|26
549|CRISTOFORO|FIO|0.0|0.0|3
550|CUADRADO|JUV|0.0|0.0|20
551|D'ALESSANDRO|UDI|7.0|7.0|8
552|DABO|FIO|0.0|0.0|11
553|DE PAUL|UDI|0.0|0.0|20
554|DE ROON|ATA|0.0|0.0|15
555|DE ROSSI|ROM|0.0|0.0|12
556|DEIOLA|PAR|6.0|6.0|5
557|DE PAOLI|CHI|6.5|6.5|7
558|DESSENA|CAG|0.0|0.0|5
559|DEZI|PAR|0.0|0.0|4
560|DI GENNARO|LAZ|0.0|0.0|3
561|DIAWARA|NAP|0.0|0.0|8
562|DJURICIC|SAS|0.0|0.0|10
563|DONSAH|BOL|0.0|0.0|4
564|DOUGLAS COSTA|JUV|0.0|0.0|21
565|DUNCAN|SAS|14.5|6.5|18
566|DZEMAILI|BOL|0.0|0.0|9
567|EMMERS|INT|0.0|0.0|1
568|EVANGELISTA|UDI|0.0|0.0|5
569|EVERTON LUIZ|SPA|0.0|0.0|4
570|EYSSERIC|FIO|0.0|0.0|10
571|FARES|SPA|6.0|6.0|7
572|FOFANA|UDI|6.0|6.0|12
573|FRATTESI|SAS|0.0|0.0|1
574|FREDIANI|PAR|0.0|0.0|1
575|FREULER|ATA|7.0|7.0|19
576|GAGLIARDINI|INT|0.0|0.0|13
577|GARRITANO|CHI|0.0|0.0|5
578|GAUDINO|CHI|0.0|0.0|4
579|GERSON|FIO|0.0|0.0|8
580|GIACCHERINI|CHI|10.0|7.0|18
581|GIORNO|PAR|0.0|0.0|1
582|GONALONS|ROM|0.0|0.0|6
583|GORI|FRO|0.0|0.0|4
584|GRASSI|PAR|0.0|0.0|9
585|HAAS|ATA|0.0|0.0|3
586|HALILOVIC|MIL|0.0|0.0|4
587|HALLFREDSSON|FRO|0.0|0.0|4
588|HAMSIK|NAP|0.0|0.0|19
589|HETEMAJ|CHI|6.0|6.0|9
590|HILJEMARK|GEN|5.0|5.0|11
591|INGELSSON|UDI|0.0|0.0|3
592|IONITA|CAG|5.0|5.0|13
593|JANKTO|SAM|0.0|0.0|13
594|JOAO PEDRO|CAG|5.0|5.0|21
595|KATUMA|SPA|0.0|0.0|1
596|KESSIE'|MIL|6.0|6.0|19
597|KHEDIRA|JUV|0.0|0.0|21
598|KINGSLEY|BOL|0.0|0.0|1
599|KIYINE|CHI|0.0|0.0|6
600|KONE'|FRO|0.0|0.0|4
601|KREJCI|BOL|0.0|0.0|5
602|KRUNIC|EMP|0.0|0.0|17
603|KULUSEVSKI|ATA|0.0|0.0|1
604|KURTIC|SPA|4.5|5.0|15
605|LAXALT|MIL|0.0|0.0|10
606|LAZOVIC|GEN|5.0|5.5|10
607|LAZZARI|SPA|0.0|0.0|18
608|LEIVA|LAZ|7.0|6.5|15
609|LINETTY|SAM|6.0|6.0|13
610|LJAJIC|TOR|0.0|0.0|22
611|LOCATELLI|SAS|5.5|5.5|7
612|LOLLO|EMP|0.0|0.0|4
613|LUKIC|TOR|5.5|6.0|5
614|LULIC|LAZ|6.0|6.0|19
615|MAGNANELLI|SAS|0.0|0.0|8
616|MAIELLO|FRO|5.5|5.5|6
617|MANDRAGORA|UDI|5.0|6.0|12
618|MARCHISIO|JUV|0.0|0.0|6
619|MATUIDI|JUV|6.0|6.5|18
620|MAURI|MIL|0.0|0.0|4
621|MAZZITELLI|GEN|0.0|0.0|6
622|MEITE|TOR|4.0|5.0|11
623|MILINKOVIC S.|LAZ|11.5|7.5|24
624|MINALA|LAZ|0.0|0.0|4
625|MISSIROLI|SPA|5.5|5.5|9
626|MONTOLIVO|MIL|0.0|0.0|4
627|MURGIA|LAZ|0.0|0.0|4
628|NAGY|BOL|5.5|0.0|4
629|NAINGGOLAN|INT|6.0|6.0|23
630|OBI|CHI|0.0|0.0|12
631|OMEONGA|GEN|0.0|0.0|4
632|PADOIN|CAG|0.0|0.0|8
633|PAGANINI|FRO|0.0|0.0|4
634|PARIGINI|TOR|0.0|0.0|6
635|PAROLO|LAZ|6.0|6.0|20
636|PASTORE|ROM|0.0|0.0|23
637|PELLEGRINI LO.|ROM|7.5|6.5|18
638|PERISIC|INT|0.0|0.0|22
639|PEROTTI|ROM|0.0|0.0|18
640|PESSINA|ATA|0.0|0.0|4
641|PJANIC|JUV|6.0|6.0|20
642|POLI|BOL|6.5|6.5|13
643|PONTISSO|UDI|0.0|0.0|1
644|PRAET|SAM|6.5|6.5|15
645|PULGAR|BOL|7.0|6.5|8
646|RADOVANOVIC|CHI|5.0|5.5|8
647|RAMIREZ|SAM|5.5|5.5|21
648|RICCARDI|ROM|0.0|0.0|1
649|RIGONI L.|PAR|0.0|0.0|10
650|RIGONI N.|CHI|0.0|0.0|5
651|RINCON|TOR|6.0|6.5|11
652|RIZZO|BOL|0.0|0.0|4
653|ROG|NAP|0.0|0.0|8
654|ROMULO|GEN|6.0|6.0|13
655|RUIZ|NAP|6.0|6.0|19
656|SAMMARCO|FRO|0.0|0.0|4
657|SANCHEZ|FIO|0.0|0.0|5
658|SANDRO|GEN|0.0|0.0|11
659|SAPONARA|SAM|6.5|7.0|15
660|SCAVONE|PAR|0.0|0.0|6
661|SCHETINO|FIO|0.0|0.0|2
662|SCHIATTARELLA|SPA|5.5|6.0|10
663|SCOZZARELLA|PAR|0.0|0.0|7
664|SENSI|SAS|5.0|5.5|11
665|SODDIMO|FRO|0.0|0.0|6
666|STIJEPOVIC|SAM|0.0|0.0|1
667|STROOTMAN|ROM|0.0|0.0|13
668|STULAC|PAR|6.5|6.5|11
669|STURARO|JUV|0.0|0.0|4
670|SVANBERG|BOL|5.0|5.0|6
671|TESSIORE|SAM|0.0|0.0|1
672|TRAORE'|EMP|6.5|6.5|9
673|VALDIFIORI|SPA|5.5|5.5|6
674|VALENCIA|BOL|0.0|0.0|2
675|VALOTI|SPA|0.0|0.0|8
676|VALZANIA|ATA|0.0|0.0|4
677|VECINO|INT|5.0|5.0|11
678|VERETOUT|FIO|5.0|5.0|21
679|VERRE|SAM|0.0|0.0|4
680|VIGNATO|CHI|0.0|0.0|1
681|VITALE|SPA|0.0|0.0|2
682|VIVIANI|SPA|0.0|0.0|5
683|YOUNES|NAP|0.0|0.0|7
684|ZAJC|EMP|6.0|6.0|16
685|ZANIOLO|ROM|5.5|5.5|6
686|ZIELINSKI|NAP|5.0|5.0|18
687|UNDER|ROM|12.0|7.5|25
688|PEETERS|SAM|0.0|0.0|1
689|NORGAARD|FIO|5.5|5.5|5
690|NETO|LAZ|0.0|0.0|1
691|JORDAO|LAZ|0.0|0.0|1
692|JOAO MARIO|INT|6.0|6.0|13
693|PASALIC|ATA|6.0|6.0|13
694|BRADARIC|CAG|5.0|5.5|8
695|CORREA|LAZ|5.0|5.5|18
696|BADELJ|LAZ|0.0|0.0|9
697|VIEIRA|SAM|0.0|0.0|7
698|NIKOLIC|SPA|0.0|0.0|1
699|ROLON|GEN|5.5|5.5|4
700|FURLAN|SAM|0.0|0.0|5
701|FERNANDES|FIO|6.0|6.0|7
702|EKDAL|SAM|6.5|6.5|11
703|CARRIERO|PAR|0.0|0.0|1
704|NZONZI|ROM|5.5|5.5|12
705|VLOET|FRO|0.0|0.0|6
706|BAKAYOKO|MIL|6.5|6.5|11
707|CASTILLEJO|MIL|9.5|6.5|16
708|BURRUCHAGA|CHI|0.0|0.0|1
709|ESPOSITO|SPA|0.0|0.0|1
710|RIGONI E.|ATA|0.0|0.0|15
711|COLPANI|ATA|0.0|0.0|1
712|SORIANO|TOR|0.0|0.0|13
713|UCAN|EMP|0.0|0.0|7
714|MUNARI|PAR|0.0|0.0|4
715|MONTIEL|FIO|0.0|0.0|1
716|ARAMU|TOR|0.0|0.0|3
717|ERRICO|FRO|0.0|0.0|1
718|VELOSO|GEN|6.0|6.0|7
800|ANDRE' SILVA|MIL|0.0|0.0|15
801|ANTENUCCI|SPA|5.0|5.0|16
802|ASENCIO|GEN|0.0|0.0|7
803|AVENATTI|BOL|0.0|0.0|5
804|BABACAR|SAS|0.0|0.0|21
805|BACCA|MIL|0.0|0.0|16
806|BAEZ|FIO|0.0|0.0|3
807|BARAYE|PAR|0.0|0.0|4
808|BARROW|ATA|6.5|6.5|11
809|BELOTTI|TOR|9.5|6.5|30
810|BERARDI|SAS|5.0|5.0|19
811|BUTIC|TOR|0.0|0.0|3
812|CAICEDO|LAZ|0.0|0.0|11
813|CALAIO'|PAR|0.0|0.0|5
814|CALLEJON|NAP|5.5|5.5|22
815|CAPRARI|SAM|5.5|5.5|18
816|CAPUTO|EMP|5.5|5.5|25
817|CERAVOLO|PAR|5.5|5.5|11
818|CERRI|CAG|5.5|5.5|10
819|CIANO|FRO|5.5|6.0|17
820|CICIRETTI|PAR|0.0|0.0|8
821|CIOFANI D.|FRO|0.0|0.0|13
822|CITRO|FRO|0.0|0.0|7
823|COLIDIO|INT|0.0|0.0|1
824|CORNELIUS|ATA|0.0|0.0|8
825|CUTRONE|MIL|6.0|6.0|21
826|DA CRUZ|PAR|0.0|0.0|4
827|DAMASCAN|TOR|0.0|0.0|4
828|DEFREL|SAM|5.5|5.5|18
829|DESTRO|BOL|0.0|0.0|12
830|DI FRANCESCO|SAS|5.0|5.0|14
831|DI GAUDIO|PAR|0.0|0.0|10
832|DIONISI|FRO|0.0|0.0|6
833|DJORDJEVIC|CHI|5.5|5.5|11
834|DYBALA|JUV|7.0|7.0|29
835|DZEKO|ROM|5.5|5.5|25
836|EDERA|TOR|0.0|0.0|6
837|EL SHAARAWY|ROM|0.0|0.0|25
838|EWANDRO|UDI|0.0|0.0|4
839|FALCINELLI|BOL|5.5|5.5|11
840|FALLETTI|BOL|0.0|0.0|8
841|FANTACCI|EMP|0.0|0.0|1
842|FARIAS|CAG|4.5|5.0|13
843|FAVILLI|GEN|0.0|0.0|6
844|FINOTTO|SPA|0.0|0.0|5
845|FLOCCARI|SPA|0.0|0.0|6
846|GALABINOV|GEN|0.0|0.0|8
847|GALUPPINI|PAR|0.0|0.0|1
848|GIANNETTI|CAG|0.0|0.0|5
849|GOMEZ A.|ATA|13.0|7.5|27
850|GRAICIAR|FIO|0.0|0.0|4
851|HAN|CAG|0.0|0.0|11
852|HIGUAIN|MIL|9.5|6.5|29
853|IAGO|TOR|6.0|6.0|28
854|ICARDI|INT|5.5|5.5|40
855|ILICIC|ATA|18.5|8.0|29
856|IMMOBILE|LAZ|5.5|5.5|37
857|INGLESE|PAR|0.0|0.0|21
858|INSIGNE R.|NAP|0.0|0.0|5
859|INSIGNE L.|NAP|0.0|0.0|31
860|JAKUPOVIC|EMP|0.0|0.0|2
861|KALINIC|MIL|0.0|0.0|13
862|KARAMOH|INT|0.0|0.0|12
863|KLUIVERT|ROM|6.5|6.5|20
864|KOUAME|GEN|5.5|5.5|18
865|KOWNACKI|SAM|0.0|0.0|12
866|LA GUMINA|EMP|6.0|0.0|14
867|LAPADULA|GEN|0.0|0.0|9
868|LASAGNA|UDI|2.5|5.5|18
869|LERIS|CHI|0.0|0.0|4
870|LOMBARDI|LAZ|0.0|0.0|3
871|LUIS ALBERTO|LAZ|6.0|6.5|23
872|MACHIS|UDI|0.0|0.0|7
873|MALLE|UDI|0.0|0.0|2
874|MANDZUKIC|JUV|6.0|6.0|28
875|MARTINEZ|INT|5.0|5.5|23
876|MATARESE|FRO|0.0|0.0|2
877|MATRI|SAS|5.0|5.0|10
878|MCHEDLIDZE|EMP|0.0|0.0|5
879|MEDEIROS|GEN|0.0|0.0|10
880|MEGGIORINI|CHI|0.0|0.0|9
881|MERTENS|NAP|10.0|6.5|37
882|MICIN|UDI|0.0|0.0|4
883|MILIK|NAP|13.0|7.0|34
884|MRAZ|EMP|0.0|0.0|8
885|MURANO|SPA|0.0|0.0|2
886|NIANG|TOR|0.0|0.0|13
887|ODGAARD|SAS|0.0|0.0|1
888|OKWONKWO|BOL|0.0|0.0|7
889|ORSOLINI|BOL|0.0|0.0|14
890|OUNAS|NAP|0.0|0.0|11
891|PALACIO|BOL|7.5|6.5|14
892|PALOSCHI|SPA|0.0|0.0|15
893|PANDEV|GEN|0.0|0.0|15
894|PAVOLETTI|CAG|0.0|0.0|26
895|PELLISSIER|CHI|5.5|6.0|14
896|PERICA|FRO|0.0|0.0|6
897|PETAGNA|SPA|10.0|7.0|18
898|PETKOVIC|BOL|0.0|0.0|7
899|PIATEK|GEN|5.5|6.0|28
900|PJACA|FIO|0.0|0.0|12
901|POLITANO|INT|6.0|6.0|20
902|PUCCIARELLI|CHI|0.0|0.0|5
903|PUSSETTO|UDI|11.5|7.5|17
904|QUAGLIARELLA|SAM|9.5|6.5|39
905|RODRIGUEZ A.|EMP|0.0|0.0|4
906|RONALDO|JUV|13.5|7.5|59
907|SALCEDO|INT|0.0|0.0|1
908|SANTANDER|BOL|9.5|6.5|18
909|SAU|CAG|5.5|5.5|11
910|SCAMACCA|SAS|0.0|0.0|3
911|SCHICK|ROM|0.0|0.0|16
912|SILIGARDI|PAR|5.5|5.5|9
913|SIMEONE|FIO|5.5|5.5|20
914|SOTTIL|FIO|0.0|0.0|1
915|SPINELLI|GEN|0.0|0.0|10
916|SPROCATI|PAR|5.5|5.5|4
917|STEPINSKI|CHI|6.5|6.5|15
918|SUSO|MIL|4.0|5.0|24
919|THEREAU|FIO|0.0|0.0|10
920|TROTTA|SAS|0.0|0.0|6
921|TUMMINELLO|ATA|0.0|0.0|4
922|VERDE|ROM|0.0|0.0|8
923|VERDI|NAP|6.0|6.0|18
924|VINICIUS|NAP|0.0|0.0|3
925|VIZEU|UDI|0.0|0.0|9
926|VLAHOVIC|FIO|0.0|0.0|2
927|ZANIMACCHIA|GEN|0.0|0.0|1
928|ZAPATA D.|ATA|9.5|7.0|34
929|ZEKHNINI|FIO|0.0|0.0|2
930|BOGA|SAS|0.0|0.0|10
931|ROSSI A.|LAZ|0.0|0.0|4
932|MONCINI|SPA|0.0|0.0|4
933|KEAN|JUV|0.0|0.0|4
934|PINAMONTI|FRO|5.0|5.5|8
935|BRIGNOLA|SAS|0.0|0.0|9
936|GALANO|PAR|0.0|0.0|12
937|BIABIANY|PAR|5.5|5.5|9
938|DAL MONTE|GEN|0.0|0.0|4
939|MIRALLAS|FIO|6.0|6.0|16
940|KEITA|INT|10.5|7.0|24
941|CAMPBELL|FRO|0.0|0.0|9
942|GERVINHO|PAR|5.5|5.5|22
943|ZAZA|TOR|0.0|0.0|15
944|TEODORCZYK|UDI|0.0|0.0|13
945|ARDAIZ|FRO|0.0|0.0|4
946|GRUBAC|CHI|0.0|0.0|1
947|JUWARA|CHI|0.0|0.0|1
948|MASTAJ|PAR|0.0|0.0|1
Categorie:Fantacalcio, FantaLega

Fantalega 2018-2019: giornata 18

dicembre 31, 2018 9 commenti

tutte le giornate

Classifica lega

Squadre pts pG pV pN pP gF gS d_g
Paul Dobbery Team 44 17 14 2 1 47 13 34
Nizzi 30 17 9 3 5 39 30 9
Me a san bulgnais 26 17 8 2 7 36 29 7
Centomega 25 17 7 4 6 40 28 12
Pilu x tutti 25 17 7 4 6 31 31 0
I siciliani 24 17 7 3 7 22 25 -3
L-team 21 17 6 3 8 30 34 -4
F.C. Pippino 19 17 5 4 8 18 28 -10
Schalke 051 13 17 3 4 10 14 35 -21
Double M 12 17 3 3 11 14 38 -24

lega
Giornata 18

Double M I siciliani
Centomega L-team
Schalke 051 F.C. Pippino
Me a san bulgnais Nizzi
Paul Dobbery Team Pilu x tutti

Punteggi
sono compresi nel totale i bonus del modificatore di difesa!

Nome pts Nome pts

Classifica coppa

Squadre pts pG pV pN pP gF gS d_g
Paul Dobbery Team 12 6 3 3 0 20 11 9
pilu x tutti 11 6 3 2 1 11 5 6
Me a san Bulgnais 11 6 3 2 1 10 6 4
Nizzi 10 6 2 4 0 14 9 5
Centomega 8 6 2 2 2 12 10 2
F.C. Pippino 7 6 2 1 3 5 11 -6
I siciliani 6 6 2 0 4 11 9 2
Double M 6 6 2 0 4 6 16 -10
schalke 051 6 6 2 0 4 4 9 -5
L-Team 4 6 0 4 2 7 14 -7

coppa
Giornata 7

Nizzi schalke 051
I siciliani Centomega
pilu x tutti Paul Dobbery Team
L-Team F.C. Pippino
Double M Me a san Bulgnais

Punteggi
sono compresi nel totale i bonus del modificatore di difesa!

Nome pts Nome pts

Categorie:Fantacalcio, FantaLega

Redis: primi passi

dicembre 28, 2018 Lascia un commento

Da wikipedia:
Redis è un key-value store open source residente in memoria con persistenza facoltativa.
Il nome Redis deriva da REmote DIctionary Server.

Alcuni punti cardine di Redis:

1. le chiavi (keys) sono stringhe che identificano parti di dati (values)
2. I valori sono gestiti da Redis come byte arrays. Redis non li gestisce, nel senso che non si effettueranno queries come si farebbe su un database tradizionale
3. Redis mette a disposizione 5 tipi di database con differenti strutture dati
4. Redis è molto veloce, mantiene tutti i dati in memoria, ma effettua una snapshot del database ogni tot secondi in funzione anche di quante chiavi sono state modificate.

Di default Redis salva il database su disco ogni 60 secondi, quando 1000 o più chiavi vengono modificate, oppure ogni 15 minuti quando al massimo 9 chiavi vengono modificate.

Gli eseguibili per windows, sono scaricabili sul sito ufficiale, o a questo indirizzo, dove è possibile trovare le versioni superiori alla 2.4.6.

Qualora si dovesse incorrere nell’errore Redis – ERR unknown command ‘EVAL’ sarà necessario installare una versione più recente del database, reperibile al secondo link.

per quel che riguarda windows, dal prompt dei comandi lanciare l’eseguibile redis-server:

C:\tmp\redis>redis-server.exe
[4696] 27 Dec 16:37:48.009 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server.exe /path/to/redis.conf
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.100 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4696
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

[4696] 27 Dec 16:37:48.009 # Server started, Redis version 3.2.100
[4696] 27 Dec 16:37:48.024 * DB loaded from disk: 0.016 seconds
[4696] 27 Dec 16:37:48.024 * The server is now ready to accept connections on port 6379

Come si evince, il server è in ascolto sulla porta 6379.
Da un altro prompt dei comandi possiamo lanciare l’eseguibile del client:

C:\tmp\redis>redis-cli.exe
127.0.0.1:6379>

Per vedere che tutto sia a posto, utilizziamo il comando PING e attendiamo la risposta del server

127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

Vediamo i comandi base, che possono essere reperiti sul sito ufficiale.

Databases

In Redis il database è identificato da un numero. Il database di default ha indice 0.
E’ possibile cambiare database con il comando SELECT

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>

Abbiamo detto che Redis è un key-value store. I value associati ad una determinata chiave, vengono gestiti da Redis
come byte-array.

Associazione di valori ad una chiave

Come settare una chiave con i relativi dati associati? Con il comando SET:

127.0.0.1:6379> set users:bancaldo '{"name": "bancaldo", "email": "bancaldo@example.com"}'
OK

Ottenere i valori di una chiave

Per ottenere i valori associati ad una determinata chiave si utilizza il comando GET:

127.0.0.1:6379> get users:bancaldo
"{\"name\": \"bancaldo\", \"email\": \"bancaldo@exxample.com\"}"

Comandi su stringa

Alcuni comandi sulla stringa ottenuta, ad esempio lunghezza della stringa con STRLEN:

127.0.0.1:6379> STRLEN users:bancaldo
(integer) 54

Ottenere una porzione di stringa con GETRANGE:

127.0.0.1:6379> GETRANGE users:bancaldo 30 54
"\"bancaldo@exxample.com\"}"

Per aggiungere dati alla stringa si utilizza APPEND:

127.0.0.1:6379> APPEND users:bancaldo " foo"
(integer) 58
127.0.0.1:6379> GETRANGE users:bancaldo 30 58
"\"bancaldo@exxample.com\"} foo"

Operazioni su Integer

Incrementiamo un valore da riga di comando:

127.0.0.1:6379> INCR users:bancaldo:money
(integer) 1
127.0.0.1:6379> INCR users:bancaldo:money
(integer) 2
127.0.0.1:6379> INCRBY users:bancaldo:money 1000
(integer) 1002
127.0.0.1:6379> DECR users:bancaldo:money
(integer) 1001
127.0.0.1:6379> DECRBY users:bancaldo:money 500
(integer) 501

Se utilizzo però il comando INCR su una stringa, otterrò giustamente un errore:

127.0.0.1:6379> INCR users:bancaldo
(error) ERR value is not an integer or out of range

Hashes

Gli Hashes sono come le stringhe, ma ci danno la possibilità di strutturare i valori con l’utilizzon dei campi.

127.0.0.1:6379> HSET users:mauro age 25
(integer) 1
127.0.0.1:6379> HSET users:mauro money 1000000
(integer) 1
127.0.0.1:6379> HGET users:mauro age
"25"
127.0.0.1:6379> HGET users:mauro money
"1000000"
127.0.0.1:6379>

Lists

In Redis le Lists sono liste di stringhe.

Per inserire un valore in testa ad una lista si utilizza LPUSH:

127.0.0.1:6379> LPUSH inter:difesa "HANDANOVIC"
(integer) 1

Per aggiungere un elemento in fondo alla lista si utilizza invece RPUSH.

I valori possono essere anche inseriti in gruppo e entreranno nella lista a seconda dell’ordine di inserimento

127.0.0.1:6379> LPUSH inter:difesa "VRSALJKO" "DE VRIJ" "SKRINIAR" "ASAMOAH"
(integer) 5
127.0.0.1:6379> LPUSH inter:ccampo "BROZOVIC" "JOAO MARIO" "BORJA VALERO"
(integer) 3

Con il comando LRANGE posso verificare il contenuto della lista tra gli indici start e stop

127.0.0.1:6379> LRANGE inter:difesa 0 4
1) "ASAMOAH"
2) "SKRINIAR"
3) "DE VRIJ"
4) "VRSALJKO"
5) "HANDANOVIC"
127.0.0.1:6379> LRANGE inter:ccampo 0 3
1) "BORJA VALERO"
2) "JOAO MARIO"
3) "BROZOVIC"
127.0.0.1:6379>

Per ottenere un elemento della lista, via indice si utilizza LINDEX:

127.0.0.1:6379> LINDEX inter:difesa 4
"HANDANOVIC"

Altri comandi sulle liste sono:

LINSERT key BEFORE|AFTER pivot value
Inserisce un elemento PRIMA o DOPO un altro elemento nella lista

127.0.0.1:6379> LINSERT inter:attacco AFTER PERISIC ICARDI
(integer) 2
127.0.0.1:6379> LRANGE inter:attacco 0 2
1) "PERISIC"
2) "ICARDI"

LLEN key
Ottiene la lunghezza di una lista

127.0.0.1:6379> LLEN inter:attacco
(integer) 2

LPOP key
Rimuove e ritorna il primo elemento di una lista:

127.0.0.1:6379> LPOP inter:attacco
"PERISIC"
127.0.0.1:6379> LLEN inter:attacco
(integer) 1
127.0.0.1:6379> LRANGE inter:attacco 0 2
1) "ICARDI"

LREM key count value
Rimuove gli elementi che corrispondono a value

127.0.0.1:6379> LRANGE inter:ccampo 0 3
1) "BROZOVIC"
2) "BORJA VALERO"
3) "JOAO MARIO"
127.0.0.1:6379> LREM inter:ccampo 1 BROZOVIC
(integer) 1
127.0.0.1:6379> LRANGE inter:ccampo 0 3
1) "BORJA VALERO"
2) "JOAO MARIO"

Se ci fossero più occorrenze di value, basterebbere invece di 1 (count) mettere 2 o più.
Se invece di 1 (o 2) si utilizzasse un numero negativo, si invertirebbe il senso di ricerca, quindi dal basso verso l’alto.

127.0.0.1:6379> LPUSH inter:ccampo VECINO
(integer) 3
127.0.0.1:6379> LPUSH inter:ccampo "JOAO MARIO"
(integer) 4
127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
2) "VECINO"
3) "BORJA VALERO"
4) "JOAO MARIO"
127.0.0.1:6379> LREM inter:ccampo -1 "JOAO MARIO"
(integer) 1
127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
2) "VECINO"
3) "BORJA VALERO"
127.0.0.1:6379>

LSET key index value

Setta il valore di una lista in base all’indice di essa:

127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
2) "VECINO"
3) "BORJA VALERO"
127.0.0.1:6379> LSET inter:ccampo 2 "GAGLIARDINI"
OK
127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
2) "VECINO"
3) "GAGLIARDINI"

LTRIM key start stop

Modifica la lista riducendola a soli gli elementi compresi tra start e stop:

127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
2) "VECINO"
3) "GAGLIARDINI"
127.0.0.1:6379> LTRIM inter:ccampo 0 1
OK
127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
2) "VECINO"

RPOP key

Rimuove e ritorna l’ultimo elemento di una lista:

127.0.0.1:6379> RPOP inter:ccampo
"VECINO"
127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"

RPOPLPUSH source destination

Rimuove l’ultimo elemento di una lista e lo aggiunge in un’altra, ritornandolo.

127.0.0.1:6379> LRANGE inter:ccampo 0 4
1) "JOAO MARIO"
127.0.0.1:6379> RPOPLPUSH inter:ccampo inter:panchina
"JOAO MARIO"
127.0.0.1:6379> LRANGE inter:ccampo 0 4
(empty list or set)
127.0.0.1:6379> LRANGE inter:panchina 0 4

RPUSH key value1 [value2]

Aggiunge in coda un valore alla lista. E’ l’opposto di LPUSH, che lo aggiunge invece in testa ad essa

RPUSHX key value

Aggiunge un valore ad una lista solo se questa esiste

127.0.0.1:6379> RPUSHX inter:tribuna ICARDI
(integer) 0
127.0.0.1:6379> LRANGE inter:tribuna 0 4
(empty list or set)

L’opposto inquanto a punto di inserimento in lista è LPUSHX.

Ordinamento valori

E’ possibile ordinare i valori di una lista con il comando SORT

127.0.0.1:6379> RPUSH inter:difesa:numeri 1 2 3 4 5 13 14
(integer) 7
127.0.0.1:6379> SORT inter:difesa:numeri
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "13"
7) "14"

è possibile anche impostare delle priorità:

127.0.0.1:6379> SET titolari:1 1
OK
127.0.0.1:6379> SET titolari:2 2
OK
127.0.0.1:6379> SET titolari:13 3
OK
127.0.0.1:6379> SET titolari:14 4
OK
127.0.0.1:6379> SORT inter:difesa:numeri by titolari:* desc
1) "14"
2) "13"
3) "2"
4) "1"
5) "5"
6) "4"
7) "3"

PUBLISH e SUBSCRIBE

I comandi basici sono PUBLISH message e SUBSCRIBE message

Utilizziamo un altro prompt dove lanceremo un secondo client per controllare i comandi suddetti.
Da uno dei due client effettuaiamo il SUBSCRIBE ad un “canale” casuale.
Il Channel è il canale appunto dove avverranno le comunicazioni tra client. Chiameremo il canale “test”.

127.0.0.1:6379> SUBSCRIBE test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1

Ora, dall’altro client, Publicheremo un messaggio che dovrà essere ricevuto dal primo:

127.0.0.1:6379> PUBLISH test ON
(integer) 1
127.0.0.1:6379>

Se controlliamo il client che ha effettuato il subscribe:

127.0.0.1:6379> SUBSCRIBE test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "ON"

REDIS e Python

Integriamo python in tutto questo:
Dal nostro ambiente virtuale installiamo redis

(venv) C:\tmp>pip install -U redis
Collecting redis
...
Successfully installed redis-3.0.1

apriamo una shell di python e…

>>> from redis import Redis
>>> r = Redis(host="127.0.0.1", port=6379, db=0)
>>> r.publish("test", "message from python shell")
1

Se controlliamo il client precedente, in ascolto, troveremo il messaggio appena spedito:

1) "message"
2) "test"
3) "message from python shell"

Per effettuare il SUBSCRIBE ad un canale, utilizziamo il metodo pubsub, che creerà un oggetto PubSub:

>>> p = r.pubsub()
>>> p
<redis.client.PubSub object at 0x00C92630>

Ora che abbiamo l’oggetto PubSub è possibile “iscriversi” al canale desiderato:

>>> p.subscribe("test")

Ora possiamo spedire un messaggio sul canale:

>>> r.publish("test", "message 2 from python shell")
2

Per risalire ai messaggi spediti sul canale, possiamo utilizzare il metodo get_message dell’oggetto PubSub:

>>> p.get_message()
{'type': 'message', 'pattern': None, 'channel': b'test', 'data': b'message 2 from python shell'}

che restituisce un dizionario contenente i dati che ci interessano.

type: può essere uno dei seguenti valori ‘subscribe’, ‘unsubscribe’, ‘psubscribe’, ‘punsubscribe’, ‘message’, ‘pmessage’
channel: il canale sul quale siamo in ascolto o dove è stato pubblicato un messaggio
pattern: il pattern che corrisponde ad un messaggio pubblicato; sarà None eccetto in caso di ‘pmessage’.
data: il contenuto del messaggio.

Link utili:
Redis doc
libreria redis per python

Categorie:redis Tag:

Lista Calciatori Gazzetta 2018-2019: giornata 18

dicembre 28, 2018 Lascia un commento

tutte i file sono compatibili con Fantalight, FantaLega e
FantaStat 2.0

link files in formato txt scaricabili

tutte le giornate

100|ARESTI|CAG|0.0|0.0|1
101|AUDERO|SAM|6.0|6.0|16
102|BARDI|FRO|0.0|0.0|1
103|BELEC|SAM|0.0|0.0|1
104|BERISHA E.|ATA|4.5|6.5|15
105|BERNI|INT|0.0|0.0|1
106|CONSIGLI|SAS|3.5|6.5|15
107|CONTINI|NAP|0.0|0.0|1
108|CRAGNO|CAG|6.5|6.5|18
109|DA COSTA|BOL|0.0|0.0|1
110|DAGA|CAG|0.0|0.0|1
111|DINI|PAR|0.0|0.0|1
112|DONNARUMMA G.|MIL|7.0|7.5|18
113|DONNARUMMA A.|MIL|0.0|0.0|1
114|DRAGOWSKI|FIO|0.0|0.0|3
115|FALCONE|SAM|0.0|0.0|1
116|FRATTALI|PAR|0.0|0.0|1
117|FUZATO|ROM|0.0|0.0|1
118|GASPARINI|UDI|0.0|0.0|1
119|GIACOMEL|EMP|0.0|0.0|1
120|GOLLINI|ATA|0.0|0.0|5
121|GOMIS|SPA|6.0|6.0|12
122|GUERRIERI|LAZ|0.0|0.0|1
123|HANDANOVIC|INT|6.5|6.5|21
124|ICHAZO|TOR|6.0|6.0|4
125|KARNEZIS|NAP|0.0|0.0|10
126|LAFONT|FIO|5.0|6.0|15
127|MARCHETTI|GEN|0.0|0.0|8
128|MERET|NAP|5.0|6.0|11
129|MILINKOVIC V.|SPA|0.0|0.0|6
130|MIRANTE|ROM|0.0|0.0|2
131|MUSSO|UDI|6.0|6.0|12
132|PADELLI|INT|0.0|0.0|1
133|PAVONI|CHI|0.0|0.0|1
134|PEGOLO|SAS|0.0|0.0|1
135|PERIN|JUV|0.0|0.0|6
136|PINSOGLIO|JUV|0.0|0.0|1
137|PLIZZARI|MIL|0.0|0.0|1
138|POLUZZI|SPA|0.0|0.0|1
139|PROTO|LAZ|0.0|0.0|1
140|PROVEDEL|EMP|3.0|6.0|4
141|RADU I.|GEN|5.0|6.0|8
142|RADUNOVIC|ATA|0.0|0.0|1
143|RAFAEL A.|CAG|0.0|0.0|1
144|REINA|MIL|0.0|0.0|3
145|ROSATI|TOR|0.0|0.0|1
146|ROSSI F.|ATA|0.0|0.0|1
147|SANTURRO|BOL|0.0|0.0|1
148|SATALINO|SAS|0.0|0.0|1
149|SCUFFET|UDI|0.0|0.0|6
150|SECULIN|CHI|0.0|0.0|2
151|SEPE|PAR|6.5|6.5|16
152|SIRIGU|TOR|0.0|0.0|20
153|SKORUPSKI|BOL|3.5|5.5|14
154|SORRENTINO|CHI|4.0|6.0|16
155|SPORTIELLO|FRO|6.5|6.5|11
156|STRAKOSHA|LAZ|6.5|6.5|17
157|SZCZESNY|JUV|4.0|6.0|23
158|TERRACCIANO|EMP|0.0|0.0|6
159|TOZZO|SAM|0.0|0.0|1
160|VIGORITO|FRO|0.0|0.0|1
161|VODISEK|GEN|0.0|0.0|1
162|ZACCAGNO|TOR|0.0|0.0|1
163|RAFAEL|SAM|0.0|0.0|1
164|OLSEN|ROM|5.0|6.0|17
165|FULIGNATI|EMP|0.0|0.0|1
166|NICOLAS|UDI|0.0|0.0|1
167|IACOBUCCI|FRO|0.0|0.0|1
168|SEMPER|CHI|0.0|0.0|1
169|BAGHERIA|PAR|0.0|0.0|1
170|OSPINA|NAP|0.0|0.0|8
171|GHIDOTTI|FIO|0.0|0.0|1
200|ABATE|MIL|0.0|0.0|6
201|ACERBI|LAZ|6.5|6.5|20
202|ADJAPONG|SAS|0.0|0.0|6
203|ADNAN|ATA|0.0|0.0|4
204|ALBIOL|NAP|5.0|5.5|15
205|ALEX SANDRO|JUV|6.0|6.0|20
206|ALVES|PAR|0.0|0.0|13
207|ANDERSEN|SAM|6.0|6.5|9
208|ANDREOLLI|CAG|0.0|0.0|4
209|ANGELLA|UDI|0.0|0.0|3
210|ANSALDI|TOR|0.0|0.0|10
211|ANTONELLI|EMP|5.5|5.5|6
212|ARIAUDO|FRO|6.5|6.5|5
213|ASAMOAH|INT|6.5|6.5|9
214|BANI|CHI|5.5|5.5|6
215|BARZAGLI|JUV|0.0|0.0|5
216|BASTA|LAZ|0.0|0.0|4
217|BASTONI|PAR|6.5|6.5|5
218|BASTOS|LAZ|0.0|0.0|7
219|BENATIA|JUV|0.0|0.0|12
220|BERESZYNSKI|SAM|0.0|0.0|7
221|BETTELLA|ATA|0.0|0.0|1
222|BIANDA|ROM|0.0|0.0|2
223|BIRAGHI|FIO|5.5|5.5|12
224|BIRASCHI|GEN|6.0|6.0|8
225|BONIFAZI|SPA|6.5|6.5|7
226|BONUCCI|JUV|5.0|5.0|16
227|BREMER|TOR|0.0|0.0|4
228|BRIGHENTI|FRO|0.0|0.0|3
229|BRIGNANI|BOL|0.0|0.0|1
230|CACCIATORE|CHI|0.0|0.0|7
231|CACERES|LAZ|0.0|0.0|8
232|CALABRESI|BOL|5.0|5.5|6
233|CALABRIA|MIL|5.5|5.5|9
234|CALDARA|MIL|0.0|0.0|12
235|CANCELO|JUV|0.0|0.0|19
236|CAPUANO|FRO|0.0|0.0|5
237|CASTAGNE|ATA|6.5|6.5|9
238|CECCHERINI|FIO|6.0|6.0|5
239|CEPPITELLI|CAG|6.0|6.0|8
240|CESAR|CHI|5.0|5.5|3
241|CHIELLINI|JUV|6.0|6.5|19
242|CHIRICHES|NAP|0.0|0.0|4
243|CIOFANI M.|FRO|0.0|0.0|5
244|CIONEK|SPA|5.5|5.5|6
245|COLLEY|SAM|6.5|6.5|8
246|CONTI|MIL|5.5|5.5|9
247|COSTA|SPA|6.0|6.0|6
248|CREMONESI|SPA|0.0|0.0|3
249|CRISCITO|GEN|6.0|6.0|12
250|D'AMBROSIO|INT|6.0|6.0|13
251|DALBERT|INT|0.0|0.0|6
252|DANILO|BOL|5.0|5.0|7
253|DE MAIO|BOL|0.0|0.0|6
254|DE SCIGLIO|JUV|5.5|5.5|9
255|DE SILVESTRI|TOR|12.0|7.5|18
256|DE VRIJ|INT|7.0|7.0|21
257|DELL'ORCO|SAS|5.5|5.5|4
258|DI CESARE|PAR|0.0|0.0|5
259|DI LORENZO|EMP|5.0|5.5|8
260|DICKMANN|SPA|0.0|0.0|4
261|DIJKS|BOL|0.0|0.0|5
262|DIKS|FIO|0.0|0.0|4
263|DIMARCO|PAR|0.0|0.0|6
264|DURMISI|LAZ|0.0|0.0|5
265|EL YAMIQ|GEN|0.0|0.0|4
266|FARAGO'|CAG|5.5|6.0|8
267|FAZIO|ROM|6.0|6.0|17
268|FELIPE|SPA|6.0|6.0|7
269|FERRARI G.|SAS|4.0|4.5|15
270|FERRARI A.|SAM|0.0|0.0|4
271|FLORENZI|ROM|6.0|6.5|18
272|GAGLIOLO|PAR|6.5|6.5|9
273|GAZZOLA|PAR|6.5|6.5|5
274|GHIGLIONE|FRO|6.5|7.0|2
275|GHOULAM|NAP|0.0|0.0|11
276|GOBBI|PAR|0.0|0.0|5
277|GOLDANIGA|FRO|6.5|6.5|7
278|GOMEZ|MIL|0.0|0.0|3
279|GONZALEZ|BOL|0.0|0.0|5
280|GOSENS|ATA|6.0|6.0|10
281|GUNTER|GEN|0.0|0.0|4
282|HANCKO|FIO|0.0|0.0|4
283|HATEBOER|ATA|5.5|6.0|15
284|HELANDER|BOL|5.5|5.5|5
285|HEURTAUX|UDI|0.0|0.0|4
286|HRISTOV|FIO|0.0|0.0|2
287|HYSAJ|NAP|0.0|0.0|10
288|IACOPONI|PAR|7.0|7.0|7
289|IMPERIALE|EMP|0.0|0.0|1
290|IZZO|TOR|6.5|6.5|13
291|JAROSZYNSKI|CHI|5.5|5.5|4
292|JUAN JESUS|ROM|0.0|0.0|8
293|KARSDORP|ROM|0.0|0.0|4
294|KOLAROV|ROM|6.5|6.5|25
295|KONATE'|SPA|0.0|0.0|4
296|KOULIBALY|NAP|6.0|7.0|19
297|KRAFTH|BOL|0.0|0.0|4
298|KRAJNC|FRO|6.0|6.0|3
299|LAKICEVIC|GEN|0.0|0.0|4
300|STRYGER LARSEN|UDI|6.0|6.0|9
301|LAURINI|FIO|4.5|5.0|4
302|LEMOS|SAS|5.0|5.0|5
303|LETSCHERT|SAS|0.0|0.0|3
304|LEVERBE|SAM|0.0|0.0|1
305|LIROLA|SAS|5.0|5.0|11
306|LUIZ FELIPE|LAZ|12.5|7.0|9
307|LUPERTO|NAP|0.0|0.0|4
308|LYANCO|TOR|0.0|0.0|4
309|LYKOGIANNIS|CAG|0.0|0.0|6
310|MAIETTA|EMP|5.0|5.0|5
311|MAKSIMOVIC|NAP|5.5|5.5|6
312|MANCINI|ATA|5.5|6.0|15
313|MANOLAS|ROM|7.0|7.0|17
314|MARCANO|ROM|0.0|0.0|8
315|MARCHIZZA|SAS|0.0|0.0|2
316|MARCJANIK|EMP|0.0|0.0|4
317|MARIO RUI|NAP|5.5|5.5|8
318|MARUSIC|LAZ|6.5|6.5|13
319|MASIELLO|ATA|6.0|6.0|11
320|MBAYE|BOL|0.0|0.0|9
321|MILENKOVIC|FIO|5.0|5.5|13
322|MIRANDA|INT|0.0|0.0|8
323|MOLINARO|FRO|0.0|0.0|4
324|MORETTI|TOR|6.5|6.5|7
325|MURRU|SAM|7.5|6.5|10
326|MUSACCHIO|MIL|6.0|6.0|6
327|NKOULOU|TOR|11.5|7.0|18
328|NUYTINCK|UDI|6.0|6.0|8
329|OLIVERA|FIO|0.0|0.0|3
330|OPOKU|UDI|6.0|6.0|3
331|PAJAC|CAG|0.0|0.0|5
332|PALOMINO|ATA|0.0|0.0|10
333|PASQUAL|EMP|0.0|0.0|12
334|PAZ|BOL|0.0|0.0|4
335|PELLEGRINI LU.|ROM|0.0|0.0|2
336|PELUSO|SAS|0.0|0.0|4
337|PEREIRA|GEN|5.5|5.5|5
338|PEZZELLA GE.|FIO|5.5|6.0|13
339|PEZZELLA GI.|UDI|0.0|0.0|4
340|PISACANE|CAG|6.5|6.5|6
341|POLVANI|EMP|0.0|0.0|2
342|RADU S.|LAZ|6.5|6.5|9
343|RANOCCHIA|INT|0.0|0.0|4
344|RASMUSSEN|EMP|5.5|5.5|4
345|RECA|ATA|0.0|0.0|4
346|REGINI|SAM|0.0|0.0|4
347|RODRIGUEZ R.|MIL|5.5|5.5|12
348|ROGERIO|SAS|0.0|0.0|6
349|ROLANDO|SAM|0.0|0.0|3
350|ROMAGNA|CAG|0.0|0.0|8
351|ROMAGNOLI A.|MIL|6.0|6.0|16
352|ROMAGNOLI S.|EMP|0.0|0.0|3
353|ROSSETTINI|CHI|0.0|0.0|5
354|RUGANI|JUV|0.0|0.0|8
355|RUSSO|FRO|0.0|0.0|2
356|SALA|SAM|6.0|6.0|5
357|SALAMON|FRO|0.0|0.0|4
358|SAMIR|UDI|0.0|0.0|7
359|SANTON|ROM|0.0|0.0|6
360|SCAGLIA|PAR|0.0|0.0|4
361|SERNICOLA|SAS|0.0|0.0|1
362|SIMIC|MIL|0.0|0.0|2
363|SKRINIAR|INT|6.5|6.5|17
364|SPINAZZOLA|JUV|0.0|0.0|4
365|SPOLLI|GEN|0.0|0.0|4
366|SRNA|CAG|7.0|6.0|12
367|STRINIC|MIL|0.0|0.0|4
368|TANASIJEVIC|CHI|0.0|0.0|1
369|TAVARES|SAM|0.0|0.0|4
370|TER AVEST|UDI|0.0|0.0|6
371|TERRANOVA|FRO|0.0|0.0|6
372|TOLOI|ATA|0.0|0.0|10
373|TOMOVIC|CHI|0.0|0.0|6
374|TONELLI|SAM|0.0|0.0|9
375|UNTERSEE|EMP|0.0|0.0|4
376|VAISANEN|SPA|0.0|0.0|3
377|VALJENT|CHI|0.0|0.0|3
378|VARNIER|ATA|0.0|0.0|4
379|VENUTI|FIO|0.0|0.0|4
380|VESELI|EMP|5.0|5.5|4
381|VICARI|SPA|0.0|0.0|8
382|VITOR HUGO|FIO|3.0|4.0|8
383|WAGUE|UDI|0.0|0.0|4
384|WALLACE|LAZ|0.0|0.0|4
385|ZAPATA C.|MIL|0.0|0.0|7
386|ZUKANOVIC|GEN|0.0|0.0|5
387|SIERRALTA|PAR|0.0|0.0|2
388|PATRIC|LAZ|0.0|0.0|6
389|MATTIELLO|BOL|5.0|5.0|8
390|DJOUROU|SPA|0.0|0.0|7
391|TRIPALDELLI|SAS|0.0|0.0|1
392|LUKAKU|LAZ|6.0|6.0|7
393|MAGNANI|SAS|0.0|0.0|6
394|GILLEKENS|FIO|0.0|0.0|1
395|GABBIA|MIL|0.0|0.0|1
396|BELLANOVA|MIL|0.0|0.0|1
397|VRSALJKO|INT|0.0|0.0|11
398|LOPEZ|GEN|0.0|0.0|4
399|SILVESTRE|EMP|4.5|5.0|11
400|MALCUIT|NAP|0.0|0.0|8
401|ANDERSON|LAZ|0.0|0.0|4
402|FERIGRA|TOR|0.0|0.0|1
403|CORBO|BOL|0.0|0.0|1
404|BARBA|CHI|6.0|6.0|6
405|AINA|TOR|6.0|6.0|9
406|DJIDJI|TOR|0.0|0.0|8
407|ZAMPANO|FRO|5.5|0.0|8
408|SIMIC|SPA|0.0|0.0|4
409|MARLON|SAS|5.5|5.5|10
410|DJIMSITI|ATA|3.0|5.0|5
411|TROOST-EKONG|UDI|6.0|6.0|10
412|VERGARA|CAG|0.0|0.0|2
413|SALVI|SPA|0.0|0.0|1
414|FERRARESI|SAS|0.0|0.0|1
415|KLAVAN|CAG|0.0|0.0|8
416|RIGIONE|CHI|0.0|0.0|2
417|ROMERO|GEN|5.0|5.5|6
418|DI MAGGIO|PAR|0.0|0.0|1
500|ACQUAH|EMP|0.0|0.0|7
501|ALLAN|NAP|6.0|6.5|19
503|BADU|UDI|0.0|0.0|4
504|BALIC|UDI|0.0|0.0|4
505|BANDINELLI|SAS|0.0|0.0|3
506|BARAK|UDI|0.0|0.0|15
507|BARELLA|CAG|7.0|7.0|17
508|BARILLA'|PAR|0.0|0.0|10
509|BARRETO|SAM|0.0|0.0|8
510|BASELLI|TOR|7.5|6.5|19
511|BAUMGARTNER|SAM|0.0|0.0|1
512|BEGHETTO|FRO|6.0|6.0|6
513|BEHRAMI|UDI|0.0|0.0|7
514|BENASSI|FIO|4.5|4.5|21
515|BENNACER|EMP|5.0|5.0|10
516|BENTANCUR|JUV|4.0|5.0|12
517|BERENGUER|TOR|0.0|0.0|11
518|BERISHA V.|LAZ|0.0|0.0|10
519|BERNARDESCHI|JUV|0.0|0.0|19
520|BERTOLACCI|MIL|0.0|0.0|5
521|BESEA|FRO|0.0|0.0|2
522|BESSA|GEN|6.5|6.5|15
523|BIGLIA|MIL|0.0|0.0|12
524|BIRSA|CHI|0.0|0.0|15
525|BOATENG|SAS|0.0|0.0|20
526|BONAVENTURA|MIL|0.0|0.0|24
527|BORINI|MIL|0.0|0.0|8
528|BORJA VALERO|INT|5.5|6.0|9
529|BOURABIA|SAS|6.0|6.0|9
530|BRIGHI|EMP|0.0|0.0|4
531|BROZOVIC|INT|5.5|6.0|18
532|CALHANOGLU|MIL|4.5|4.5|16
533|CALIGARA|CAG|0.0|0.0|1
534|CALLEGARI|GEN|0.0|0.0|1
535|EMRE CAN|JUV|5.5|5.5|17
536|CANDREVA|INT|0.0|0.0|14
537|CAPEZZI|EMP|0.0|0.0|5
538|CASSATA|FRO|0.0|0.0|6
539|CASTRO|CAG|0.0|0.0|17
540|CATALDI|LAZ|0.0|0.0|8
541|CHIBSAH|FRO|6.5|6.5|9
542|CHIESA|FIO|6.0|6.0|24
543|CIGARINI|CAG|5.5|6.0|9
544|COLOMBATTO|CAG|0.0|0.0|3
545|CORIC|ROM|0.0|0.0|6
546|COULIBALY|UDI|0.0|0.0|3
547|CRISETIG|FRO|5.0|5.5|4
548|CRISTANTE|ROM|8.0|7.0|24
549|CRISTOFORO|FIO|0.0|0.0|3
550|CUADRADO|JUV|0.0|0.0|20
551|D'ALESSANDRO|UDI|6.0|6.0|7
552|DABO|FIO|0.0|0.0|11
553|DE PAUL|UDI|6.0|6.5|20
554|DE ROON|ATA|0.0|0.0|15
555|DE ROSSI|ROM|0.0|0.0|12
556|DEIOLA|PAR|6.5|6.0|5
557|DE PAOLI|CHI|6.0|6.0|7
558|DESSENA|CAG|0.0|0.0|5
559|DEZI|PAR|0.0|0.0|4
560|DI GENNARO|LAZ|0.0|0.0|3
561|DIAWARA|NAP|0.0|0.0|8
562|DJURICIC|SAS|5.0|5.0|10
563|DONSAH|BOL|0.0|0.0|4
564|DOUGLAS COSTA|JUV|5.5|5.5|21
565|DUNCAN|SAS|0.0|0.0|14
566|DZEMAILI|BOL|0.0|0.0|9
567|EMMERS|INT|0.0|0.0|1
568|EVANGELISTA|UDI|0.0|0.0|5
569|EVERTON LUIZ|SPA|0.0|0.0|5
570|EYSSERIC|FIO|0.0|0.0|10
571|FARES|SPA|5.5|5.5|7
572|FOFANA|UDI|5.5|5.5|12
573|FRATTESI|SAS|0.0|0.0|1
574|FREDIANI|PAR|0.0|0.0|1
575|FREULER|ATA|6.0|6.5|19
576|GAGLIARDINI|INT|0.0|0.0|13
577|GARRITANO|CHI|0.0|0.0|5
578|GAUDINO|CHI|0.0|0.0|4
579|GERSON|FIO|3.5|4.0|8
580|GIACCHERINI|CHI|6.0|6.0|16
581|GIORNO|PAR|0.0|0.0|1
582|GONALONS|ROM|0.0|0.0|6
583|GORI|FRO|0.0|0.0|4
584|GRASSI|PAR|0.0|0.0|9
585|HAAS|ATA|0.0|0.0|3
586|HALILOVIC|MIL|0.0|0.0|4
587|HALLFREDSSON|FRO|0.0|0.0|4
588|HAMSIK|NAP|6.0|6.0|19
589|HETEMAJ|CHI|5.5|5.5|9
590|HILJEMARK|GEN|6.0|6.0|11
591|INGELSSON|UDI|0.0|0.0|3
592|IONITA|CAG|6.0|6.0|13
593|JANKTO|SAM|0.0|0.0|13
594|JOAO PEDRO|CAG|0.0|0.0|22
595|KATUMA|SPA|0.0|0.0|1
596|KESSIE'|MIL|5.0|5.0|19
597|KHEDIRA|JUV|5.0|5.0|21
598|KINGSLEY|BOL|0.0|0.0|1
599|KIYINE|CHI|5.5|5.5|6
600|KONE'|FRO|0.0|0.0|4
601|KREJCI|BOL|5.5|5.5|5
602|KRUNIC|EMP|4.0|5.0|17
603|KULUSEVSKI|ATA|0.0|0.0|1
604|KURTIC|SPA|0.0|0.0|16
605|LAXALT|MIL|5.0|5.0|10
606|LAZOVIC|GEN|6.5|6.5|11
607|LAZZARI|SPA|6.5|6.5|18
608|LEIVA|LAZ|6.0|6.0|15
609|LINETTY|SAM|6.0|6.0|13
610|LJAJIC|TOR|0.0|0.0|22
611|LOCATELLI|SAS|7.0|6.0|7
612|LOLLO|EMP|0.0|0.0|4
613|LUKIC|TOR|6.0|6.0|5
614|LULIC|LAZ|11.0|7.0|19
615|MAGNANELLI|SAS|5.5|5.5|8
616|MAIELLO|FRO|6.0|6.0|6
617|MANDRAGORA|UDI|5.0|5.5|12
618|MARCHISIO|JUV|0.0|0.0|6
619|MATUIDI|JUV|0.0|0.0|18
620|MAURI|MIL|0.0|0.0|4
621|MAZZITELLI|GEN|0.0|0.0|6
622|MEITE|TOR|6.0|6.0|12
623|MILINKOVIC S.|LAZ|5.5|5.5|21
624|MINALA|LAZ|0.0|0.0|4
625|MISSIROLI|SPA|5.5|5.5|9
626|MONTOLIVO|MIL|0.0|0.0|4
627|MURGIA|LAZ|0.0|0.0|4
628|NAGY|BOL|5.5|5.5|4
629|NAINGGOLAN|INT|0.0|0.0|23
630|OBI|CHI|6.0|6.0|12
631|OMEONGA|GEN|0.0|0.0|4
632|PADOIN|CAG|6.0|6.0|8
633|PAGANINI|FRO|0.0|0.0|4
634|PARIGINI|TOR|0.0|0.0|6
635|PAROLO|LAZ|6.0|6.0|20
636|PASTORE|ROM|5.5|5.5|23
637|PELLEGRINI LO.|ROM|0.0|0.0|17
638|PERISIC|INT|5.0|5.0|22
639|PEROTTI|ROM|10.5|7.0|18
640|PESSINA|ATA|6.0|6.0|4
641|PJANIC|JUV|6.5|6.5|20
642|POLI|BOL|6.0|6.0|13
643|PONTISSO|UDI|0.0|0.0|1
644|PRAET|SAM|6.0|6.0|15
645|PULGAR|BOL|0.0|0.0|7
646|RADOVANOVIC|CHI|5.5|5.5|9
647|RAMIREZ|SAM|11.5|7.5|21
648|RICCARDI|ROM|0.0|0.0|1
649|RIGONI L.|PAR|6.0|6.5|10
650|RIGONI N.|CHI|0.0|0.0|5
651|RINCON|TOR|6.5|7.0|11
652|RIZZO|BOL|0.0|0.0|4
653|ROG|NAP|0.0|0.0|8
654|ROMULO|GEN|0.0|0.0|13
655|RUIZ|NAP|6.0|6.0|19
656|SAMMARCO|FRO|0.0|0.0|4
657|SANCHEZ|FIO|0.0|0.0|5
658|SANDRO|GEN|5.5|5.5|11
659|SAPONARA|SAM|5.0|5.0|15
660|SCAVONE|PAR|0.0|0.0|6
661|SCHETINO|FIO|0.0|0.0|2
662|SCHIATTARELLA|SPA|5.5|6.0|10
663|SCOZZARELLA|PAR|6.5|6.5|7
664|SENSI|SAS|0.0|0.0|12
665|SODDIMO|FRO|0.0|0.0|6
666|STIJEPOVIC|SAM|0.0|0.0|1
667|STROOTMAN|ROM|0.0|0.0|13
668|STULAC|PAR|5.5|5.5|10
669|STURARO|JUV|0.0|0.0|4
670|SVANBERG|BOL|5.5|5.5|6
671|TESSIORE|SAM|0.0|0.0|1
672|TRAORE'|EMP|5.5|5.5|8
673|VALDIFIORI|SPA|0.0|0.0|5
674|VALENCIA|BOL|0.0|0.0|2
675|VALOTI|SPA|5.0|5.0|8
676|VALZANIA|ATA|0.0|0.0|4
677|VECINO|INT|6.0|6.0|12
678|VERETOUT|FIO|5.0|5.0|21
679|VERRE|SAM|0.0|0.0|4
680|VIGNATO|CHI|0.0|0.0|1
681|VITALE|SPA|0.0|0.0|2
682|VIVIANI|SPA|0.0|0.0|6
683|YOUNES|NAP|0.0|0.0|7
684|ZAJC|EMP|5.5|5.5|16
685|ZANIOLO|ROM|11.0|7.5|6
686|ZIELINSKI|NAP|5.5|5.5|19
687|UNDER|ROM|6.0|6.0|22
688|PEETERS|SAM|0.0|0.0|1
689|NORGAARD|FIO|0.0|0.0|5
690|NETO|LAZ|0.0|0.0|1
691|JORDAO|LAZ|0.0|0.0|1
692|JOAO MARIO|INT|6.5|6.5|13
693|PASALIC|ATA|6.0|6.0|13
694|BRADARIC|CAG|0.0|0.0|8
695|CORREA|LAZ|6.0|6.0|19
696|BADELJ|LAZ|0.0|0.0|9
697|VIEIRA|SAM|0.0|0.0|7
698|NIKOLIC|SPA|0.0|0.0|1
699|ROLON|GEN|5.5|6.0|4
700|FURLAN|SAM|0.0|0.0|5
701|FERNANDES|FIO|5.5|5.5|7
702|EKDAL|SAM|6.5|6.5|11
703|CARRIERO|PAR|0.0|0.0|1
704|NZONZI|ROM|6.5|6.5|13
705|VLOET|FRO|0.0|0.0|6
706|BAKAYOKO|MIL|6.5|6.5|10
707|CASTILLEJO|MIL|5.5|5.5|14
708|BURRUCHAGA|CHI|0.0|0.0|1
709|ESPOSITO|SPA|0.0|0.0|1
710|RIGONI E.|ATA|0.0|0.0|15
711|COLPANI|ATA|0.0|0.0|1
712|SORIANO|TOR|0.0|0.0|13
713|UCAN|EMP|0.0|0.0|7
714|MUNARI|PAR|0.0|0.0|4
715|MONTIEL|FIO|0.0|0.0|1
716|ARAMU|TOR|0.0|0.0|3
717|ERRICO|FRO|0.0|0.0|1
718|VELOSO|GEN|0.0|0.0|7
800|ANDRE' SILVA|MIL|0.0|0.0|15
801|ANTENUCCI|SPA|0.0|0.0|17
802|ASENCIO|GEN|0.0|0.0|7
803|AVENATTI|BOL|0.0|0.0|5
804|BABACAR|SAS|9.0|6.0|21
805|BACCA|MIL|0.0|0.0|16
806|BAEZ|FIO|0.0|0.0|3
807|BARAYE|PAR|0.0|0.0|4
808|BARROW|ATA|0.0|0.0|11
809|BELOTTI|TOR|7.0|7.0|29
810|BERARDI|SAS|6.0|6.0|20
811|BUTIC|TOR|0.0|0.0|3
812|CAICEDO|LAZ|5.5|5.5|11
813|CALAIO'|PAR|0.0|0.0|5
814|CALLEJON|NAP|6.0|6.0|23
815|CAPRARI|SAM|6.0|6.0|18
816|CAPUTO|EMP|5.5|5.5|26
817|CERAVOLO|PAR|0.0|0.0|11
818|CERRI|CAG|0.0|0.0|10
819|CIANO|FRO|6.5|6.5|18
820|CICIRETTI|PAR|0.0|0.0|8
821|CIOFANI D.|FRO|0.0|0.0|13
822|CITRO|FRO|0.0|0.0|7
823|COLIDIO|INT|0.0|0.0|1
824|CORNELIUS|ATA|0.0|0.0|8
825|CUTRONE|MIL|5.0|5.0|22
826|DA CRUZ|PAR|0.0|0.0|4
827|DAMASCAN|TOR|0.0|0.0|4
828|DEFREL|SAM|6.0|6.0|19
829|DESTRO|BOL|0.0|0.0|12
830|DI FRANCESCO|SAS|6.0|6.0|15
831|DI GAUDIO|PAR|0.0|0.0|10
832|DIONISI|FRO|0.0|0.0|6
833|DJORDJEVIC|CHI|0.0|0.0|11
834|DYBALA|JUV|6.0|6.0|29
835|DZEKO|ROM|6.0|6.0|26
836|EDERA|TOR|0.0|0.0|6
837|EL SHAARAWY|ROM|0.0|0.0|25
838|EWANDRO|UDI|0.0|0.0|4
839|FALCINELLI|BOL|0.0|0.0|11
840|FALLETTI|BOL|0.0|0.0|8
841|FANTACCI|EMP|0.0|0.0|1
842|FARIAS|CAG|9.0|6.5|13
843|FAVILLI|GEN|6.0|6.0|6
844|FINOTTO|SPA|0.0|0.0|5
845|FLOCCARI|SPA|5.0|5.0|6
846|GALABINOV|GEN|0.0|0.0|8
847|GALUPPINI|PAR|0.0|0.0|1
848|GIANNETTI|CAG|0.0|0.0|5
849|GOMEZ A.|ATA|8.0|7.0|24
850|GRAICIAR|FIO|0.0|0.0|4
851|HAN|CAG|0.0|0.0|11
852|HIGUAIN|MIL|4.5|4.5|27
853|IAGO|TOR|11.0|7.5|29
854|ICARDI|INT|7.0|7.0|41
855|ILICIC|ATA|6.0|6.0|23
856|IMMOBILE|LAZ|6.0|6.0|38
857|INGLESE|PAR|9.5|7.0|21
858|INSIGNE R.|NAP|0.0|0.0|5
859|INSIGNE L.|NAP|3.0|4.0|31
860|JAKUPOVIC|EMP|0.0|0.0|2
861|KALINIC|MIL|0.0|0.0|13
862|KARAMOH|INT|0.0|0.0|12
863|KLUIVERT|ROM|6.5|6.5|20
864|KOUAME|GEN|6.0|6.0|19
865|KOWNACKI|SAM|0.0|0.0|12
866|LA GUMINA|EMP|5.5|5.5|14
867|LAPADULA|GEN|0.0|0.0|9
868|LASAGNA|UDI|5.5|5.5|20
869|LERIS|CHI|5.5|5.5|4
870|LOMBARDI|LAZ|0.0|0.0|3
871|LUIS ALBERTO|LAZ|8.0|7.0|24
872|MACHIS|UDI|0.0|0.0|7
873|MALLE|UDI|0.0|0.0|2
874|MANDZUKIC|JUV|6.5|6.0|28
875|MARTINEZ|INT|9.5|7.0|24
876|MATARESE|FRO|0.0|0.0|2
877|MATRI|SAS|0.0|0.0|10
878|MCHEDLIDZE|EMP|0.0|0.0|5
879|MEDEIROS|GEN|0.0|0.0|10
880|MEGGIORINI|CHI|5.5|5.5|9
881|MERTENS|NAP|5.5|5.5|35
882|MICIN|UDI|0.0|0.0|4
883|MILIK|NAP|5.0|5.0|31
884|MRAZ|EMP|5.0|5.0|8
885|MURANO|SPA|0.0|0.0|2
886|NIANG|TOR|0.0|0.0|13
887|ODGAARD|SAS|0.0|0.0|1
888|OKWONKWO|BOL|5.0|5.0|7
889|ORSOLINI|BOL|5.5|5.5|14
890|OUNAS|NAP|0.0|0.0|11
891|PALACIO|BOL|5.0|5.5|13
892|PALOSCHI|SPA|0.0|0.0|15
893|PANDEV|GEN|0.0|0.0|15
894|PAVOLETTI|CAG|7.0|7.0|26
895|PELLISSIER|CHI|0.0|0.0|14
896|PERICA|FRO|0.0|0.0|6
897|PETAGNA|SPA|6.0|6.0|16
898|PETKOVIC|BOL|0.0|0.0|7
899|PIATEK|GEN|5.5|6.0|29
900|PJACA|FIO|5.0|5.0|12
901|POLITANO|INT|6.0|6.0|21
902|PUCCIARELLI|CHI|0.0|0.0|5
903|PUSSETTO|UDI|5.0|5.0|14
904|QUAGLIARELLA|SAM|11.0|8.0|38
905|RODRIGUEZ A.|EMP|0.0|0.0|4
906|RONALDO|JUV|10.0|7.0|57
907|SALCEDO|INT|0.0|0.0|1
908|SANTANDER|BOL|5.0|5.0|16
909|SAU|CAG|5.5|0.0|11
910|SCAMACCA|SAS|0.0|0.0|3
911|SCHICK|ROM|10.5|7.5|16
912|SILIGARDI|PAR|6.0|6.0|9
913|SIMEONE|FIO|4.5|4.5|21
914|SOTTIL|FIO|0.0|0.0|1
915|SPINELLI|GEN|0.0|0.0|10
916|SPROCATI|PAR|0.0|0.0|4
917|STEPINSKI|CHI|5.0|5.0|15
918|SUSO|MIL|0.0|0.0|26
919|THEREAU|FIO|0.0|0.0|10
920|TROTTA|SAS|0.0|0.0|6
921|TUMMINELLO|ATA|0.0|0.0|4
922|VERDE|ROM|0.0|0.0|8
923|VERDI|NAP|0.0|0.0|18
924|VINICIUS|NAP|0.0|0.0|3
925|VIZEU|UDI|0.0|0.0|9
926|VLAHOVIC|FIO|0.0|0.0|2
927|ZANIMACCHIA|GEN|0.0|0.0|1
928|ZAPATA D.|ATA|13.5|8.0|33
929|ZEKHNINI|FIO|0.0|0.0|2
930|BOGA|SAS|0.0|0.0|10
931|ROSSI A.|LAZ|0.0|0.0|4
932|MONCINI|SPA|0.0|0.0|4
933|KEAN|JUV|0.0|0.0|4
934|PINAMONTI|FRO|6.0|6.0|8
935|BRIGNOLA|SAS|5.0|5.0|9
936|GALANO|PAR|0.0|0.0|12
937|BIABIANY|PAR|6.5|7.0|9
938|DAL MONTE|GEN|0.0|0.0|4
939|MIRALLAS|FIO|0.0|0.0|17
940|KEITA|INT|6.5|6.5|22
941|CAMPBELL|FRO|0.0|0.0|9
942|GERVINHO|PAR|0.0|0.0|23
943|ZAZA|TOR|6.0|6.0|15
944|TEODORCZYK|UDI|0.0|0.0|13
945|ARDAIZ|FRO|0.0|0.0|4
946|GRUBAC|CHI|0.0|0.0|1
947|JUWARA|CHI|0.0|0.0|1
948|MASTAJ|PAR|0.0|0.0|1
Categorie:Fantacalcio, FantaLega