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.


Topics - nuzzopippo

Pagine: [1] 2
1
Salve

Sto implementando, per mio uso, un player/organizer audio/video con capacità di ricerca ricorsiva di tal genere di files multimediali.
Per il riconoscimento, al momento, ho implementato i processi tramite "magic" che però, in fase di test si sta rivelando insoddisfacente, infatti a volte invece di riconoscere un file audio per quello che è risponde con un generico
>>> for f in f_audio:
...     print(f, ' - ', magic.from_file(f, mime=True))
...
CD1-01.mp3  -  application/octet-stream
CD1-02.mp3  -  application/octet-stream
CD1-03.mp3  -  application/octet-stream
CD1-04.mp3  -  application/octet-stream

mentre invece sono effettivamente files audio
(vlc_v) NzP:~$ file ./*
./CD1-01.mp3: Audio file with ID3 version 2.3.0
./CD1-02.mp3: Audio file with ID3 version 2.3.0
./CD1-03.mp3: Audio file with ID3 version 2.3.0
./CD1-04.mp3: Audio file with ID3 version 2.3.0

Ovviamente, la faccenda mi complica la vita.

Conoscete qualche libreria più adeguata all'obiettivo (riconoscimento tipi mime) o debbo, ohimè, rassegnarmi a valutare le estensioni?

N.B. - lo so che chi cerca trova ma tra trovare, tradurre e provare rischio di invecchiare su una ca...ta.
..

[/pythoncode]

2
Base / Pattern MVC : dubbi concettuali
« il: Settembre 27, 2021, 08:48 »
I miei saluti.

Ho realizzato l'idea venutami in questo post, "cercando" di adottare un semplice approccio tramite i pattern MVC ed observer, applicazione creata e funzionante, ha superato tutti i test che mi son venuti in mente di fare.

Nell'implementazione adottata il "Model" è un semplice oggetto "Micio" con tre proprietà : nome, immagine (filename) e descrizione ed un paio di metodi per fornire i suoi dati in formato csv oppure scriverli direttamente in un file fornito dal Controller.

La View è una interfaccia grafica tkinter che non ha contatto diretto con il model, non conosce nemmeno l'oggetto "Micio", si limita ad istanziare un oggetto "Gattario" (che sarebbe il controller) ed inviare dei messaggi (Richieste) tramite la funzione "pub" di un modulo pypubsub oltre, naturalmente, a registrare e revocare la registrazione di alcuni oggetti e metodi quali observer.

Il controller (Gattario) NON comunica direttamente con l'interfaccia grafica (tranne in un singolo caso), si limita ad intercettare delle "Richieste" pubblicate con un suo metodo sottoscritto quale observer e decodificare il messaggio inviato tramite un protocollo stabilito ad-och. Per altro il controller definisce una struttura di directory di supporto all'applicazione per lo storage dei dati ed il caching dei file-immagine, in modo che siano comunque disponibili anche se provenienti da supporti rimovibili.
Inoltre ed è questo il mio punto dubbio principale, il controller carica direttamente i dati leggendosi il file csv e memorizzando i "Micetti" in una lista ... mi chiedo se questa lista, concettualmente, dovesse far parte del "Model" o meno.

... oddio, non è che poi sia sicurissimo della correttezza formale di insieme ;) qualche parere sarebbe gradito.

Grazie dell'attenzione.

3
I miei saluti

Sto sperimentando delle GUI, in wxpython, nelle quali alcuni controlli vengono ridefiniti dinamicamente sulla base di dati ricevuti, in particolare per uno slider, così inizializzato
        self.sl_columns = wx.Slider(p_col_tools,
                                    style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS)
        self.sl_columns.SetToolTip('Imposta punto iniziale nuova colonna')

viene ridefinito l'intervallo dei valori e stabilita la frequenza dei  "tik" sulla base della massima dimensione di riga di un testo ricevuto, come nel codice sottostante
    def _def_max_len(self):
        text = self.t_text.Value
        rows = text.split('\n')
        maximo = 0
        for r in rows:
            if len(r) > maximo: maximo = len(r)
        if maximo > self.maximo:
            self.maximo = maximo
            self.sl_columns.SetRange(1, self.maximo)
            self.sl_columns.SetTickFreq(self.maximo//10)
        # aggiunge spazi ad ogni riga per raggiungere il massimo
...

l'istuzione "self.sl_columns.SetTickFreq(self.maximo//10)" fa ricevere, nel terminale, numerosi warning's come nello stralcio sotto:
(textutility.py:13055): Gtk-WARNING **: 08:08:38.633: Drawing a gadget with negative dimensions. Did you forget to allocate a size? (node indicator owner GtkScale)

(textutility.py:13055): Gtk-WARNING **: 08:08:38.633: Drawing a gadget with negative dimensions. Did you forget to allocate a size? (node mark owner GtkScale)

al momento del "ridisegno" lo slider è disabilitato.

In genere, anche se non sempre, quando ricevo dei Gtk-WARNING, indagando trovo delle improprietà/imprecisioni nel mio codice che, una volta corrette, risolvono ma nel caso in specie sto girando a tondo e non trovo dove "toppo" ... Qualcuno si è trovato dinanzi il problema e saprebbe dare suggerimenti?

Specifiche di sistema :
(p38c_v) NzP:~$ python --version
Python 3.8.10
>>> wx.version()
'4.1.0 gtk3 (phoenix) wxWidgets 3.1.4'
>>>


Grazie dell'attenzione :)

4
Base / Python & Windows : Con quali tools partire?
« il: Agosto 26, 2021, 12:04 »
I miei saluti

Dopo che per decenni ho accuratamente evitato di utilizzare i sistemi operativi Microsoft, e tutto ciò ad essi connesso, mi son deciso ad acquistare una licenza W10 Home al solo fine di provare un po' come funziona python in tale sistema, sono agli inizi ma approfondirò.

Non ho riscontrato problemi di sorta nei primi approcci di base, con un interprete python, notepad++ e powershell si va abbastanza bene, sorgono però delle "complicazioni" se provo ad utilizzare delle librerie riferenti a programmi open-source di utilità anche se questi ultimi "avrebbero" delle versioni per windows, giusto p.e. per usare wand ho installato imagemagick in windows, funziona ma nel codice python vengono richieste le librerie wingc, img2pdf richiede poppler nel sistema per installare il quale o si va con i build-tool C della microsoft (un paio di giga) o con anaconda+conda (tre giga) e così via ... raccapricciante!!!

Insomma, mi sa che andando "a naso" nel breve mi ritrovo una di quelle schermate blu (le fa ancora, win?) che a suo tempo mi hanno fatto fuggire via, fermo restando che "vorrei" utilizzare l'open-source a me familiare in windows potreste darmi qualche dritta su cosa andare a vedere per fare una configurazione adatta allo scopo e non troppo "esosa/complessa/instabile"?.

Grazie dell'attenzione :)

5
Base / [Risolto] windows : verificare integrità file
« il: Agosto 10, 2021, 10:45 »
Mi trovo nella condizione di dover passare a dei colleghi non esattamente competenti l'onere di preparare copia di alcuni dati estremamente importanti da inviarsi poi all'esterno, una volta passate "le consegne" io non potrò mai più dare una mano.
I dati sono binari e pesano alcune centinaia di megabyte, vengono creati da un programma che ho creato io  diversi decenni fa che opera in ambiente windows XP, i detti colleghi non sono all'altezza di navigare in un file-system.

Per "facilitare" le operazioni degli "eredi" sto pensando di creare una applicazione tkinter in ambiente python 3.4.1 32 bit che provveda alla copia dei files, la cui origine pre-imposterò e mi sorge il dubbio di "come" verificare la correttezza dei file copiati, in ambiente linux che di solito utilizzo verificherei la checksum ma in windows ... non ho la più pallida idea di come procedere.

Ovvio che "cercherò" ma gradirei qualche indicazione/dritta su come procedere.

Grazie dell'attenzione :)

6
Tkinter / binding e widget state : una perplessità
« il: Maggio 26, 2021, 10:18 »
I miei saluti.

Per mero esercizio sto sviluppando (in doppia versione tkinter/wxPython) una piccola applicazione mirata ad effettuare alcune "operazioni" con i pdf.

Ho definito una classe per una particolare finestra destinata a salvare/manipolare del testo estratto da un pdf, direttamente o tramite ocr, che può sussistere in due stati differenti "text" o "csv" il cui valore viene fornito quale parametro ed è memorizzato in una variabile di istanza, il secondo "stato" sussiste in una nuova istanza della classe effettuata da una finestra di stessa classe tramite un button che in condizione "csv" è disabilitato.

Il pulsante è impostato per agire tramite clic del pulsante sinistro del mouse ovvero pressione del return su tastiera o tastierino numerico nella sottostante modalità :
        # bindings
        self.bt_edit.bind('<Button-1>', self._on_edit)
        self.bt_edit.bind('<Return>', self._on_edit)
        self.bt_edit.bind('<KP_Enter>', self._on_edit)
...
    def _on_edit(self, evt):
        if self.csv_win == None or not self.csv_win.winfo_exists():
            self.csv_win = TextUtility(self, type='csv')
        self.edit = True
        self._def_max_len()
        self._evaluate_context()

Mi sono accorto che malgrado il pulsante sia disabilitato gli eventi definiti hanno comunque luogo ed una finestra in stato "csv" crea una nuova finestra nello stesso stato facendo clic sul widget disabilitato.
Pur avendo trovato facilmente varie soluzioni, l'evento anomalo non avviene se:
1 - definisco "command=self._on_edit" alla creazione del pulsante;
2 - verificando preventivamente lo stato nel callback;
3 - effettuando lo unbinding nel caso lo stato sia "csv"
        #if self.type == 'csv':
        #    self.bt_edit.unbind('<Button-1>')
        #    self.bt_edit.unbind('<Return>')
        #    self.bt_edit.unbind('<KP_Enter>')


quanto sopra mi ha sbalordito, dato che ritenevo un pulsante in condizione "disabled" non reattivo, e sto cercando di capire il "perché" accada da un paio di giorni ma non mi è riuscito di venirne a capo ... qualcuno saprebbe darmi una indicazione su dove andare a guardare?

Grazie dell'attenzione.

7
Base / Curses : è possibile sub-classare una window?
« il: Febbraio 12, 2021, 11:53 »
I miei saluti

Intrigato da un precedente post sulle carte da gioco ho cominciato ad interessarmi alla libreria curses.

Ho realizzato un semplice programma di test fornendo una pseudo interfaccia grafica ai processi di questo post, il programma funziona come progettato ma, tra le varie problematiche viste, non mi è riuscito di "trovare" un oggetto curses.Window da sub-classare, dovendo ripiegare a far essere le finestre dati di classi per la gestione, tipicamente :
class MenuBar:
    def __init__(self, win):
        self.win = win
        self.len = self.win.getmaxyx()[1]
...


Ora, è possibile che effettivamente non esistano oggetti curses.windows da poter sub-classare, così come è possibile che vi siano ed io sia stato inefficace nelle mie ricerche ... qualcuno ha conoscenze in merito per potermi illuminare?

Grazie dell'attenzione, ciao :)

8
Base / Controllo istanze di una applicazione, qualche consiglio?
« il: Novembre 06, 2020, 16:27 »
I miei saluti

Sto raccogliendo "frammenti" di notizie per cercare di progettare una applicazione a scopo di esercizio.
Tale applicazione vorrebbe essere una chat point-to-point in lan locale. Particolare, ovvio, di tale applicazione è che deve avere un socket in ascolto su una determinata porta, che provveda ad accettare eventuali richieste di connessione e provveda ad instanziare un pool di oggetti dedicati alla comunicazione e gestione del relativo protocollo
 ... tale socket di ascolto lo prevedo attivabile/disattivabile dalla interfaccia utente e deve essere unico a livello di applicazione. Tale caratteristica di unicità "credo" di aversa risolta dopo un po' di ricerche (e con molte, zoppicanti, consultazioni del data-model di python) tramite una implementazione del pattern singleton, di seguito esposta in generico esempio, per eventuali interessati e magari per eventuali critiche, se opportune
>>> class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

>>> class Foo(metaclass=Singleton):
def __init__(self):
self._x = 0
def increment(self):
self._x +=1
def value(self):
return self._x


>>> foo_one = Foo()
>>> foo_two = Foo()
>>> print('foo_one ha valore %d, foo_two ha valore %d' % (foo_one.value(), foo_two.value()))
foo_one ha valore 0, foo_two ha valore 0
>>> foo_two.increment()
>>> print('foo_one ha valore %d, foo_two ha valore %d' % (foo_one.value(), foo_two.value()))
foo_one ha valore 1, foo_two ha valore 1
>>> foo_one == foo_two
True
>>>

Credo che un modello del genere dovrebbe andare bene circa l'unicità per l'oggetto di ascolto

... ma, qui mi pongo un altro problema, motivo di questo post, l'unicità del fantomatico oggetto è motivata, essenzialmente, dal lasciare libera la porta di comunicazione che prevedo di utilizzare a tal fine, la verifica che la porta sia occupata o meno è inibita dalla volontà di lasciare in mano all'utente se essere on-line o meno. Potrebbe anche tenere aperta l'applicazione e non voler essere in ascolto ma comunque vedere chi ascolta e comunicare (è così che lo voglio implementare).

Mi sorge, di conseguenza, la necessitò di verificare se è già aperta una istanza della applicazione, essendo possibilissimo lanciare diverse istanze contemporaneamente che non si "conoscono" tra loro ma che potrebbero, eventualmente, entrare in conflitto tentando di accedere alla stessa porta.
Allo stato, non avendo trovato niente di meglio, sarei indirizzato a controllare la faccenda tramite un file di lock scritto da qualche parte, cosa non difficile ma, data la più volte constatata presenza in python di "strumenti" da me non conosciuti, mi chiedo se è previsto qualcosa in merito, che magari non mi è riuscito di trovare, o delle metodologie "canoniche" per il controllo di istanze multiple per una applicazione python.

Grazie per l'attenzione.

Ciao :)

9
Base / Valutazione tipi di variabile, ne parliamo un po'?
« il: Settembre 10, 2020, 13:47 »
Saluti a Voi :)

Pur non interessandomi molto a tkinter, ogni tanto lo riprendo in mano, al momento sto approfittando di un periodo di "stanca" per proseguire un argomento già toppato in altri post tipo questo ed in parte anche proseguito, tipo qua, in sostanza sto provando  a progettare un generico oggetto "tabella" da utilizzarsi poi in GUI tkinker.

Ora sto provando a progettare un processo, opzionale, di valutazione dei tipi di dati, ed allo stato sto prevedendo che tale valutazione venga effettuata da un oggetto di supporto alla tabella che, a richiesta, fornisca una "riga" di widget configurata, per colori, allineamenti e fonts, secondo parametri impostati, la tabella si occuperà di geometria, popolamento e binding.

Riguardo alla "definizione" delle tipologie di widget, per la valutazione, mi appoggio ad un dizionario che associa a delle "categorie" di dati vari sub-classamenti di widget
	data_types = {'text': DCEntry,        # casella di testo DCEntry allineato a destra
  'numeric': DCEntry,     # casella di testo DCEntry allineato a sinistra
  'date': DCEntry,   # casella di testo DCEntry allineato centrato
  'boolean': DCCheck,     # casella di spunta
  'image': DCCanvas,      # PhotoImage DCCanvas
  'collection': DCCombo,  # Lista, tupla o set DCCombo
  'label': DCLabel        # testo fisso DCLabel allineato a destra
}


e le chiavi del dizionario definiranno una lista definente i controlli da utilizzarsi, tale definizione può essere fornita direttamente dall'esterno oppure può esserne invocata la
definizione fornendo una lista di "oggetti" rappresentanti le tipologie dei dati da
rappresentare.

def evaluate_types(self, data):
'''
Esegue la valutazione di una riga dati per determinare il tipo di
controllo da utilizzare.

parametri : data - una lista di oggetti rappresentanti lo schema dei
                   dati da trattare.
'''
types = []
for i in len(data):
var = data[i]
if 'bool' in type(var):
types.append('boolean')
elif 'int' in type(var) or 'float' in type(var):
types.append('numeric')
elif 'datetime' in type(var):
type.append('date')
elif 'list' in type(var) or 'tuple' in type(var) or 'set' in type(var):
types.append('collection')
elif 'tkinter.PhotoImage' in type(var):
types.append('image')
else:
types.append('text')
self._style[controls][types] = types


... e qui mi son fermato a riflettere un po', in particolare inserendo la valutazione di "datetime", essendo la stessa una classe (come per altro PhotoImage) e non una tipologia builtin.
In effetti, pensandoci, non necessariamente una data proviene da un "datetime" (c'è anche "time" p.e, ol altro), così come una immagine non necessariamente è una "tkintr.PhotoImage"

... tale considerazione mi fa venire il dubbio che il tentativo di "generalizzazione" che sto cercando di fare sia troppo semplicistico, pur essendo ragionevolmente convinto che "funzionerebbe" in linea di massima.

Riferendo ai tipi di dato da valutare, in genere, Voi cosa ne pensate di un approccio di tal tipo?, pensate che vi siano ulteriori da tener presenti o migliori approcci?

Grazie per l'attenzione, ciao :)

10
wxPython / [Risolto]Installare wxPython in un venv sotto Linux
« il: Luglio 23, 2020, 11:54 »
I miei saluti.

Utilizzo una distribuzione Linux (Ubuntu 18.04) che di default utilizza la versione 3.6.9 di python (oltre la 2.7.x).
In un venv ho installato la versione "minimale" di python 3.8.0 al fine di eseguire test più conformi alle ultime caratteristiche del linguaggio.
 ... per proporre un esempio in altro forum, mi è venuto in mente di adattare un piccolo esempio di programma asincrono sviluppato in detto venv e di installare nello stesso ambiente le wx, sono sorti dei problemi che ho cercato di affrontare, in ultimo mi son bloccato seguendo i passi in questa pagina, tutto è andato bene sino al make, ma all'avvio della compilazione :
 Running command: build_py
  Checking for /tmp/pip-req-build-td89ziml/bin/waf-2.0.19...
  "/home/nuzzopippo/py_workspace/p38/p38b_v/bin/python" /tmp/pip-req-build-td89ziml/bin/waf-2.0.19 --wx_config=/tmp/pip-req-build-td89ziml/build/wxbld/gtk3/wx-config --gtk3 --python="/home/nuzzopippo/py_workspace/p38/p38b_v/bin/python" --out=build/waf/3.8/gtk3 configure build
  Setting top to                           : /tmp/pip-req-build-td89ziml
  Setting out to                           : /tmp/pip-req-build-td89ziml/build/waf/3.8/gtk3
  Checking for 'gcc' (C compiler)          : /usr/bin/gcc
  Checking for 'g++' (C++ compiler)        : /usr/bin/g++
  Checking for program 'python'            : /home/nuzzopippo/py_workspace/p38/p38b_v/bin/python
  Checking for python version >= 2.7.0     : 3.8.0
  python-config                            : not found
  Checking for library python3.8 in LIBDIR : not found
  Checking for library python3.8 in python_LIBPL : not found
  Checking for library python3.8 in $prefix/libs : not found
  Checking for library python3.8m in LIBDIR      : not found
  Checking for library python3.8m in python_LIBPL : not found
  Checking for library python3.8m in $prefix/libs : not found
  Checking for library python38 in LIBDIR         : not found
  Checking for library python38 in python_LIBPL   : not found
  Checking for library python38 in $prefix/libs   : not found
  Checking for header Python.h                    : Distutils not installed? Broken python installation? Get python-config now!
  The configuration failed
  (complete log in /tmp/pip-req-build-td89ziml/build/waf/3.8/gtk3/config.log)


Mi sembra di capire il "primo" dei problemi sia che non trovi "python-config" nell'ambiente virtuale che però era già li installato
(p38b_v) NzP:~$ pip install python-config
Requirement already satisfied: python-config in ./p38b_v/lib/python3.8/site-packages (0.1.2)
(p38b_v) NzP:~$

Ovviamente, mi ci son perso riguardo nell'insieme di librerie 3.8 non trovate ed il resto del chilometrico output a video. Purtroppo non mi è neanche riusciuscito di trovare il log del processo in "/tmp" (mancati permessi in scrittura, probabilmente) e non so che pesci prendere ... avete qualche suggerimento?

Grazie dell'attenzione :)

11
Base / Un utilizzo "strano" di locals e vars
« il: Giugno 12, 2020, 11:25 »
I miei saluti.

Intrigato dalla seguente domanda :
Citazione
E' possibile in Python creare una lista o un dizionario di tipi pronti per essere istanziati?

Ho trovato possibile risposta mediante l'utilizzo delle funzioni builtins "vars()" e "locals()", utilizzate in tale modo :

>>> class Anagrafica:
def __init__(self, cognome, nome):
self.cognome = cognome
self.nome = nome
def __str__(self):
return self.nome + ' ' + self.cognome


>>> from math import sqrt as radice_quadrata
>>> class_and_func = {'anag': 'Anagrafica',
      'rad' : 'radice_quadrata'
      }
>>> n = locals()[class_and_func['anag']]('nuzzo', 'pippo')
>>> print(n)
pippo nuzzo
>>> type(n)
<class '__main__.Anagrafica'>
>>> vars(n)
{'cognome': 'nuzzo', 'nome': 'pippo'}
>>> num = locals()[class_and_func['rad']](9)
>>> print(num)
3.0
>>>


Ora, lo scopo di entrambe le funzioni builtin citate è quello di restituire dei "dizionari", locals del "current scope's local variables", vars del dizionario di un "oggetto", come mostrato nel codice, anche se utilizzato senza argomenti funziona come locals. Circa la modalità d'uso di locals (del suo equivalente "vars()") su applicata non ho trovato documentazione.

Mi sembra evidente che spulciando il dizionario restituito da "locals()" con la chiave definita come in esempio si stia, di fatto, istanziando una classe od invocando una funziona definita nello scope locale ... niente di strano, tutto sommato ma mi chiedo se effettuare tal genere di operazioni sia una modalità "corretta" o, invece, soggetta a "complicazioni" varie.

Per altro, una certo "prurito" alle mani viene dal provare la bultin "globals" ma forse è meglio attendere pensieri più profondi dei miei ;)

12
ForumPython.it cafè / ORM : quando sono utili?
« il: Marzo 19, 2020, 08:14 »
Ciao

Dato che sto avendo un po' di tempo libero sto anche cercando di curiosare in giro e "vedere un po'" di qualcosa che non conosco per eventualmente integrarlo nelle mie prove.

Ieri sera ho iniziato a curiosare, da qui, in merito ad sqlalchemy ... roba complessa, mi sembra di capire, una astrazione che si astrae dalle specifiche dei singoli dialetti SQL dei motori di database supportati ma che richiede uno studio, tanto della libreria quanto della pianificazione riveniente dal suo uso, per molti versi anche più intenso di quello necessario ad un utilizzo diretto dello SQL, la cui conoscenza (unitamente al generico funzionamento dei db) comunque è presupposto necessario.

Certamente, un mezzo utile se si devono affrontare basi dati eterogenee ma mi viene il dubbio se e quanto possano essere utili a livello amatoriale ... mi spiego : un dilettante, seppur appassionato, avrà normalmente quale target piccoli applicativi, al più utilizzerà uno o due distinti sistemi di database (sqllite/access probabilmente) e sempre gli stessi, in tale condizioni (le mie, p.e.) vale la pena di misurarsi con dette astrazioni e sovrastrutture? E se si, perché?

Cosa ne pensate Voi, sulla questione?

Preciso che NON sto chiedendo supporto in merito, tant'è che ho postato al bar, solo di conoscere pensiero e motivazioni di chi voglia esporle, avanzato o meno che sia.

Ciao :)

13
ForumPython.it cafè / Potrebbe interessare un "tip"?
« il: Marzo 04, 2020, 20:40 »
Domanda rivolta agli "apprendisti" come me.

Recentemente ho rinverdito alcune cosette viste tempo fa ed utilizzato dei documenti Libreoffice/Openoffice writer (*.odt) come "template" da compilare poi con processi python che utilizzano la libreria odfpy, la faccenda è molto semplice per documenti a punti di inserimento fissi, un po' meno immediata se ci si propone una rappresentazione "tabellare" ma, comunque, abbastanza semplice.

So bene che la maggior parte utilizza metodi analoghi per documenti Microsoft Office, molto più diffusi e documentati, in ogni modo, da buon "linuxaro" preferisco i formati "aperti", pensate possa interessare un tip in merito a quanto sopra?

14
I miei saluti.

Mi trovo a dover risolvere, quanto prima mi riesce, un seccante problema sul lavoro. Ciò che dovrei fare, in sostanza, è creare un demone su di una debian da lanciare all'avvio che resti in ascolto su di una porta e provveda ad intermediare delle richieste di dati o di inserimento, su server PostgreSQL, oltre che compilare dei documenti in formato otd ed inviarli ai richiedenti.
La parte server dovrei scriverla in python (vorrei evitare java su quella macchina), i client saranno scritti in java (versioni windows obsolete), applicazioni desktop.

Riguardo Postgres ed i documenti otd non ho problemi, molta incertezza mi nasce in merito alle comunicazioni di rete, al momento sarei orientato verso i socket ed il multi-threading ... entrambi argomenti molto da approfondire, in particolare mi manca il "flush" nelle comunicazioni e il threading non lo ancora proprio guardato in python.

Qualcuno di Voi è a conoscenza di qualche mezzo/tecnica utile allo che possa acquisirsi con una certa "rapidità" da potermi suggerire?
(al momento è un "basta che funzioni") ;)

Grazie dell'attenzione, ciao :)

15
I miei saluti :)

Essendomi stata richiesto, in ufficio, di rendere disponibile una piccola utilità che mi hanno visto utilizzare (uno script bash) ho preso la palla al balzo per realizzarla in python (view testuale, x me, e grafica, per gli altri : ottimo per studiarsi MVC), in un giorno è mezzo ho realizzato la parte funzionale ... poi, sottovalutando la cosa, ho pensato di mettere una "ciliegina sulla torta", nella parte grafica, ossia di rendere possibile l'apertura di files (testo o pdf nel caso) con le applicazioni grafiche predefinite nel sistema.

... ci ho perso su un altro giorno (scoprendo un bel po' di cose da studiarmi), sconfortandomi sul sorgente di "platform" (solo windows ha 'na tragedia di versioni)  alla fine ho strutturato poco fa una rozza funzione sulla base di ricerche varie tutte da approfondire. La funzione sarebbe questa :

def show_file(f):
    '''
    "Cerca" di aprire un file con la applicazione grafica predefinita nel sistema

    return
    --- True se riesce ad aprirlo
        ovvero
        False se non ci riesce
    '''
    # tentativo con linux
    try:
        subprocess.run(['xdg-open', f], check=True)
        return True
    except:
        pass
    # tentativo con windows
    try:
        # os.startfile(f) # ? non esiste in os
        os.system('start ' + f)
        return True
    except:
        pass
    # forse mac?
    try:
        subprocess.call('open', f)
        return True
    except:
        pass
    # ... vabbeh, ci ho provato
    return False

Riguardo linux funziona, per windows vedrò domani (per mac chissa :( )

... Non è molto importante e certamente ho molti aspetti da approfondire ma, dato che al momento il lavoro mi lascia pochissimo tempo, se ci fosse qualche suggerimento lo ascolterei con piacere.

Grazie dell'attenzione, ciao :)

Pagine: [1] 2