2 novembre 2010

Installare le GTK+ su Windows

Perché dovremmo installare le gtk+ come librerie grafiche per le nostre applicazioni Windows?
Provo a spiegare in due risposte quelle che sono le mie motivazioni! Particolare a parte che amo Gnome(DE)che e completamente scritto con il toolkit GTK+ ed è multi piattaforma. Una grande spinta(a mio parere) la dà la licenza LGPL che permette allo sviluppatore di poter rilasciare le sue applicazioni, oltre che con licenza free, anche con licenza commerciale il che non e poco.

Il toolkit GTK+ oltre al linguaggio C con cui e completamente scritto ha binding per molti linguaggi quali il C++ con GTKmm, Python, Vala, Perl, Ruby e molti altri.
Io vi consiglio quello per Python, dovrete scaricare tre .exe Pygtk, PyGobject, e Pycairo, se volete anche un costruttore d' interfacce grafico scaricate anche Glade3 vi semplifica il lavoro di parecchio.


Installare le GTK+ su Windows e di una facilità disarmante, ma dovrete fare il login da amministratore.

Ecco come fare: puntiamo il nostro browser su http://www.gtk.org/ e consigliato scaricare il pacchetto tar.gz(in assenza di un comodo pacchetto .exe) ufficiale che reca la dicitura All-in-one bundles versione 2.22 salviamolo sul nostro desktop. Poi tramite risorse del compiuter andiamo in C:\ dove creeremo le cartelle opt\gtk per contenere tutto il pacchetto che andremo a scompattare con un programma come 7zip in \gtk.

Poi settiamo la variabile d'ambiente da Pannello di controllo-> Prestazioni e manutenzione-> Sistema-> premiamo la tab Avanzate-> Variabili d'ambiente e dalla maschera che appare premiamo modifica e aggiungiamo il percorso alle gtk ;C:\opt\gtk\bin come da immagine e salvate come richiesto dalle varie maschere. Tutto qui!




















Credo che come me, la maggior parte di voi voglia il tema nativo di windows, quindi create un nuovo file vuoto con nome gtkrc e salvatelo nella cartella \etc\gtk-2.0 dove al suo interno aggiungiamo il seguente testo:gtk-theme-name = "MS-Windows" e salviamo.

Per la prova del 9 ovvero se tutto e andato a posto aprite il Prompt dei comandi e scrivete gtk-demo.exe vi dovrebbe apparire la demo dimostrativa come da immagine altrimenti
verificate bene i passaggi e riprovate.













nb. se avete problemi potete contattarmi, nel mio piccolo cerchero di aiutarvi.

29 ottobre 2010

La Privacy su Facebook? Al Momento Non Esiste!

Dopo l' ennesimo cambio di Policy sulla privacy, gli utenti di Facebook che in teoria dovrebbero "sentirsi" almeno un pochino più tranquilli hanno invece un bel pò di preoccupazioni in più.

L' ultimo "giochino" per spioni, e quanti hanno interessi nel rovistare nella vostra vita virtuale(che poi tanto virtuale non è) su facebook si chiama Firesheep. Firesheep e una delle tante estensioni che rendono grande il browser Firefox.


Un ficcanaso con l' uso di firesheep, dopo avere installato Winpcap per dirottare la connessione http(via rete WI-FI) riesce a impadronirsi del vostro account facebook con pochi semplici clic.

Voglio ricordare a quanti credono di essere in una botte di ferro usando applicazioni web che il web stesso è intrisecamente insicuro.

15 settembre 2010

PIL e il Modulo Image

Se intendete svolgere elaborazione grafica con il linguaggio Python, il modo professionale di
farlo e con la libreria grafica PIL di Fredrik Lundh(www.pythonware.com).

La libreria pil e in grado di lavorare con file RGB, RGBA, TIFF, PDF, BMP, JPEG, JPG, GIF, creazione di immagini animate FLI-FLC, gestire file di tipo PostScript, e tanto altro. Per una lettura esaustiva, non vi resta che puntare alla corposa documentazione.

Ecco degli esempi con il modulo Image della libreria PIL.

1)Creare una bitmap ex novo con del testo.

2)Scrivere o disegnare su di una immagine già esistente.
Nello specifico delle semplici linee.

3)Creare una Thumbnail da una immagine esistente.


>>> import Image # importo i moduli necessari
>>> import ImageDraw
>>> output = 'Python is Magic World' # il testo
>>> size = (200, 70) # setto la grandezza della bitmap
>>> color = (0, 128, 0) # setto il colore verde in valore RGB
>>> img = Image.new('RGB', size, color) # setto la grandezza e il colore alla bitmap
>>> imgDrawer = ImageDraw.Draw(img) # creo la bitmap
>>> imgDrawer.text((8, 22), output) # creo la grandezza del testo
>>> img.show() # stampa la bitmap

la prima bitmap










>>> import Image # qui come sopra inutile replicarmi ;-)
>>> import ImageDraw
>>> output = 'Python is Magic World'
>>> size = (300, 100)
>>> color = (0, 128, 0)
>>> img = Image.new('RGB', size, color)
>>> imgDrawer = ImageDraw.Draw(img)
>>> imgDrawer.text((12, 28), output)
>>> import random # importo il modulo random per poter disegnare le linee in modo casuale
>>> lines = [] # qui crea una serie di punti in modo casuale per le linee
>>> for i in xrange(5):
... lines.append((random.randrange(img.size[0]), # il metodo randrange del modulo random assegna in modo
... random.randrange(img.size[1]))) # casuale i punti delle coordinate x, y
...
>>> imgDrawer.line(lines) # disegna le linee
>>> img.show() # stampa la bitmap

la seconda bitmap







Questo esempio e un pochino diverso dagli esempi precedenti.


Mentre nei due esempi precedenti creavamo ex novo la bitmap, in questo esempio invece usiamo una immagine già esistente, nello specifico una immagine .png che ridimensioneremo con il metodo Thumbnail, sempre del modulo Image.

>>> import Image # importo il modulo
>>> image_path = r"C:\test\snake.png" # assegno l' immagine alla variabile tramite raw string (r"path\files")
>>> image = Image.open(image_path) # apro l'immagine
>>> width, height = (150, 110) # ridimensiono l'immagine l' originale era 300x350px
>>> size = (width, height) # assegno grandezza e altezza
>>> new_image_thumbnail = r"C:\test\snake_small.png" # che sia pitone grande o pitone piccolo l' importante che pitone è
>>> image.thumbnail(size, Image.ANTIALIAS) # creo la thumbnail vera e propria con antialias ma potevamo anche bicubic bilinear ecc
>>> image.save(new_image_thumbnail) # salvo la nuova immagine "thumbnail"

l'immagine originale





















e l'immagine thumbnail ridimensionata









ps.
credo che con del codice commentato in questa maniera(oserei dire quasi in modo elementare) sia facile per molti capire come funziona questo meraviglioso linguaggio che è python, e il modo di usare questa potente libreria per le immagini
che e PIL.

26 luglio 2010

Python Piccoli Tips di Sistema Gnu/Linux

Colpa del grande caldo che non si sopporta dalle mie parti, e il rischio concreto di friggere qualche componente hardware(oltre al bagno di sudore che si fà inevitabilmente stando faccia a faccia con un monitor), ho deciso di mettere in ferie Other to Think.

Anche se ad essere sincero fino in fondo, ne approfitto, nel modo più sereno e rilassato possibile, per fare delle scelte(anche importanti) riguardanti il futuro della mia vita terrestre.

Ci rivedremo prima di settembre con qualche interessante novità Buone Vacanze a Tutti.

Ritornando ai nostri Tips, sono piccole chiamate di moduli per l' utente locale:

mediante il modulo pwd possiamo tramite il parametro name in getpwnam recuperare delle voci dal database delle password dell' utente che sono : nome, password, ID utente-gruppo, nome completo, home-directory e la shell.

In [5]: import pwd

In [6]: pwd.getpwnam('archie')
Out[6]: pwd.struct_passwd(pw_name='archie', pw_passwd='x', pw_uid=500, pw_gid=500, pw_gecos='archie dog', pw_dir='/home/archie', pw_shell='/bin/bash')


In [8]: pwd.getpwuid(500)
Out[8]: pwd.struct_passwd(pw_name='archie', pw_passwd='x', pw_uid=500, pw_gid=500, pw_gecos='archie dog', pw_dir='/home/archie', pw_shell='/bin/bash')

il modulo resource invece e utile per leggere l'utilizzo delle risorse dei processi riguardo l' utente.

qui vediamo resource con il parametro RUSAGE_SELF, che richiede per l' utente informazioni relative al solo processo corrente.


In [9]: import resource
In [11]: resource.getrusage(resource.RUSAGE_SELF)
Out[11]: resource.struct_rusage(ru_utime=0.45393, ru_stime=0.13397899999999999, ru_maxrss=12604, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=3564, ru_majflt=31, ru_nswap=0, ru_inblock=13576, ru_oublock=184, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=710, ru_nivcsw=50)


mentre quest' altro parametro RUSAGE_CHILDREN richiede informazioni sui processi figli dell' utente.

In [13]: resource.getrusage(resource.RUSAGE_CHILDREN)
Out[13]: resource.struct_rusage(ru_utime=0.0, ru_stime=0.0, ru_maxrss=0, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=0, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=0, ru_nivcsw=0)

il modulo grp è simile al modulo pwd, la differenza e quella di restituire le voci del database dei gruppi. Si possono usare come parametri name e gid, che restituiscono dati sui gruppi di appartenenza e dati riguardanti l' ID dei gruppi.

In [22]: import grp
In [24]: grp.getgrall()
Out[24]:
[grp.struct_group(gr_name='root', gr_passwd='x', gr_gid=0, gr_mem=['root']),
grp.struct_group(gr_name='bin', gr_passwd='x', gr_gid=1, gr_mem=['root', 'bin', 'daemon']),
grp.struct_group(gr_name='daemon', gr_passwd='x', gr_gid=2, gr_mem=['root', 'bin', 'daemon']),
grp.struct_group(gr_name='sys', gr_passwd='x', gr_gid=3, gr_mem=['root', 'bin', 'adm']),
grp.struct_group(gr_name='adm', gr_passwd='x', gr_gid=4, gr_mem=['root', 'adm', 'daemon']),
grp.struct_group(gr_name='tty', gr_passwd='x', gr_gid=5, gr_mem=[]),
grp.struct_group(gr_name='disk', gr_passwd='x', gr_gid=6, gr_mem=['root']),
grp.struct_group(gr_name='lp', gr_passwd='x', gr_gid=7, gr_mem=['daemon', 'lp']),
grp.struct_group(gr_name='mem', gr_passwd='x', gr_gid=8, gr_mem=[]),
grp.struct_group(gr_name='kmem', gr_passwd='x', gr_gid=9, gr_mem=[]),
grp.struct_group(gr_name='wheel', gr_passwd='x', gr_gid=10, gr_mem=['root']),
grp.struct_group(gr_name='mail', gr_passwd='x', gr_gid=12, gr_mem=['mail']),
grp.struct_group(gr_name='uucp', gr_passwd='x', gr_gid=14, gr_mem=['uucp']),
grp.struct_group(gr_name='man', gr_passwd='x', gr_gid=15, gr_mem=[]),
grp.struct_group(gr_name='games', gr_passwd='x', gr_gid=20, gr_mem=[]),
grp.struct_group(gr_name='gopher', gr_passwd='x', gr_gid=30, gr_mem=[]),
grp.struct_group(gr_name='video', gr_passwd='x', gr_gid=39, gr_mem=[]),
grp.struct_group(gr_name='dip', gr_passwd='x', gr_gid=40, gr_mem=[]),
grp.struct_group(gr_name='ftp', gr_passwd='x', gr_gid=50, gr_mem=[]),
grp.struct_group(gr_name='lock', gr_passwd='x', gr_gid=54, gr_mem=[]),
grp.struct_group(gr_name='audio', gr_passwd='x', gr_gid=63, gr_mem=[]),
grp.struct_group(gr_name='nobody', gr_passwd='x', gr_gid=99, gr_mem=[]),
grp.struct_group(gr_name='users', gr_passwd='x', gr_gid=100, gr_mem=[]),
grp.struct_group(gr_name='floppy', gr_passwd='x', gr_gid=19, gr_mem=[]),
grp.struct_group(gr_name='vcsa', gr_passwd='x', gr_gid=499, gr_mem=[]),
grp.struct_group(gr_name='avahi-autoipd', gr_passwd='x', gr_gid=498, gr_mem=[]),
grp.struct_group(gr_name='oprofile', gr_passwd='x', gr_gid=16, gr_mem=[]),
grp.struct_group(gr_name='ntp', gr_passwd='x', gr_gid=38, gr_mem=[]),
grp.struct_group(gr_name='utmp', gr_passwd='x', gr_gid=22, gr_mem=[]),
grp.struct_group(gr_name='utempter', gr_passwd='x', gr_gid=35, gr_mem=[]),
grp.struct_group(gr_name='slocate', gr_passwd='x', gr_gid=21, gr_mem=[]),
grp.struct_group(gr_name='desktop_admin_r', gr_passwd='x', gr_gid=497, gr_mem=[]),
grp.struct_group(gr_name='desktop_user_r', gr_passwd='x', gr_gid=496, gr_mem=[]),
grp.struct_group(gr_name='dbus', gr_passwd='x', gr_gid=81, gr_mem=[]),
grp.struct_group(gr_name='rpc', gr_passwd='x', gr_gid=32, gr_mem=[]),
grp.struct_group(gr_name='jackuser', gr_passwd='x', gr_gid=495, gr_mem=[]),
grp.struct_group(gr_name='nscd', gr_passwd='x', gr_gid=494, gr_mem=[]),
grp.struct_group(gr_name='rpcuser', gr_passwd='x', gr_gid=493, gr_mem=[]),
grp.struct_group(gr_name='nfsnobody', gr_passwd='x', gr_gid=65534, gr_mem=[]),
grp.struct_group(gr_name='tcpdump', gr_passwd='x', gr_gid=72, gr_mem=[]),
grp.struct_group(gr_name='ccache', gr_passwd='x', gr_gid=492, gr_mem=[]),
grp.struct_group(gr_name='cdrom', gr_passwd='x', gr_gid=11, gr_mem=[]),
grp.struct_group(gr_name='tape', gr_passwd='x', gr_gid=33, gr_mem=[]),
grp.struct_group(gr_name='dialout', gr_passwd='x', gr_gid=18, gr_mem=[]),
grp.struct_group(gr_name='avahi', gr_passwd='x', gr_gid=491, gr_mem=[]),
grp.struct_group(gr_name='mailnull', gr_passwd='x', gr_gid=489, gr_mem=[]),
grp.struct_group(gr_name='smmsp', gr_passwd='x', gr_gid=488, gr_mem=[]),
grp.struct_group(gr_name='openvpn', gr_passwd='x', gr_gid=487, gr_mem=[]),
grp.struct_group(gr_name='rtkit', gr_passwd='x', gr_gid=486, gr_mem=[]),
grp.struct_group(gr_name='apache', gr_passwd='x', gr_gid=485, gr_mem=[]),
grp.struct_group(gr_name='smolt', gr_passwd='x', gr_gid=484, gr_mem=[]),
grp.struct_group(gr_name='sshd', gr_passwd='x', gr_gid=483, gr_mem=[]),
grp.struct_group(gr_name='torrent', gr_passwd='x', gr_gid=482, gr_mem=[]),
grp.struct_group(gr_name='haldaemon', gr_passwd='x', gr_gid=481, gr_mem=[]),
grp.struct_group(gr_name='pulse', gr_passwd='x', gr_gid=480, gr_mem=[]),
grp.struct_group(gr_name='pulse-access', gr_passwd='x', gr_gid=479, gr_mem=[]),
grp.struct_group(gr_name='stapdev', gr_passwd='x', gr_gid=478, gr_mem=[]),
grp.struct_group(gr_name='stapusr', gr_passwd='x', gr_gid=477, gr_mem=[]),
grp.struct_group(gr_name='gdm', gr_passwd='x', gr_gid=476, gr_mem=[]),
grp.struct_group(gr_name='archie', gr_passwd='x', gr_gid=500, gr_mem=[]),
grp.struct_group(gr_name='abrt', gr_passwd='x', gr_gid=475, gr_mem=[]),
grp.struct_group(gr_name='stap-server', gr_passwd='x', gr_gid=155, gr_mem=[])]

Arrivederci e Buone Vacanze a Tutti! ;-)

Python Redirigere lo stream di Output

L' istruzione print non e altro che l' output del metodo sys.stdout.write. Infatti invocare una print equivale ad utilizzare sys.stdout.write(str(X) + '\n') in modo chiaro e comodo per l'utente. E cosa molto frequente usare questo "trucco" di redigere la visualizzazione dell' istruzione print riassegnandola a sys.stdout.

ecco un semplice esempio:

[archie@geek ~]$ python
Python 2.6.2 (r262:71600, Jun 4 2010, 18:28:04)
[GCC 4.4.3 20100127 (Red Hat 4.4.3-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> freeze = sys.stdout #variabile per riassegnare in seguito lo stdout
>>> sys.stdout = open('reg.txt', 'a') #redirezione dell' output al file : modo accodamento
>>> print 'bytes scritti su file'
#scrive il file su disco e lo chiude
>>> sys.stdout.close()
>>> sys.stdout = freeze #riassegna lo stdout originario
>>> print 'sono nel terminale'
sono nel terminale
>>> print open('reg.txt').read()
bytes scritti su file #print dal file su disco


redirigere l' output ad un' oggetto di tipo file tramite " >> ":

>>> file = open('reg.txt', 'w') #l' oggetto file
>>> print >> file, 'rediretto su file' #stampa su file
>>> file.close()
>>> print 'sono nel terminale' #ritorna al terminale
sono nel terminale
>>> print open('reg.txt').read() #print dal file su disco
rediretto su file

questo metodo di utilizzare lo stream dell' output, può rivelarsi particolarmente utile con sys.stderr nel redirigere l'output in un file tramite " >> " e visualizzare eventuali messaggi di errore.

Prove di Pyplot con Matplotlib

Cercando qualcosa di simile a MATLAB, stasera ho voluto installare sulla mia Linux/box la libreria Matplotlib. Niente di che, ho fatto alcune prove per vedere cosa ne usciva fuori.

Qui posto dal tutorial, un paio si screenshots(correlato dal codice) semplici, semplici, di cosa si riesca a fare tramite una funzione pyplot() del modulo matplotlib.

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()






import numpy as np
import matplotlib.pyplot as plt
ax = plt.subplot(111)
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),arrowprops=dict(facecolor='black', shrink=0.05),)
plt.ylim(-2,2)
plt.show()












































non resta che dire, più semplice di così si muore.

20 luglio 2010

Entrare in Internet con Fedora

Surfando nella rete, tra link di blog, e approdando nelle baie di post, in post mi è capitato di leggere di un utente, che dopo essere approdato nel golfo di Canonical(Lucid Lynx), da quel di Fedora, riscontrando a suo dire, con ubuntu una facilità disarmante nel collegarsi alla rete tramite il demone pppoe.

Non toccando una distro "red hat based", dai tempi della versione red hat8.0, e volendo testare quanto detto nel post sopra citato, mi sono armato di una fedora 12 nome in codice Costantine(per la precisione cè già la versione 13 più moderna)per farmene una idea personale. Quindi una volta installata Fedora trovo che per potersi collegare in rete tutto si riduce ad un paio di passaggi, nulla di più.


Se devo essere sincero, essendo deluso, molto deluso, dalla versione 10.04 di Ubuntu(e nel futuro vedo molte più stronzate di quelle attuali), sono alla ricerca di una distro per il desktop, che sia degna di essere chiamata distribuzione Gnu/Linux.

Ecco un esempio reale. Appena finita l' installazione dalla vostra Fedora aprite una shell(presumibilmente la bash), e dirigetevi verso il file ifcfg-etho.

[archie@geek ~]$ su
Password:
[root@geek archie]# cd /etc/sysconfig/network-scripts/
[root@geek archie]# gedit ifcfg-etho













poi una volta aperto il file cambiate l' ultima voce: ONBOOT=no in ONBOOT=yes. Niente di complicato vero? per chi non è avezzo con i files di configurazione per evitare errori quardate l' immagine qua sotto.













adesso basta andare alla barra superiore di Gnome e cliccate tasto destro sull'icona Applet NetworkManager. Scegliete dal piccolo menu a discesa, modifica, connessioni, seleziona sistema etho e poi modifica, scegli dsl, vi richiederà la password di root, seleziona connetti automaticamente e salva le modifiche.
Penso che non ci sia niente di tanto più complicato, dello stesso comando pppoeconf con le varie schermate da seguire che ubuntu propone.

19 luglio 2010

Internet Explorer Amico del Porno

Ieri un mio conoscente, mi porta il suo laptop con un problema che affligge la quasi totalità degli utilizzatori(maschi) di sistemi Windows.

Aveva il suo laptop incasinato da finestre popup, che proponevano piacevoli signorine dalle doti orali, che non avevano niente a che vedere con il canto.

Il suo browser, ad ogni collegamento alla rete, veniva dirottato su altrettanti siti dove ragazze di ogni parte del globo avrebbero stuzzicato la fantasia di qualsiasi uomo, che per sua "sfortuna", le pupille fossero capitate per caso su quelle pagine. Il tutto ovviamente provocato da un suo cugino che ogni tanto usa il suo laptop.

In breve.
La parte più buffa di tutto stò ambaradam(dopo averci dato dentro di anti spyware, antivirus, e di editor del registro "REGEDIT" per un bel quattro ore piene), è stato quello di scoprire, che il principale artefice di tutto stò pornazzo era IE7. Che oltre a fornire gratuitamente la TolBarPorno, non permette nemmeno la sua disistallazione(almeno all' utente medio), ma solo di disattivarla, tramite attiva o disattiva.











Da quanto visto, continuo a pensare che se vogliamo navigare in modo non dico sicuro al 100%, ma almeno navigare in un modo consapevole, dovremmo dimenticarci di Internet Explorer, e quanto meno usare uno dei browser alternativi. Meglio se Firefox, l'assenza degli ActiveX all' interno di Firefox e già cosa buona per affacciarci su internet tramite un sistema Windows.

15 giugno 2010

Django a Portata di Mouse

In giro per il web, ci si legge ancora di post(forse faziosi?)che installare, e configurare Django non sia alla portata di tutti. Bene ecco due link che risolveranno i problemi di quanti vogliono usare sia su DjangoWindows che su Gnu/Linux.

Istant Django, un .exe per sistemi windows che vi permette di avere sulla vostra macchina Django 1.1.1, Python 2.6.4, Python Imaging Library 1.1.7 con Python Imaging Library Fonts, Notepad++ 5.6.7, WinMerge 2.12.4, Mercurial 1.4.3, e Sqlite 3.6.22 in una sola botta.

Mentre DjangoStack ha un installer per Windows, MacOsx e Gnu/Linux, oltre ad tre versioni di installazioni che sono Native, Virtual Machine(virtualizzazione) e Cloud. DjangoStack oltre a Django, e Apache, vi permette di scegliere un database tra MySql, PostgreSQL, e SQLite.

Se siete interessati rivolgete i vostri browser su Istant Django e DjangoStack.

18 maggio 2010

Firefox su Lucid Lynx, Semplicemente inusabile

Ci risiamo. Anche su Lucid Lynx riscopro un vecchio alquanto antipatico bug, già incontrato nei primi tempi di Karmic Koala, che rende la navigazione un vero sconforto.

Come la chiamereste voi la user experience(crash) che Firefox per Linux nella versione 3.6.3 mi riserva ogni tot di link cliccati ?

Per fortuna almeno sino a quando il bug non sarà sistemato Crome rende la mia navigazione(almeno per ora) nel web con Lucid Lynx, molto più veloce e reattiva. Tra le altre cose ho scoperto che fare sviluppo web con Crome è molto più veloce e piacevole per via della sua apertura delle finestre in processi separati.

Mi auguro che per il futuro, alla Mozilla prendano la versione per Gnu/Linux un po più in seria considerazione, o perlomeno alla pari della versione Windows.

15 maggio 2010

PYTHON generators and iterators

Fondamentalmente gli iteratori sono degli oggetti della funzione iter(X), che definiscono il metodo __next__(), restituendo un elemento successivo fino a che non ci sono più elementi da iterare, e termina con l' eccezzione StopIteration.


>>> def soldato(spara=1): #crea una funzione con un argomento
... while True: #finchè il ciclo e vero
... yield spara*spara #yield restituisce un valore expression da usarsi su una sola riga
... spara += 1 #spara = spara + 1
...
>>> pallottole = soldato(5) #assegna le pallottole al soldato
>>> pallottole #in assenza delle parentesi mostra che pallottole è un oggetto generators

>>> pallottole.next()
25
>>> pallottole.next()
36
>>> pallottole.next()
49
>>> pallottole.next()
64
>>> pallottole.next()
81
>>> pallottole.next()
100
>>> nuove_pallottole = soldato(10) #assegnamento nuove pallottole
>>> nuove_pallottole.next()
100
>>> nuove_pallottole.next()
121
>>> nuove_pallottole.next()
196
>>> spara_tutte_le_pallottole = [pallottole.next(), nuove_pallottole.next()] #lista di pallottole
>>> spara_tutte_le_pallottole #esplode tutte le pallottole
[144, 225]
>>>

un esempio che rende molto più chiaro il modo di lavorare gli iteratori

>>> import os #importo il modulo os per aprire il file dal suo path
>>> file = open(r'C:\test\spari_a_vuoto.txt') #apro il file
>>> file.next()
'primo sparo\n'
>>> file.next()
'secondo sparo\n'
>>> file.next()
'terzo sparo\n'
>>> file.next()
'quarto sparo\n'
>>> file.next()
'quinto sparo\n'
>>> file.next()
'sesto sparo\n'
>>> file.next()
'settimo sparo\n'
>>> file.next()
'ottavo sparo\n'
>>> file.next()
'nono sparo\n'
>>> file.next()
'decimo sparo\n'
>>> file.next() #tanto per ricordarvi che quando non ci sono più elementi..
'inceppatura..'
>>> file.next() #arriva l'eccezzione StopIteration!
Traceback (most recent call last):
File "", line 1, in
StopIteration
>>>

per approfondire non resta che leggere la ralativa documentazione.

14 maggio 2010

Il Modulo os, la Funzione walk(), e L'albero Delle Directory

Attraversare l' albero delle directory con la funzione walk() del modulo os.

>>> import os
>>> global_path = (r'C:\test') #creo una variabile globale per la directory da percorrere
>>>
>>> def explode_dir(show_dir):
... return show_dir[0] + "[OK]" #[0] si riferisce sempre alla prima directory del path
...
>>> path_dir = os.walk(global_path) #crea una tupla di tre argomenti
>>> for extract in path_dir:
... explode_dir(extract) # percorre tutto l' albero della directory, stampandone la struttura
...
'C:\\test[OK]'
'C:\\test\\Beginning_Python[OK]'
'C:\\test\\Beginning_Python\\Chapter10[OK]'
'C:\\test\\Beginning_Python\\Chapter11[OK]'
'C:\\test\\Beginning_Python\\Chapter12[OK]'
'C:\\test\\Beginning_Python\\Chapter13[OK]'
'C:\\test\\Beginning_Python\\Chapter13\\exercises[OK]'
'C:\\test\\Beginning_Python\\Chapter13\\tryitout[OK]'
'C:\\test\\Beginning_Python\\Chapter14[OK]'
'C:\\test\\Beginning_Python\\Chapter15[OK]'
'C:\\test\\Beginning_Python\\Chapter16[OK]'
'C:\\test\\Beginning_Python\\Chapter16\\exercises[OK]'
'C:\\test\\Beginning_Python\\Chapter16\\listings[OK]'
'C:\\test\\Beginning_Python\\Chapter16\\tryitout[OK]'
'C:\\test\\Beginning_Python\\Chapter17[OK]'
'C:\\test\\Beginning_Python\\Chapter17\\pylame[OK]'
'C:\\test\\Beginning_Python\\Chapter19[OK]'
'C:\\test\\Beginning_Python\\Chapter21[OK]'
'C:\\test\\Beginning_Python\\Chapter21\\exercises[OK]'
'C:\\test\\Beginning_Python\\Chapter21\\listings[OK]'
'C:\\test\\Beginning_Python\\Chapter21\\listings\\cgi-bin[OK]'
'C:\\test\\Beginning_Python\\Chapter21\\tryitout[OK]'
'C:\\test\\Beginning_Python\\Chapter5[OK]'
'C:\\test\\Beginning_Python\\Chapter6[OK]'
'C:\\test\\Beginning_Python\\Chapter7[OK]'
'C:\\test\\Beginning_Python\\Chapter7\\Kitchen[OK]'
'C:\\test\\Beginning_Python\\Chapter8[OK]'
'C:\\test\\Beginning_Python\\Chapter9[OK]'
'C:\\test\\PP3E[OK]'
'C:\\test\\PP3E\\Ai[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem\\holmes[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem\\holmes\\examples[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem\\holmes\\holmes[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem\\holmes\\holmes2[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem\\holmes\\holmes3[OK]'
'C:\\test\\PP3E\\Ai\\ExpertSystem\\holmes\\kbases[OK]'
'C:\\test\\PP3E\\Ai\\TicTacToe[OK]'
'C:\\test\\PP3E\\Database[OK]'
'C:\\test\\PP3E\\Database\\SQLscripts[OK]'
'C:\\test\\PP3E\\Database\\ZODBscripts[OK]'
'C:\\test\\PP3E\\Dbase[OK]'
'C:\\test\\PP3E\\Dbase\\TableBrowser[OK]'
'C:\\test\\PP3E\\Dstruct[OK]'
'C:\\test\\PP3E\\Dstruct\\Basic[OK]'
'C:\\test\\PP3E\\Dstruct\\Classics[OK]'
'C:\\test\\PP3E\\Dstruct\\Classics\\MoreGraphs[OK]'
'C:\\test\\PP3E\\Dstruct\\OldIntro[OK]'
'C:\\test\\PP3E\\Dstruct\\TreeView[OK]'
'C:\\test\\PP3E\\Dstruct\\TreeView\\alts[OK]'
'C:\\test\\PP3E\\extras[OK]'
'C:\\test\\PP3E\\extras\\Assorted[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06\\Bigfile[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06\\PersonDB[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06\\Sumit[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06\\Tester[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06\\Tester\\Outputs[OK]'
'C:\\test\\PP3E\\extras\\BnrNov06\\Tester\\Scripts[OK]'
'C:\\test\\PP3E\\extras\\EPNov06[OK]'
'C:\\test\\PP3E\\extras\\FermAdvancedClass[OK]'
'C:\\test\\PP3E\\extras\\FermAdvancedClass\\tester[OK]'
'C:\\test\\PP3E\\extras\\FermAdvancedClass\\tester\\args[OK]'
'C:\\test\\PP3E\\extras\\FermAdvancedClass\\tester\\inputs[OK]'
'C:\\test\\PP3E\\extras\\FermAdvancedClass\\tester\\outputs[OK]'
'C:\\test\\PP3E\\extras\\FermAdvancedClass\\tester\\tests[OK]'
'C:\\test\\PP3E\\extras\\GetcoEmployeeProject[OK]'
'C:\\test\\PP3E\\extras\\GetcoEmployeeProject\\cgi-bin[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day1-system[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day2-gui-dbase[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day2-gui-dbase\\sql[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day2-gui-dbase\\zodb[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day3-internet-text[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day3-internet-text\\website[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day3-internet-text\\website\\cgi-bin[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day4-integrate-project[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day4-integrate-project\\Integrate-PP3E[OK]'
'C:\\test\\PP3E\\extras\\LosAlamosAdvancedClass\\day4-integrate-project\\Project-dbase-gui[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\BigPy[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Dbase[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Forms[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Gui1[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Integrate[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Internet[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Internet\\website[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Internet\\website\\cgi-bin[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Tester[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Tester\\outputs[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Tester\\scripts[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Text[OK]'
'C:\\test\\PP3E\\extras\\QualcommAdvClass\\Timer[OK]'
'C:\\test\\PP3E\\extras\\SeagateOct06[OK]'
'C:\\test\\PP3E\\Gui[OK]'
'C:\\test\\PP3E\\Gui\\Clock[OK]'
'C:\\test\\PP3E\\Gui\\gifs[OK]'
'C:\\test\\PP3E\\Gui\\Intro[OK]'
'C:\\test\\PP3E\\Gui\\MovingPics[OK]'
'C:\\test\\PP3E\\Gui\\PIL[OK]'
'C:\\test\\PP3E\\Gui\\PIL\\images[OK]'
'C:\\test\\PP3E\\Gui\\PIL\\images\\thumbs[OK]'
'C:\\test\\PP3E\\Gui\\ShellGui[OK]'
'C:\\test\\PP3E\\Gui\\ShellGui\\test[OK]'
'C:\\test\\PP3E\\Gui\\SlideShow[OK]'
'C:\\test\\PP3E\\Gui\\TextEditor[OK]'
'C:\\test\\PP3E\\Gui\\Tools[OK]'
'C:\\test\\PP3E\\Gui\\Tools\\BigGui[OK]'
'C:\\test\\PP3E\\Gui\\Tools\\Reload[OK]'
'C:\\test\\PP3E\\Gui\\Tour[OK]'
'C:\\test\\PP3E\\Integrate[OK]'
'C:\\test\\PP3E\\Integrate\\Embed[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\ApiClients[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Basics[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Basics\\Old[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Basics\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\HighLevelApi[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Inventory[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Inventory\\Output[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Inventory\\WithDbase[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Inventory\\WithDbase\\Data[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Inventory\\WithDbase\\Dbase[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\Inventory\\WithDbase\\Output[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\TestApi[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\TestApi\\WithPackages[OK]'
'C:\\test\\PP3E\\Integrate\\Embed\\TestApi\\WithPackages\\pkgdir[OK]'
'C:\\test\\PP3E\\Integrate\\Extend[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Cenviron[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Cenviron\\Old[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Cenviron\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Hello[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\HelloLib[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\HelloLib\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Modulator[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Stacks[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Stacks\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\Environ[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\Environ\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\Shadow[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\Shadow\\pp2e[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\swig.org.docs[OK]'
'C:\\test\\PP3E\\Integrate\\Extend\\Swig\\swig.org.docs\\SWIG and Python_files[OK]'
'C:\\test\\PP3E\\Integrate\\Mixed[OK]'
'C:\\test\\PP3E\\Integrate\\Mixed\\Exports[OK]'
'C:\\test\\PP3E\\Integrate\\Mixed\\Exports\\ClassAndMod[OK]'
'C:\\test\\PP3E\\Integrate\\Mixed\\Regist[OK]'
'C:\\test\\PP3E\\Internet[OK]'
'C:\\test\\PP3E\\Internet\\Email[OK]'
'C:\\test\\PP3E\\Internet\\Email\\mailtools[OK]'
'C:\\test\\PP3E\\Internet\\Email\\PyMailGui[OK]'
'C:\\test\\PP3E\\Internet\\Email\\PyMailGui\\etc[OK]'
'C:\\test\\PP3E\\Internet\\Email\\PyMailGui\\SavedMail[OK]'
'C:\\test\\PP3E\\Internet\\Email\\PyMailGui\\SavedParts[OK]'
'C:\\test\\PP3E\\Internet\\Email\\PyMailGui\\TempParts[OK]'
'C:\\test\\PP3E\\Internet\\Ftp[OK]'
'C:\\test\\PP3E\\Internet\\Ftp\\defunct[OK]'
'C:\\test\\PP3E\\Internet\\Ftp\\mirror[OK]'
'C:\\test\\PP3E\\Internet\\Other[OK]'
'C:\\test\\PP3E\\Internet\\Other\\Grail[OK]'
'C:\\test\\PP3E\\Internet\\Other\\HTMLgen[OK]'
'C:\\test\\PP3E\\Internet\\Other\\Jython[OK]'
'C:\\test\\PP3E\\Internet\\Other\\PSP[OK]'
'C:\\test\\PP3E\\Internet\\Other\\Win[OK]'
'C:\\test\\PP3E\\Internet\\Other\\XML[OK]'
'C:\\test\\PP3E\\Internet\\Other\\Zope[OK]'
'C:\\test\\PP3E\\Internet\\Sockets[OK]'
'C:\\test\\PP3E\\Internet\\Web[OK]'
'C:\\test\\PP3E\\Internet\\Web\\cgi-bin[OK]'
'C:\\test\\PP3E\\Internet\\Web\\dev[OK]'
'C:\\test\\PP3E\\Internet\\Web\\dev\\PyMailCGI_2.1[OK]'
'C:\\test\\PP3E\\Internet\\Web\\dev\\PyMailCGI_2.1\\cgi-bin[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\AdminTools[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\AdminTools\\DbaseFilesIndexed[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\AdminTools\\DbaseFilesIndexed\\commentDB[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\AdminTools\\DbaseFilesIndexed\\errataDB[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\AdminTools\\temp[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\Chapter[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\DbaseFiles[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\DbaseFiles\\commentDB[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\DbaseFiles\\errataDB[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\DbaseShelve[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyErrata\\Mutex[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyMailCgi[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyMailCgi\\cgi-bin[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyMailCgi\\partsdownload[OK]'
'C:\\test\\PP3E\\Internet\\Web\\PyMailCgi\\partsupload[OK]'
'C:\\test\\PP3E\\Internet\\Web\\uploads[OK]'
'C:\\test\\PP3E\\Lang[OK]'
'C:\\test\\PP3E\\Lang\\Calculator[OK]'
'C:\\test\\PP3E\\Lang\\Parser[OK]'
'C:\\test\\PP3E\\Preview[OK]'
'C:\\test\\PP3E\\Preview\\cgi-bin[OK]'
'C:\\test\\PP3E\\PyTools[OK]'
'C:\\test\\PP3E\\System[OK]'
'C:\\test\\PP3E\\System\\App[OK]'
'C:\\test\\PP3E\\System\\App\\Bases[OK]'
'C:\\test\\PP3E\\System\\App\\Clients[OK]'
'C:\\test\\PP3E\\System\\App\\Clients\\test[OK]'
'C:\\test\\PP3E\\System\\App\\Clients\\test\\unpack[OK]'
'C:\\test\\PP3E\\System\\App\\Clients\\test\\unpackapp[OK]'
'C:\\test\\PP3E\\System\\App\\Kinds[OK]'
'C:\\test\\PP3E\\System\\App\\Tests[OK]'
'C:\\test\\PP3E\\System\\Environment[OK]'
'C:\\test\\PP3E\\System\\Exits[OK]'
'C:\\test\\PP3E\\System\\Filetools[OK]'
'C:\\test\\PP3E\\System\\Media[OK]'
'C:\\test\\PP3E\\System\\Processes[OK]'
'C:\\test\\PP3E\\System\\Streams[OK]'
'C:\\test\\PP3E\\System\\Threads[OK]'
'C:\\test\\PP3E\\TempParts[OK]'
'C:\\test\\tooltip[OK]'
'C:\\test\\tooltip\\images[OK]'
'C:\\test\\vari[OK]'
'C:\\test\\vari\\PP3E-Examples-1.2[OK]'
>>>

un altro semplice esempio:

mettiamo il caso che volessimo trovare una particolare estensione di file, in una alberatura di directory a noi giа nota, sempre tramite il nostro fidato modulo os, e la funzione find() e walk(). Non resta che importare il modulo os, e creare una funzione con tre argomenti, i quali saranno: il tipo di estensione .pyw che nel caso specifico(win32), serve a non eseguire il prompt dei comandi in contemporanea con il programma python. Le directory, e i nomi dei files.pyw che ricercheremo.

Assegnare una variabile, da poter iterare tramite un ciclo if, dove con la funzione find() viene ricercato il file. La "magia",se cosi possiamo definirla, sta tutta nella chiamata alla funzione, os.path.walk() che esegue una tupla di tre elementi che richiamano il percorso delle directory(path), la funzione stessa(search_function), e la lista dei nomi di files con l' estensione da noi ricercata(pyw).


>>> import os
>>> def search_function(pyw, dir, files):
... file_extension = 'pyw'
... if file_extension == 1:
... os.find(file_extension)
... print dir, file_extension
...
>>> os.path.walk(r'C:\test\PP3E', search_function, '.pyw')
C:\test\PP3E pyw
C:\test\PP3E\Ai pyw
C:\test\PP3E\Ai\ExpertSystem pyw
C:\test\PP3E\Ai\ExpertSystem\holmes pyw
C:\test\PP3E\Ai\ExpertSystem\holmes\examples pyw
C:\test\PP3E\Ai\ExpertSystem\holmes\holmes pyw
C:\test\PP3E\Ai\ExpertSystem\holmes\holmes2 pyw
C:\test\PP3E\Ai\ExpertSystem\holmes\holmes3 pyw
C:\test\PP3E\Ai\ExpertSystem\holmes\kbases pyw
C:\test\PP3E\Ai\TicTacToe pyw
C:\test\PP3E\Database pyw
C:\test\PP3E\Database\SQLscripts pyw
C:\test\PP3E\Database\ZODBscripts pyw
C:\test\PP3E\Dbase pyw
C:\test\PP3E\Dbase\TableBrowser pyw
C:\test\PP3E\Dstruct pyw
C:\test\PP3E\Dstruct\Basic pyw
C:\test\PP3E\Dstruct\Classics pyw
C:\test\PP3E\Dstruct\Classics\MoreGraphs pyw
C:\test\PP3E\Dstruct\OldIntro pyw
C:\test\PP3E\Dstruct\TreeView pyw
C:\test\PP3E\Dstruct\TreeView\alts pyw
C:\test\PP3E\extras pyw
C:\test\PP3E\extras\Assorted pyw
C:\test\PP3E\extras\BnrNov06 pyw
C:\test\PP3E\extras\BnrNov06\Bigfile pyw
C:\test\PP3E\extras\BnrNov06\PersonDB pyw
C:\test\PP3E\extras\BnrNov06\Sumit pyw
C:\test\PP3E\extras\BnrNov06\Tester pyw
C:\test\PP3E\extras\BnrNov06\Tester\Outputs pyw
C:\test\PP3E\extras\BnrNov06\Tester\Scripts pyw
C:\test\PP3E\extras\EPNov06 pyw
C:\test\PP3E\extras\FermAdvancedClass pyw
C:\test\PP3E\extras\FermAdvancedClass\tester pyw
C:\test\PP3E\extras\FermAdvancedClass\tester\args pyw
C:\test\PP3E\extras\FermAdvancedClass\tester\inputs pyw
C:\test\PP3E\extras\FermAdvancedClass\tester\outputs pyw
C:\test\PP3E\extras\FermAdvancedClass\tester\tests pyw
C:\test\PP3E\extras\GetcoEmployeeProject pyw
C:\test\PP3E\extras\GetcoEmployeeProject\cgi-bin pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day1-system pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day2-gui-dbase pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day2-gui-dbase\sql pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day2-gui-dbase\zodb pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day3-internet-text pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day3-internet-text\website pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day3-internet-text\website\cgi-bin pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day4-integrate-project pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day4-integrate-project\Integrate-PP3E pyw
C:\test\PP3E\extras\LosAlamosAdvancedClass\day4-integrate-project\Project-dbase-gui pyw
C:\test\PP3E\extras\QualcommAdvClass pyw
C:\test\PP3E\extras\QualcommAdvClass\BigPy pyw
C:\test\PP3E\extras\QualcommAdvClass\Dbase pyw
C:\test\PP3E\extras\QualcommAdvClass\Forms pyw
C:\test\PP3E\extras\QualcommAdvClass\Gui1 pyw
C:\test\PP3E\extras\QualcommAdvClass\Integrate pyw
C:\test\PP3E\extras\QualcommAdvClass\Internet pyw
C:\test\PP3E\extras\QualcommAdvClass\Internet\website pyw
C:\test\PP3E\extras\QualcommAdvClass\Internet\website\cgi-bin pyw
C:\test\PP3E\extras\QualcommAdvClass\Tester pyw
C:\test\PP3E\extras\QualcommAdvClass\Tester\outputs pyw
C:\test\PP3E\extras\QualcommAdvClass\Tester\scripts pyw
C:\test\PP3E\extras\QualcommAdvClass\Text pyw
C:\test\PP3E\extras\QualcommAdvClass\Timer pyw
C:\test\PP3E\extras\SeagateOct06 pyw
C:\test\PP3E\Gui pyw
C:\test\PP3E\Gui\Clock pyw
C:\test\PP3E\Gui\gifs pyw
C:\test\PP3E\Gui\Intro pyw
C:\test\PP3E\Gui\MovingPics pyw
C:\test\PP3E\Gui\PIL pyw
C:\test\PP3E\Gui\PIL\images pyw
C:\test\PP3E\Gui\PIL\images\thumbs pyw
C:\test\PP3E\Gui\ShellGui pyw
C:\test\PP3E\Gui\ShellGui\test pyw
C:\test\PP3E\Gui\SlideShow pyw
C:\test\PP3E\Gui\TextEditor pyw
C:\test\PP3E\Gui\Tools pyw
C:\test\PP3E\Gui\Tools\BigGui pyw
C:\test\PP3E\Gui\Tools\Reload pyw
C:\test\PP3E\Gui\Tour pyw
C:\test\PP3E\Integrate pyw
C:\test\PP3E\Integrate\Embed pyw
C:\test\PP3E\Integrate\Embed\ApiClients pyw
C:\test\PP3E\Integrate\Embed\Basics pyw
C:\test\PP3E\Integrate\Embed\Basics\Old pyw
C:\test\PP3E\Integrate\Embed\Basics\pp2e pyw
C:\test\PP3E\Integrate\Embed\HighLevelApi pyw
C:\test\PP3E\Integrate\Embed\Inventory pyw
C:\test\PP3E\Integrate\Embed\Inventory\Output pyw
C:\test\PP3E\Integrate\Embed\Inventory\WithDbase pyw
C:\test\PP3E\Integrate\Embed\Inventory\WithDbase\Data pyw
C:\test\PP3E\Integrate\Embed\Inventory\WithDbase\Dbase pyw
C:\test\PP3E\Integrate\Embed\Inventory\WithDbase\Output pyw
C:\test\PP3E\Integrate\Embed\TestApi pyw
C:\test\PP3E\Integrate\Embed\TestApi\WithPackages pyw
C:\test\PP3E\Integrate\Embed\TestApi\WithPackages\pkgdir pyw
C:\test\PP3E\Integrate\Extend pyw
C:\test\PP3E\Integrate\Extend\Cenviron pyw
C:\test\PP3E\Integrate\Extend\Cenviron\Old pyw
C:\test\PP3E\Integrate\Extend\Cenviron\pp2e pyw
C:\test\PP3E\Integrate\Extend\Hello pyw
C:\test\PP3E\Integrate\Extend\HelloLib pyw
C:\test\PP3E\Integrate\Extend\HelloLib\pp2e pyw
C:\test\PP3E\Integrate\Extend\Modulator pyw
C:\test\PP3E\Integrate\Extend\Stacks pyw
C:\test\PP3E\Integrate\Extend\Stacks\pp2e pyw
C:\test\PP3E\Integrate\Extend\Swig pyw
C:\test\PP3E\Integrate\Extend\Swig\Environ pyw
C:\test\PP3E\Integrate\Extend\Swig\Environ\pp2e pyw
C:\test\PP3E\Integrate\Extend\Swig\pp2e pyw
C:\test\PP3E\Integrate\Extend\Swig\Shadow pyw
C:\test\PP3E\Integrate\Extend\Swig\Shadow\pp2e pyw
C:\test\PP3E\Integrate\Extend\Swig\swig.org.docs pyw
C:\test\PP3E\Integrate\Extend\Swig\swig.org.docs\SWIG and Python_files pyw
C:\test\PP3E\Integrate\Mixed pyw
C:\test\PP3E\Integrate\Mixed\Exports pyw
C:\test\PP3E\Integrate\Mixed\Exports\ClassAndMod pyw
C:\test\PP3E\Integrate\Mixed\Regist pyw
C:\test\PP3E\Internet pyw
C:\test\PP3E\Internet\Email pyw
C:\test\PP3E\Internet\Email\mailtools pyw
C:\test\PP3E\Internet\Email\PyMailGui pyw
C:\test\PP3E\Internet\Email\PyMailGui\etc pyw
C:\test\PP3E\Internet\Email\PyMailGui\SavedMail pyw
C:\test\PP3E\Internet\Email\PyMailGui\SavedParts pyw
C:\test\PP3E\Internet\Email\PyMailGui\TempParts pyw
C:\test\PP3E\Internet\Ftp pyw
C:\test\PP3E\Internet\Ftp\defunct pyw
C:\test\PP3E\Internet\Ftp\mirror pyw
C:\test\PP3E\Internet\Other pyw
C:\test\PP3E\Internet\Other\Grail pyw
C:\test\PP3E\Internet\Other\HTMLgen pyw
C:\test\PP3E\Internet\Other\Jython pyw
C:\test\PP3E\Internet\Other\PSP pyw
C:\test\PP3E\Internet\Other\Win pyw
C:\test\PP3E\Internet\Other\XML pyw
C:\test\PP3E\Internet\Other\Zope pyw
C:\test\PP3E\Internet\Sockets pyw
C:\test\PP3E\Internet\Web pyw
C:\test\PP3E\Internet\Web\cgi-bin pyw
C:\test\PP3E\Internet\Web\dev pyw
C:\test\PP3E\Internet\Web\dev\PyMailCGI_2.1 pyw
C:\test\PP3E\Internet\Web\dev\PyMailCGI_2.1\cgi-bin pyw
C:\test\PP3E\Internet\Web\PyErrata pyw
C:\test\PP3E\Internet\Web\PyErrata\AdminTools pyw
C:\test\PP3E\Internet\Web\PyErrata\AdminTools\DbaseFilesIndexed pyw
C:\test\PP3E\Internet\Web\PyErrata\AdminTools\DbaseFilesIndexed\commentDB pyw
C:\test\PP3E\Internet\Web\PyErrata\AdminTools\DbaseFilesIndexed\errataDB pyw
C:\test\PP3E\Internet\Web\PyErrata\AdminTools\temp pyw
C:\test\PP3E\Internet\Web\PyErrata\Chapter pyw
C:\test\PP3E\Internet\Web\PyErrata\DbaseFiles pyw
C:\test\PP3E\Internet\Web\PyErrata\DbaseFiles\commentDB pyw
C:\test\PP3E\Internet\Web\PyErrata\DbaseFiles\errataDB pyw
C:\test\PP3E\Internet\Web\PyErrata\DbaseShelve pyw
C:\test\PP3E\Internet\Web\PyErrata\Mutex pyw
C:\test\PP3E\Internet\Web\PyMailCgi pyw
C:\test\PP3E\Internet\Web\PyMailCgi\cgi-bin pyw
C:\test\PP3E\Internet\Web\PyMailCgi\partsdownload pyw
C:\test\PP3E\Internet\Web\PyMailCgi\partsupload pyw
C:\test\PP3E\Internet\Web\uploads pyw
C:\test\PP3E\Lang pyw
C:\test\PP3E\Lang\Calculator pyw
C:\test\PP3E\Lang\Parser pyw
C:\test\PP3E\Preview pyw
C:\test\PP3E\Preview\cgi-bin pyw
C:\test\PP3E\PyTools pyw
C:\test\PP3E\System pyw
C:\test\PP3E\System\App pyw
C:\test\PP3E\System\App\Bases pyw
C:\test\PP3E\System\App\Clients pyw
C:\test\PP3E\System\App\Clients\test pyw
C:\test\PP3E\System\App\Clients\test\unpack pyw
C:\test\PP3E\System\App\Clients\test\unpackapp pyw
C:\test\PP3E\System\App\Kinds pyw
C:\test\PP3E\System\App\Tests pyw
C:\test\PP3E\System\Environment pyw
C:\test\PP3E\System\Exits pyw
C:\test\PP3E\System\Filetools pyw
C:\test\PP3E\System\Media pyw
C:\test\PP3E\System\Processes pyw
C:\test\PP3E\System\Streams pyw
>>>