Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 26
1
Esercizi / Re:Esercizio in Python
« il: Gennaio 19, 2021, 20:24 »
Vedo che il "problema" non è cambiato, malgrado il tempo :)

Questo per un esempio. Grazie mille.
Invece se dovessi prendere i parametri che sono all'interno di un file .csv, con una serie di valori.
Del tipo: ...
...
gli passo una directory e vorrebbe una stringa o un numero.

@Valentina, se nel contesto operativo devi passare un "numero" o una "stringa" devi passare un numero oppure una stringa oppure nulla, non c'è alternativa.
L'utilizzo di files CSV prevede un sistema di dati costante e ben preciso, la definizione prevederebbe che la prima riga contenga i nomi dei campi (le Tue "chiavi" in sostanza) altrimenti non si è in presenza di un file CSV ma di qualcos'altro, un banale e generico file di testo, probabilmente.

Per altro, fai ben attenzione all'algoritmo che implementi, definire una funzione all'interno di un ciclo for non è un'idea grandiosa, tanto meno, di solito, si esegue un input utente in un ciclo di lettura dati da file, sono processi che è bene tenere separati per evitare pastrocchi e confusione.

Per stendere un qualsiasi codice bisogna conoscere esattamente :
  • il contesto operativo;
  • la strutturazione della fonte dati;
  • il prodotto finale da ottenere.
Oltre, naturalmente, lo strumento che si vuole utilizzare.

Per non procedere a tentoni, proponi una simulazione dei dati da trattare conforme alla reale struttura da affrontare e spiega ampiamente e chiaramente cosa si deve ottenere, così ci si potrà ragionar su, se posso, nei miei limiti, Ti aiuterò ma è necessario avere le idee chiare per poterlo fare

2
Esercizi / Re:Esercizio in Python
« il: Gennaio 19, 2021, 18:53 »
uno dei millemila modi possibili :
>>> params = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> def chiedi():
nome_parametro = input('inserisci il nome del parametro che vuoi visualizzare: ')
print (params[nome_parametro]) if nome_parametro in params.keys() else print("%s non c'è" % nome_parametro)


>>> chiedi()
inserisci il nome del parametro che vuoi visualizzare: c
3
>>> chiedi()
inserisci il nome del parametro che vuoi visualizzare: a
1
>>> chiedi()
inserisci il nome del parametro che vuoi visualizzare: f
f non c'è
>>>

3
grazie. Provando e riprovando ho risolto così:

n=eval(input('n: '))

"provare e riprovare" è necessario ad imparare, non ci sono le "funzioni" da Te indicate nel primo post ma va bene anche così.

Un consiglio : utilizza con ponderazione "eval()", potrà essere comoda ma potenzialmente è pericolosa, te ne mostro il perché:
>>> var = 'print("Ciao @salva")'
>>> eval(var)
Ciao @salva
>>>

Come puoi vedere, ho impostato nella stringa "var" del codice python, codice che è stato eseguito, "eval" interpreta, compila ed esegue eventuale codice sorgente contenuto nella variabile da valutare
>>> help('eval')
Help on built-in function eval in module builtins:

eval(source, globals=None, locals=None, /)
    Evaluate the given source in the context of globals and locals.
   
    The source may be a string representing a Python expression
    or a code object as returned by compile().
    The globals must be a dictionary and locals can be any mapping,
    defaulting to the current globals and locals.
    If only globals is given, locals defaults to it.

>>>

è quindi da utilizzare con consapevolezza, i risultati potrebbero essere pesanti, altrimenti.

Per la conversione di tipo delle variabili esistono apposite funzioni nella libreria di base, ti suggerirei di vedertele tutte, comprendi ciò che fanno e tienile presenti.
Nello specifico, avresti potuto utilizzare "int()"
>>> var = '10'
>>> var < 10
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    var < 10
TypeError: '<' not supported between instances of 'str' and 'int'
>>> int(var) < 10
False
>>> int(var) == 10
True


Ciao

4
Così, p.e.
>>> def max_tre_decine(value):
if value > 30: return 3
if value % 10:
return value // 10 + 1
else:
return value // 10


>>> z = max_tre_decine(25)
>>> z
3
>>>


Giacché stai inziando per hobby, leggi questo, servirà

5
Ciao @matteo

premetto che non ho nessuna  esperienza di programmazione e sto preparando un esame all'università.
Ahi!

mi stavo esercitando su classi, listelinkate e alberi... riporto uno script che sto facendo per esercitarmi ma non capisco perche mi da errore :AttributeError: 'str' object has no attribute 'val'

Il discorso è semplice, quando Tu istanzi il Tuo oggetto Lista assegni "e" alla proprietà lista.next ed è e una stringa, tipo di oggetto che NON possiede la proprietà "val"

Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> class Lista():
def __init__(self, val=None, next_e=None):
self.val = val
self.next = next_e
def __repr__(self):
return f'valore: {self.val}, prossimo: {self.next}'


>>> l = Lista('w', 'e')
>>> l
valore: w, prossimo: e
>>> type(l)
<class '__main__.Lista'>
>>> type(l.next)
<class 'str'>

P.S. : "next" è una funzione builtin di python, eviterei di usarlo quale nome di variabile

Confesso di NON essere un informatico, sono solo uno scarso autodidatta che sta cercando di apprendere python, ma stando a wikipedia una lista linkata sarebbe :
Citazione
In informatica, una lista concatenata (o linked list) è una struttura dati dinamica, tra quelle fondamentali usate nella programmazione. Consiste di una sequenza di nodi, ognuno contenente campi di dati arbitrari ed uno o due riferimenti ("link") che puntano al nodo successivo e/o precedente
... ora, cosa è l'oggetto "Lista()" da Te definito? ... sbaglierò ma così, ad orecchio, sembrerebbe che con esso Tu voglia definire un "nodo" costituente un elemento di una collezione di nodi; se così fosse la proprietà next dovrebbe puntare ad un oggetto "Lista" non ad una stringa ... abbisognerebbe, quindi, un insieme di oggetti "Lista" da referenziare, proviamo a definirne uno con il Tuo oggetto, magari che punti al Tuo nik-name
>>> nik = 'matteo.bas'
>>> linked_nik = [Lista(c) for c in nik]
>>> for i in range(len(linked_nik) -1):
linked_nik[i].next = linked_nik[i+1]


>>> linked_nik[0]
valore: m, prossimo: valore: a, prossimo: valore: t, prossimo: valore: t, prossimo: valore: e, prossimo: valore: o, prossimo: valore: ., prossimo: valore: b, prossimo: valore: a, prossimo: valore: s, prossimo: None
>>> linked_nik[6]
valore: ., prossimo: valore: b, prossimo: valore: a, prossimo: valore: s, prossimo: None
>>> type(linked_nik[0])
<class '__main__.Lista'>
>>> type(linked_nik[0].next)
<class '__main__.Lista'>
>>>

... sorprendente, vero? Ma un oggetto "Lista" è una linked list? ... qui entra in ballo la mia ignoranza, agli utenti più esperti la parola, come potremmo, comunque utilizzarlo, ad esempio per stampare il nick?, così?
>>> l = linked_nik[0]
>>> while not l.next == None:
print(l.val, end='')
l = l.next
else:
print(l.val)


matteo.bas
>>>


... discorso senz'altro da approfondire, e parecchio pure

6
PyQT / Re:passare un oggetto ad una funzione
« il: Gennaio 12, 2021, 17:09 »
...
No.
Un oggetto DEVE essere l'argomento di una funzione. Non è possibile passare a una funzione qualcosa che NON sia un oggetto. Sarebbe errore di sintassi. ...
In Python tutto è un oggetto.

Verissimo @Ric :)
Ho volutamente evitato di precisarlo allo OP, avrei dovuto digli che anche la stringa è un "oggetto", rischiando così di confondergli le idee (ricordo bene come fischiarono a me le orecchie anche di recente ;) ), a volte son meglio "piccoli passi" penso.
Per tale pensiero, ho solo cercato di far comprendere allo OP che non deve utilizzare una stringa indicante il nome di un oggetto ma l'oggetto stesso, pian piano verrà il resto (se approfondirà, certo).

7
Base / Re:problema con l'uso di una classe
« il: Gennaio 09, 2021, 16:54 »
L'output che ricevi è perfettamente regolare, descrive l'oggetto e da l'indirizzo in memoria dello stesso.

Qualora Tu voglia una rappresentazione di tipo stringa di un oggetto della classe da Te creata devi implementare nella Tua classe i metodi "__repr__" o "__str__", magari non ci sei ancora incappato ma le classi sono argomenti complessi, da affrontarsi con un buon libro.

Per altro, ho qualche perplessità circa l'algoritmo da Te implementato, giusto per farti un esempio di uso delle funzioni ho cercato di re-implementarlo dopo essermi rispolverato il vecchio libro di aritmetica (chi se lo ricorda più come si fa ;) ):
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> class Fraction:
def __init__(self, numeratore=0, denominatore=1):
if not denominatore:
raise ZeroDivisionError('Il denominatore non può essere nullo')
n = abs(numeratore)
d = abs(denominatore)
if n % d == 0:
self.numeratore = n / d
self.denominatore = 1
elif d % n == 0:
self.numeratore = 1
self.denominatore = d / n
else:
if n < d:
a = n // 2
else:
a = d // 2
while a > 1:
if n % a == 0 and d % a == 0:
n = n / a
d = d / a
a -= 1
self.numeratore = n
self.denominatore = d
if numeratore < 0:
self.numeratore = -self.numeratore
if denominatore < 0:
self.denominatore = -self.denominatore
def __str__(self):
return "numeratore %d denominatore % d" % (self.numeratore, self.denominatore)


>>> x = Fraction(3, 6)
>>> print(x)
numeratore 1 denominatore  2
>>> x = Fraction(53, 7)
>>> print(x)
numeratore 53 denominatore  7
>>> x = Fraction(21, 7)
>>> print(x)
numeratore 3 denominatore  1
>>> x = Fraction(-21, 7)
>>> print(x)
numeratore -3 denominatore  1
>>> x
<__main__.Fraction object at 0x7fc8693cb6d0>
>>> print(x.numeratore)
-3.0
>>> print(x.denominatore)
1
>>>

8
Guarda, non conosco la libreria XML, sin ora non l'ho mai usata, prendimi con le molle, ma ho dato una guardata alla docs, e visto l'esempio per lo XPath, la funzione "sarebbe" corretta SE il nodo cercato esiste ... il problema viene se il nodo cercato NON esiste, esempio, posto un file "nomi.xml" con questo contenuto :
<?xml version="1.0" encoding="UTF-8"?>
<utenti>
    <utente anni="20">
        <nome>Ema</nome>
        <cognome>Princi</cognome>
        <indirizzo>Torino</indirizzo>
    </utente>
    <utente anni="54">
        <nome>Max</nome>
        <cognome>Rossi</cognome>
        <indirizzo>Roma</indirizzo>
    </utente>
</utenti>


Il Tuo codice risponderà bene cercando un nodo esistente, p.e. "cognome", ma darà errore cercando un tag inesistente, p.e. "lavoro", vedi giù
>>> def foo(value_name):
tree = ET.parse('nomi.xml')
root = tree.getroot()
nomv = './/' + value_name
return root.find(nomv).text

>>> print(foo('cognome'))
Princi
>>> foo('lavoro')
Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    foo('lavoro')
  File "<pyshell#63>", line 5, in foo
    return root.find(nomv).text
AttributeError: 'NoneType' object has no attribute 'text'
>>>

al problema si può ovviare eseguendo una verifica preliminare assegnando il risultato ad una variabile e se questa risulta vera restituire il testo, qualcos'altro altrimenti, ovviamente bisogna prevenire un eventuale errore, p.e. così
>>> def foo(value_name):
tree = ET.parse('nomi.xml')
root = tree.getroot()
nomv = './/' + value_name
try:
cognome = root.find(nomv).text
return cognome
except AttributeError:
pass


>>> print(foo('cognome'))
Princi
>>> print(foo('lavoro'))
None
>>>


... per altro, la Tua routine si ferma sempre e comunque alla prima evenienza trovata, per averle tutte bisognerebbe utilizzare "findall()"
>>> def foo(value_name):
tree = ET.parse('nomi.xml')
root = tree.getroot()
nomv = './/' + value_name
result = []
for e in root.findall(nomv):
result.append(e.text)
return result

>>> foo('cognome')
['Princi', 'Rossi']


per ulteriori domande, la documentazione Ti riponderà meglio di me ;)

9
Base / Re:Problema ciclo while
« il: Dicembre 30, 2020, 08:38 »
Ciao @Andrea

In primo luogo, per i futuri post, evita il cross-posting, genera confusione : saluti nei saluti, problema una sola volta nella sezione giusta.
Per altro, inserisci il codice utilizzando il pulsante "pythoncode" nell'editor del post, sarà più chiaro e leggibile.

Stavo per risponderti direttamente, ma poi ho deciso di farTi un esempio basato sul Tuo codice per fornirTi materiale da vedere/pensare, intanto le domande :

domanda 1 : guardati i "tipi di variabile", anche se python non è un linguaggio fortemente tipizzato una stringa non è mai uguale ad un numero. Oltre questo, quando nel secondo ciclo hai definito "a" come stringa (s/n) essa rimarrà tale con il valore assunto dall'input, il secondo ciclo diventa sempre falso e non sarà più eseguito. Devi modificare le regole di avvio del secondo ciclo while

domanda 2 : il continue non serve a niente, nel caso in specie, per le esigenze in gioco la definizione di avvio del secondo ciclo è meglio avvenga all'esterno del ciclo, ti faccio esempio :
>>> def area_cerchio(r):
area = r**2 * 3.14
return "l'area del cerchio è di: {}".format(area)

>>> def main():
continua_calcolo = True
while continua_calcolo:
try:
r = float(input('Inserisci lunghezza raggio: '))
print(area_cerchio(r))
except ValueError:
print('Immissione errata')
a = ''
while a.lower() not in ['s', 'n']:
a = input('Fare un nuovo calcolo (s/n)? : ')
if a.lower() == 'n':
continua_calcolo = False
elif a.lower() != 's':
print('risposta non corretta!')


>>> main()
Inserisci lunghezza raggio: 1
l'area del cerchio è di: 3.14
Fare un nuovo calcolo (s/n)? : s
Inserisci lunghezza raggio: 2
l'area del cerchio è di: 12.56
Fare un nuovo calcolo (s/n)? : b
risposta non corretta!
Fare un nuovo calcolo (s/n)? : s
Inserisci lunghezza raggio: 3
l'area del cerchio è di: 28.26
Fare un nuovo calcolo (s/n)? : n
>>>

come vedi, per il secondo ciclo, definisco la variabile di controllo, immediatamente prima del suo avvio, in modo tale che NON ricada nella lista dei valori ammessi, condizione per cui il secondo ciclo si avvia o si interrompe.

Comprendi il perché delle piccole differenze, leggi la documentazione e cerca di capire perché ho utilizzato lower(), sarà utile esercizio.

Ciao :)

10
...ho un server pieno di documenti pdf, word ed excel molto importanti. Ho un secondo hard-disk che in automatica fa la copia di backup settimanale. Il server gira su linux che ha un filesystem abbastanza stabile, ma questo non è stato sufficiente ...
 Qualche suggerimento?

Ciao @Pasquale,

Incuriosito ed anche un po' preoccupato dalla Tua problematica, ho cercato di ragionarci un po' su, anche io uso linux ed ho macchine "vecchie" con notevole quantità di documenti e, pur non avendo incontrato files corrotti, ho pensato che se un file è effettivamente corrotto non si riuscirebbe ad "aprirlo", ho quindi creato un venv ed importato le librerie "PyPDF2" per i pdf, "odfpy" per files libre-office calc e writer (il grosso dei miei documenti), "python-docx" per documenti microsoft word "*.docx" (i file prima della versione 2007 sono problematici, li ho ignorati, se hai necessità guarda qua) e, infine, la libreria "openpyxl" per i file excel "*.xlsx" (stesso discorso che per word) ed ho scritto uno script che Ti propongo di seguito :

import os
import sys

# generatori per estrazioni dei files con estensioni "interessanti"
def get_files(path):
    '''Restituisce i files presenti in una directory.'''
    for f in os.listdir(path):
        f_name = os.path.join(path, f)
        if os.path.exists(f_name) and os.path.isfile(f_name):
            yield f_name

def get_dirs(path):
    '''Restituisce le directory presenti in una directory.'''
    for d in os.listdir(path):
        d_name = os.path.join(path, d)
        if os.path.exists(d_name) and os.path.isdir(d_name):
            yield d_name
   
def recursive_get_files(p_dir):
    '''Restituisce i files presenti in una directory e richiama se
       stessa sulle sub-directory contenute.'''
    yield from get_files(p_dir)
    for sub_dir in get_dirs(p_dir):
        yield from recursive_get_files(sub_dir)

def get_files_for_ext(p_dir):
    '''Esamina i file ricevuti e restituisce solo quelli che possiedono
       una delle volute estensioni.'''
    sel_extension = ['pdf', 'docx', 'docm', 'xlsx', 'odt', 'ods']
    for f in recursive_get_files(p_dir):
        ext = f.split('.')[-1]
        if ext.lower() in sel_extension:
            yield f
'''
Funzioni che verificano la funzionalità dei vari tipi di files utilizzando
librerie specifiche per la loro manipolazione : cercano di aprirli ed in
caso, restituiscono True se riescono, False altrimenti.
Queste funzioni importano localmente le librerie necessarie, per evitare di
doverle installare in caso di tipologie non interessanti, basterà modificare
aeguatamente "sel_extension" in get_files_for_ext()
'''

def open_pdf(filename):
    from PyPDF2 import PdfFileReader  # libreria : PyPDF2
    # qualunque errore da risposta negativa
    doc = None
    try:
        doc = PdfFileReader(filename, 'rb')
    except:
        return False
    finally:
        if doc: doc = None
    return True

def open_odt_ods(filename):
    from odf.opendocument import load  # libreria: odfpy
    doc = None
    try:
        doc = load(filename)
    except:
        return False
    finally:
        if doc: doc = None
    return True

def open_docx_docm(filename):
    from docx import Document
    doc = None
    try:
        doc = Document(filename)
    except:
        return False
    finally:
        if doc: doc = None
    return True

def open_xlsx(filename):
    import openpyxl
    doc = None
    try:
        doc = openpyxl.load_workbook(filename)
    except:
        return False
    finally:
        if doc: doc = None
    return True
       
       
# Valutatore di integrità; è un generatore
def valutator(p_dir):
    type_operator = {'pdf' : open_pdf,
                     'docx': open_docx_docm,
                     'docm': open_docx_docm,
                     'xlsx': open_xlsx,
                     'odt' : open_odt_ods,
                     'ods' : open_odt_ods
                     }
    # word<2003 : difficile vedi
    # http://blog.digitally-disturbed.co.uk/2012/04/reading-microsoft-word-doc-files-in.html
    for f in get_files_for_ext(p_dir):
        ext = f.split('.')[-1].lower()
        # do per scontatto che ext sia una chiave di type_operator
        if not type_operator[ext](f):
            yield f

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('Utilizzo : python[3] search_type_file.py directory')
        exit()
    p_dir = sys.argv[1]
    if not os.path.exists(p_dir) or not os.path.isdir(p_dir):
        print(p_dir, 'inesistente o non è una directory')
        exit()
    print(p_dir)
    counter = 0
    for f in get_files_for_ext(p_dir):
        counter += 1
    print('Trovati %d files, inizio esame ...' % counter)
    damaged_files = []
    for f in valutator(p_dir):
        damaged_files.append(f)
    if damaged_files:
        print('\nTrovati %d files danneggiati - Elenco :' % len(damaged_files))
        for f in damaged_files:
            print(f)

Cui ho fatto valutare la mia direttrice dei documenti di lavoro, nella quale ho documenti presenti anche da una quindicina di anni ... su 13403 file esaminati ha dato 25 segnalazioni delle quali una parte sono effettivamente files danneggiati, altri avranno, forse dei problemi ma sembrano falsi positivi, in particolare ho notato che la grossa parte delle segnalazioni sono pdf da scansione (quindi con sola immagine) molto probabilmente formattati male, ho ricevuto diversi warning sui pdf

p38b_v) NzP:~$ python search_type_files.py ~/Documenti
/home/nuzzopippo/Documenti
Trovati 13403 files, inizio esame ...
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]
UserWarning: wmf image format is not supported so the image is being dropped [drawings.py:59]
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]

Trovati 25 files danneggiati - Elenco :
/home/nuzzopippo/Documenti/Ufficio/Amministrativo/Avvocati/2017/Verbali/finali/in_pdf/verbale_04.pdf
/home/nuzzopippo/Documenti/Ufficio/Amministrativo/Forniture/Senza RUP/Acquisto_autovettura_2010/esempi/2005_01_10.pdf
...


Ho aspettato di provarlo in ufficio, dove avevo materiale più adeguato alla problematica, prima di proporti lo script ... anche se non è certo da utilizzare in modalità "automatica", consuma una notevole quantità di memoria e, comunque, alcune delle segnalazioni sono su files ancora legibili.
Spero possa esserTi utile.

Ciao

11
PyQT / Re:passare un oggetto ad una funzione
« il: Dicembre 14, 2020, 20:00 »
Un "oggetto" può essere tranquillamente parametro di una funzione.
Puoi, quindi, passare ad una funzione il Tuo "oggetto" ed all'interno di essa utilizzarne i metodi, od anche, volendo, definire anche caratteristiche "nuove" dell'oggetto stesso, ti faccio un esempio :
>>> class Subject:
def __init__(self): pass
def set_first_name(self, value):
self.first_name = value
def __str__(self):
return self.last_name + self.first_name


>>> def set_first_name(obj, name):
obj.set_first_name(name)


>>> def set_last_name(obj):
obj.last_name = 'nuzzo'


>>> oggetto = Subject()
>>> set_first_name(oggetto, 'pippo')
>>> set_last_name(oggetto)
>>> print(oggetto)
nuzzopippo
>>>


Come vedi nello stralcio di codice sopra, ho definito al volo un oggetto "Subject", una funzione cui passo una istanza dell'oggetto che provvede a richiamarne un metodo per la definizione del first_name ed un'altra funzione cui passo per parametro lo stesso oggetto che definisce una proprietà "nuova" dell'oggetto ed alla fine lo stampo, ed esce il mio nick.
NON copiare 'sti metodi così come sono, Ti darebbero errori probabilmente, sono solo un esempio di mezzi che stanno li a Tua disposizione, approfondisci le nozioni sui parametri delle funzioni e sulle classi e li vedrai.

Ciao :)

12
... cioè il server intermedio mi serve solo per comunicare ai rispettivi clienti quali sono gli IP pubblici reciproci e le sottoreti, ma poi vorrei creare una comunicazione diretta tra i due client, perchè comunque saranno solo due e non di più. E' fattibile? se si, come si fa? all'interno di una rete LAN privata lo so' fare, sul web però non ho idea

Come Ti ho detto in precedenza, non ci ho mai provato, prendimi con molle da 1 Km (e prega con me che qualche utente pratico in materia voglia intervenire sugli svarioni anche concettuali).

Dovessi farlo io, in primo luogo mi doterei di un VPS sul quale poter installare i miei programmi ... so che esistono fornitori di servizi di tal genere ma non ne ho mai cercati e non conosco eventuali prezzi.

Una volta che disponga di detto VPS mi scriverei un programmino con un socket da mettere in ascolto su di una porta, ed accetti richieste di connessione da parte di un gruppo utenti predefinito, comunichi loro indirizzo IP interessante e termini la connessione, ovviamente le comunicazioni sarebbero criptate e su IPV6, i socket python possono da lungo tempo soddisfare tali esigenze (il link è relativo a comunicazione IPV4-IPV6), ovviamente detto programmino dovrebbe poi essere messo in funzione sul VPS al suo avvio (su macchina virtuale linux sarebbe da lanciare con systemd, procedura un attimino complessa, da studiarsela nel caso)

Dici che la Tua applicazione funziona già in lan locale, dovrebbe funzionare senza grosse differenze anche con indirizzo IPV6 che, necessariamente, dovrebbe adottare, sempre di protocollo TCP-IP si tratta ... poi, ovvio, dipende anche un po' dalla Tua applicazione, da come è fatta e da cosa utilizza (librerie, intendo).
Una volta conosciuti gli indirizzi IP pubblici dei due hosts che vuoi connettere, con il client invece di connetterti con indirizzo "192.168.etc" ti connetti all'indirzzo IPV6 del server ricevuto, ovviamente re-indirizzato dal router.

Senza partire "direttamente" per il "server VPS", intanto potresti controllare la possibilità di accesso tramite internet semplicemente leggendo l'indirizzo IP pubblico del server tramite uno dei tanti servizi che To lo dicono, tipo Mio-IP.it o altri (cerca con google) e provare a connetterti da internet, dalla Tuo lan o, meglio ancora, da altra, per vedere se la Tua applicazione funziona già così com'è, ovviamente con adeguatamente impostato il re-indirizzamento sul Tuo router.

13
Ti ringrazio per la risposta. Il problema degli IP dinamici si risolve facilmente: basta acquistare un semplice servizio di hosting e metterci su un programmino java che faccia da server a cui i client si collegano e dichiarano i propri IP. Il problema invece è il trasferimento dei dati. Nel mio caso specifico vorrei fare uno streaming video ed inviare alcune semplici stringhe per controllare dei componenti elettronici. Lo streaming video credo sia la cosa più pesante da inviare, ma come la invio?? tramite http potrei inviare le stringhe di comandi ma per il video non credo sia il massimo perchè non ci sarebbe nessun tipo di compressione e soprattutto ci sarebbe una latenza enorme. Qualche idea?

Le comunicazioni, anche quelle http, sono comunque in forma binaria, se devi crearti un programma intermedio in java per smistare le comunicazioni dipende un po' da cosa Ti mette a disposizione il "servizio di hosting", se Ti è possibile avere un servizio con aperte porte a Tua discrezione per Tuoi programmi, allora credo Tu possa crearti un socket in ascolto su una porta scelta e smistarlo tra i client come un qualsiasi file, te lo "comprimi" alla fonte e lo decomprimi a destinazione raggiunta

 ... mai provata la cosa ma ipotizzando un nodo di comunicazione intermedio, quest'ultimo non potrebbe, magari.  comunicare agli host interessati i vicendevoli indirizzi IP pubblici del momento, e con questa conoscenza non potrebbero essi stabilire una connessione diretta tra loro (sempre con i router di mezzo, ovvio)?

Magari questa è una domanda per più esperti di me.

14
Multimedia / Re:Foto carte da gioco
« il: Dicembre 06, 2020, 11:09 »
Ciao :)

Il bello della programmazione è che le cose si possono affrontare in mille modi diversi, ovviamente su di un codice in corso di definizione non è bene dare "pareri", anche se, a dire il vero, non mi garbano molto due "while True" annidati.

... Per altro, guardando il Tuo codice mi è venuta in mente una possibile variante che magari potrebbe essere usata, rivoluzionerebbe, però, il codice steso, mi riferisco alla definizione del mazzo, ove magari userei una lista di dizionari, una cosa così :

>>> mazzo = []
>>> semi = ['Coppe', 'Denari', 'Mazze', 'Spade']
>>> nomi = ['Asso', 'due', 'tre', 'quattro', 'cinque',
'sei', 'sette', 'Fante', 'Cavallo', 'Re']
>>> for seme in semi:
    for voce in enumerate(nomi, start=1):
        carta = {}
        carta['seme'] = seme
        carta['nome'] = voce[1]
        if voce[0] in [8, 9, 10]:
            carta['val'] = 0.5
        else:
            carta['val'] = float(voce[0])
        mazzo.append(carta)

>>> print(len(mazzo))
40
>>> print(mazzo)
[{'seme': 'Coppe', 'nome': 'Asso', 'val': 1.0}, {'seme': 'Coppe', 'nome': 'due', 'val': 2.0}, {'seme': 'Coppe', ...

l'utilizzo di un dizionario, magari, permetterebbe di risparmiare un po' di cicli, contenendo la carta stessa il suo valore, limitandosi a riassegnare il valore della "matta" a quello scelto dal giocatore, potrebbe, forse, anche facilitare i processi di rappresentazione, una cosa così :
>>> import random
>>> random.shuffle(mazzo)
>>> print(mazzo[0])
{'seme': 'Mazze', 'nome': 'due', 'val': 2.0}
>>> def dai_carta():
global mazzo
return mazzo.pop(0) if len(mazzo) else None

>>> carta = dai_carta()
>>> carta
{'seme': 'Mazze', 'nome': 'due', 'val': 2.0}
>>> carta = dai_carta()
>>> carta
{'seme': 'Coppe', 'nome': 'Re', 'val': 0.5}
>>> len(mazzo)
38
>>> print('%s di %s, valore = %.1f' % (carta['nome'], carta['seme'], carta['val']))
Re di Coppe, valore = 0.5
>>>

Sarebbe, anche, più semplice, con un dizionario, associare alla "carta" i valori per l'eventuale "immagine", siano essi i caratteri indicati da @RicPol od anche dei riferimenti a file.
... è solo un suggerimento di approccio diversificato che mi è venuto li, tieni presente (e scusa se uso il tipo "Napoletane", con cui ho familiarità) consideralo solo come una possibile via da esplorare ;)

15
Multimedia / Re:Leggere Notifiche
« il: Dicembre 01, 2020, 17:34 »
:sarcastic: Sto creando un programma in python, ho bisogno che sia in grado di capire quando arriva una notifica e da dove, qualcuno mi può aiutare? grazie

"una notifica" ... di cosa?

Così, a pelle, sembrerebbe Tu stia parlando di un  observer, ma il contesto di applicazione possibile è enorme, oltre tutto potresti non intendere proprio contesti del genere. Precisa bene il problema.

Pagine: [1] 2 3 ... 26