Re: [Python] Programmazione web
Nicola Larosa wrote: Ah, si chiama biCking, niente a che fare con bici e moto. :-) Valentino Volonghi wrote: Il fatto e` questo... Il suo nome si presta a molti giochi di parole e il mio era uno di quelli :) Ah, non avevo colto. :-) I giochi di parole piu` famosi sono: [...] A me ne viene in mente un altro: Ian Bickering Sempre lì a criticare... Poraccio, siamo proprio dei fetenti. ;-) -- Nicola Larosa - http://www.tekNico.net/ Is there an [IT] talent shortage? Only because employers have created it. The real shortage is in good management. Without proper seeding, feeding and cultivating, the IT community withers like any other garden. - Nick Corcodilos, June 2007 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Programmazione web
On Sat, Apr 26, 2008 at 8:25 PM, Lawrence Oluyede [EMAIL PROTECTED] wrote: È una modifica che è appena stata inserita nel trunk: http://code.djangoproject.com/wiki/QuerysetRefactorBranch Talk about API change ;) -- Valentino Volonghi aka Dialtone Now running MacOS X 10.5 Home Page: http://www.twisted.it ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Programmazione web
Manlio Perillo wrote: Per il resto, come detto io ho dato una occhiata a Django un 10 mesi fa, e non ho seguito lo sviluppo (sono iscritto alla mailing list ma è troppo trafficata). Wow, *la* mailing list? B-D Non c'è una mailing list. :-) Ci sono *due* Google Groups: django-users e django-developers. Il primo è effettivamente molto trafficata, non tengo il passo neanch'io; ma il secondo non granché, siamo sui 15-20 messaggi al giorno, e alcuni thread si possono skippare tranquillamente. -- Nicola Larosa - http://www.tekNico.net/ Is there an [IT] talent shortage? Only because employers have created it. The real shortage is in good management. Without proper seeding, feeding and cultivating, the IT community withers like any other garden. - Nick Corcodilos, June 2007 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Programmazione web
Nicola Larosa ha scritto: Manlio Perillo wrote: Per il resto, come detto io ho dato una occhiata a Django un 10 mesi fa, e non ho seguito lo sviluppo (sono iscritto alla mailing list ma è troppo trafficata). Wow, *la* mailing list? B-D Non c'è una mailing list. :-) Ci sono *due* Google Groups: django-users e django-developers. Vero, sono iscritto ad entrambi e vi accedo tramite email. Il primo è effettivamente molto trafficata, non tengo il passo neanch'io; ma il secondo non granché, siamo sui 15-20 messaggi al giorno, e alcuni thread si possono skippare tranquillamente. Al momento django-users è su 5566 messaggi non letti, e django-developers su 1141 messaggi non letti :-). Ciao Manlio Perillo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Ottimizzazione codice
Salve a tutti. Sono agli inizi con Python, sto imparando grazie a varie guide trovate online, e sto iniziando ad addentrarmi nell'ottimizzazione del codice. Ora, ho scritto questo piccolo programmino (con GUI in pyGTK) che accetta dei numeri come input, ne calcola la media, e restituisce la media, il numero maggiore immesso, il numero minore, il numero più vicino alla media. Ora, vorrei dei consigli su come ottimizzare il codice, magari sostituendo qualche ciclo if con qualcosa di più performante o simili =D posto il codice: (non insultatemi perchè non c'è nemmeno un commento o una doc string xD) import pygtk pygtk.require('2.0') import gtk def Media(numeri): divisore = len(numeri) a = 0 for num in numeri: a = a + float(num) try: media = float(a) / float(divisore) return media except: return None def DistanzaDallaMedia(numero, media): numero = float(numero) distanzamedia = abs(numero - media) return distanzamedia class Finestra: def __init__(self): self.win = gtk.Window(gtk.WINDOW_TOPLEVEL) self.win.set_title(Calcolo media aritmetica) self.win.connect(destroy, self.esci) self.win.connect(delete_event, self.delete_event) self.win.set_default_size(400,300) self.vbox = gtk.VBox(0,0) self.label = gtk.Label(Inserisci qui sotto i numeri dei quali vuoi fare la media, separati da spazi.) self.entry = gtk.Entry(100) self.button = gtk.Button(Esegui, gtk.STOCK_EXECUTE) self.button.connect(clicked, self.CalcolaMedia) self.risultato = gtk.Label(Clicca su esegui, qui comparira' il risultato) self.statistiche = gtk.Label(Clicca su esegui, qui compariranno alcune statistiche) self.vbox.pack_start(self.label) self.vbox.pack_start(self.entry) self.vbox.pack_start(self.button) self.vbox.pack_start(self.risultato) self.vbox.pack_end(self.statistiche) self.win.add(self.vbox) self.win.show_all() def GetUserInput(self, widget): UserInput = widget.get_text() return UserInput def OttieniNumeri(self): UserInput = self.GetUserInput(self.entry) import string Numeri = string.split(UserInput) Numeri = map(int, Numeri) return Numeri def CalcolaMedia(self, widget): Numeri = self.OttieniNumeri() MediaCalcolata = Media(Numeri) if MediaCalcolata: self.risultato.set_text(La media calcolata equivale a + str(MediaCalcolata)) Statistiche = {} for num in Numeri: if 'maggiore' not in Statistiche.keys(): Statistiche['maggiore'] = num Statistiche['minore'] = num Statistiche['vicino_media'] = num else: if DistanzaDallaMedia(num, MediaCalcolata) DistanzaDallaMedia(Statistiche['vicino_media'], MediaCalcolata): Statistiche['vicino_media'] = num if num Statistiche['maggiore']: Statistiche['maggiore'] = num elif num Statistiche['minore']: Statistiche['minore'] = num self.StampaStatistiche(Statistiche) else: self.risultato.set_text(Devi inserire almeno un numero!) def StampaStatistiche(self, Statistiche): self.statistiche.set_text(Il numero maggiore inseirto e' + str(Statistiche['maggiore']) + \nIl numero minore inserito e' + str(Statistiche['minore']) + \nIl numero inserito piu' vicino
Re: [Python] Programmazione web
Lawrence Oluyede ha scritto: On Sun, Apr 27, 2008 at 9:50 AM, Manlio Perillo [EMAIL PROTECTED] wrote: Non che l'approccio non sia interessante ma non puoi seriamente pensare di mettere in produzione una cosa così sperimentale senza la la sicurezza che una qualsiasi patch di un qualsiasi browser non ti tolga il terreno da sotto i piedi. Scherzi vero? Non ho detto che Digest è sperimentale, ho detto che la tua idea mi sembrava tale. Ok forse sperimentale è sbagliato, onerosa forse è più corretto No, mi riferivo alla tua ipotesi che qualsiasi patch di un qualsiasi browser non ti tolga il terreno da sotto i piedi. Non è così: il fatto che il client di rimandi indietro il nonce invariato si può dire che è alla base di HTTP Digest. HTTP Digest è utile per l'autenticazione ma così com'è non mi fiderei a dargli come incarico il concetto di stato persistente. Per questo esistono i cookie, anche se c'è chi li aborre. Io li uso solo per questo genere di autenticazione No, si vede che non conosci come funziona HTTP Digest. - client accede a risorsa protetta - server manda 401, realm e nonce - client risponde con nonce, username e il resto degli hash Dettagli a parte il meccanismo è questo. Esatto. E per design non comprende il concetto di logout. Certo, come dici tu puoi ignorare gli header, ma mi sembra un hack senza un reale benefinicio, anzi. Però se mi spieghi nel dettaglio cosa intendevi sono felice di sbagliarmi :) Il metodo è semplice: quando visiti una url speciale per il logout, generi una risposta 401 marcata come stale e con un nuovo nonce che contiene, all'inizio (ad esempio), la stringa logout. Quando il client vede che la risposta è stale, computa di nuovo l'hash con il nuovo nonce (però senza richiedere la password all'utente) e rimanda indietro il nuovo nonce e gli altri campi. Quindi lato server quando vedi un nonce che comincia con logout sai che devi considerare l'utente come non autenticato. Come detto è un piccolo trucco, il browser ti sta comunque mandando le credenziali corrette. Comunque l'ho testata con tutti i browser possibili (escluso Safari) e sembra funzionare. Credimi, non avere di mezzo i cookie ed essere comunque garantiti per la sicurezza è un bel sollievo ;-). HTTP Digest ha il supporto lato client, e ti evita lo sbattimento di doverti tu preoccupare di tutto con i cookie. Peccato che l'utente debba subire la finestra del dialogo del browser per autenticarsi (ci sono anche altri problemi minori come la minore flessibilità rispetto ai cookie nella gestione dei domini, ed il fatto che è supportato solo md5 per l'hash). Ciao Manlio Perillo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Programmazione web
Il giorno 27/apr/08, alle ore 17:36, Lawrence Oluyede ha scritto: 2008/4/27 Manlio Perillo [EMAIL PROTECTED]: No, mi riferivo alla tua ipotesi che qualsiasi patch di un qualsiasi browser non ti tolga il terreno da sotto i piedi. Mi era venuto in mente che IE5 aveva problemi con HTTP Digest Forse vuoi dire IE5 aveva problemi con .* ;-) -- Antonio Valente ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Programmazione web
Lawrence Oluyede ha scritto: 2008/4/27 Manlio Perillo [EMAIL PROTECTED]: No, mi riferivo alla tua ipotesi che qualsiasi patch di un qualsiasi browser non ti tolga il terreno da sotto i piedi. Mi era venuto in mente che IE5 aveva problemi con HTTP Digest Dal codice sorgente di Apache mod_auth_digest: /* MSIE compatibility hack. MSIE has some RFC issues - doesn't * include the query string in the uri Authorization component * or when computing the response component. the second part * works out ok, since we can hash the header and get the same * result. however, the uri from the request line won't match * the uri Authorization component since the header lacks the * query string, leaving us incompatable with a (broken) MSIE. * * the workaround is to fake a query string match if in the proper * environment - BrowserMatch MSIE, for example. the cool thing * is that if MSIE ever fixes itself the simple match ought to * work and this code won't be reached anyway, even if the * environment is set. */ In effetti nella mia implementazione non uso il campo 'uri' nell'header Authorization ma il path nella request (e senza la query string): funziona su IE ma su Firefox no... devo correggerlo ;-). [...] Credimi, non avere di mezzo i cookie ed essere comunque garantiti per la sicurezza è un bel sollievo ;-). Sicuramente, magari provo questa soluzione, anche se rimangono almeno due problemi: - non è possibile dare uno stile alla finestraccia di username e password del browser Già, è così. Inoltre la finestra riporta sempre username anche se, magari, tu vuoi usare qualche altra cosa (come l'indirizzo email) per autenticare l'utente. - l'overhead del fatto che il client continua a mandare il nonce anche quando non serve Non c'è nessun overhead. Devi comunque controllare l'header Authorization per sapere se l'utente è autenticato oppure se è anonimo. L'overhead (rispetto al metodo che usi ora) è che devi rifare il login ad ogni request, ad esempio se usi un database devi fare una query ad ogni request per verificare che l'utente ha le credenziali corrette. Ma questo direi che è normale, dato che HTTP è stateless. Peccato che l'utente debba subire la finestra del dialogo del browser per autenticarsi (ci sono anche altri problemi minori come la minore flessibilità rispetto ai cookie nella gestione dei domini, ed il fatto che è supportato solo md5 per l'hash). Ecco Thanks per l'input! Di nulla, di queste cose dovrei parlarne anche al talk che presento al Pycon, anche se la discussione su HTTP Digest meriterebbe un talk tutto suo. Ciao Manlio Perillo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Ottimizzazione codice
Alle domenica 27 aprile 2008, Leonardo ha scritto: Salve a tutti. Sono agli inizi con Python, sto imparando grazie a varie guide trovate online, e sto iniziando ad addentrarmi nell'ottimizzazione del codice. Benvenuto Ora, ho scritto questo piccolo programmino (con GUI in pyGTK) che accetta dei numeri come input, ne calcola la media, e restituisce la media, il numero maggiore immesso, il numero minore, il numero più vicino alla media. Sei partito da un problema classico che dà diversi spunti di riflessione. È interessante la combinazione tra l'interfaccia grafica e gli algoritmi di elaborazione dati. Ora, vorrei dei consigli su come ottimizzare il codice, magari sostituendo qualche ciclo if con qualcosa di più performante o simili =D posto il codice: (non insultatemi perchè non c'è nemmeno un commento o una doc string xD) Qualche commento ci sta bene, di solito, ma hai usato nomi delle funzioni sufficientemente esplicativi e quindi il tuo codice è chiaro. Non ho le gtk e non ho il tempo di provare il codice che posto, per cui prendi le cose che scrivo come degli spunti per approfondire. Altro avvertimento, in lista ci sono molti programmatori più competenti di me... fa la tara a quello che scrivo. 1. ottimizzazione: Di solito è buona norma preoccuparsi delle performances di un programa più avanti... comunque ridurre le righe di codice va nella direzione di rendere il programma più semplice e di solito più efficiente. import pygtk pygtk.require('2.0') import gtk def Media(numeri): divisore = len(numeri) a = 0 for num in numeri: a = a + float(num) try: media = float(a) / float(divisore) return media except: return None 2. a lo chiamerei somma, numeri contiene già dei numeri, non c'è motivo per cui la divisione non possa funzionare a ameno che la lista sia vuota. Quindi la funzione potrebbe diventare: def Media(numeri): if not numeri: return None somma = 0 for num in numeri: somma += num return float(somma) / len(numeri) tenendo presente che Python è in grado di sommare gli elementi di una lista la funzione si può semplificare ulteriormente usando la funzione sum(lista). def DistanzaDallaMedia(numero, media): numero = float(numero) distanzamedia = abs(numero - media) return distanzamedia 3. Anche qui le cose si possono semplificare: def DistanzaDallaMedia(numero, media): return abs(numero - media) class Finestra: def __init__(self): self.win = gtk.Window(gtk.WINDOW_TOPLEVEL) self.win.set_title(Calcolo media aritmetica) self.win.connect(destroy, self.esci) self.win.connect(delete_event, self.delete_event) self.win.set_default_size(400,300) self.vbox = gtk.VBox(0,0) self.label = gtk.Label(Inserisci qui sotto i numeri dei quali vuoi fare la media, separati da spazi.) self.entry = gtk.Entry(100) self.button = gtk.Button(Esegui, gtk.STOCK_EXECUTE) self.button.connect(clicked, self.CalcolaMedia) self.risultato = gtk.Label(Clicca su esegui, qui comparira' il risultato) self.statistiche = gtk.Label(Clicca su esegui, qui compariranno alcune statistiche) self.vbox.pack_start(self.label) self.vbox.pack_start(self.entry) self.vbox.pack_start(self.button) self.vbox.pack_start(self.risultato) self.vbox.pack_end(self.statistiche) self.win.add(self.vbox) self.win.show_all() def GetUserInput(self, widget): UserInput = widget.get_text() return UserInput def OttieniNumeri(self): UserInput = self.GetUserInput(self.entry) import string Numeri = string.split(UserInput) Numeri = map(int, Numeri) return Numeri 4. Per la maggior parte dei compiti non è necessario importare string, utilizzando le funzioni in cascata si possono evitare le variabili: def OttieniNumeri(self): return map(int, self.GetUserInput(self.entry).split()) def CalcolaMedia(self, widget): Numeri = self.OttieniNumeri() MediaCalcolata = Media(Numeri)