Re: [Python] Programmazione web

2008-04-27 Per discussione Nicola Larosa
 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

2008-04-27 Per discussione Valentino Volonghi
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

2008-04-27 Per discussione Nicola Larosa
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

2008-04-27 Per discussione Manlio Perillo
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

2008-04-27 Per discussione Leonardo
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

2008-04-27 Per discussione Manlio Perillo
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

2008-04-27 Per discussione Y3s

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

2008-04-27 Per discussione Manlio Perillo
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

2008-04-27 Per discussione Daniele Zambelli
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)