Tag: python

  • Python: come ordinare un dizionario [dict] per chiave o per valore

    Python: come ordinare un dizionario [dict] per chiave o per valore

    In Python, i dizionari (dict) sono una struttura dati associativa che associa una chiave ad un valore (k, v):

    d = {}
    d['bart'] = 'marge'
    d['maggie'] = 'homer'
    d['milhouse'] = 'nelson'
    d['lisa'] = 'skinner'
    >>> d
    {'maggie': 'homer', 'lisa': 'skinner', 'bart': 'marge', 'milhouse': 'nelson'}
    

    Esistono due modi di ordinare un dizionario:

      • La modalità “classica” e più conosciuta: ovvero ordinare il dizionario sulla base delle chiavi che lo compongono:
    for k in sorted(d.keys()):
    print k + ' : ' + d[k]
    
    bart : marge
    lisa : skinner
    maggie : homer
    milhouse : nelson
    
      • La modalità meno conosciuta e che ho dovuto ricercare [e che quindi condivido con voi] ovvero quella di ordinare il dizionario sulla base dei valori che sono associati alle chiavi:
    sorted(d.items(), key=lambda(k,v):(v,k))
    >>> [('maggie', 'homer'), ('bart', 'marge'), ('milhouse', 'nelson'), ('lisa', 'skinner')]
    

    Come vedete questa volta abbiamo ottenuto una lista degli elementi ordinati secondo il valore associato ad ogni chiave. Può tornare utile!

    Esistono molteplici versioni di quest’ultima istruzione, ma questa ritengo che sia la più compatta e veloce.

  • 10 cose da fare dopo aver installato Ubuntu Intrepid 8.10

    Ultimamente ho reinstallato Linux sulla mia macchina principale, dopo anni in cui lo tenevo relegato in una virtual machine in VMWare. La scelta della distribuzione è ovviamente caduta su Ubuntu Intrepid 8.10.

    Subito dopo l’installazione, ho cominciato a fare un po’ di pulizia (rimuovendo quello che non mi serve e/o è inutile) e installare il software che mi serve. Trovate una rapida descrizione ed i comandi relativi (da inserire nel terminale):

    1. Togliere il supporto all’accessibilità, i giochi, il software VOIP Ekiga (uso Skype) e il client BitTorrent Trasmission (molto lento rispetto agli altri client BitTorrent):sudo apt-get autoremove --purge at-spi transmission* gnome-games-* ekiga
    2. Cambiare il refresh rate del proprio monitor al più alto valore possibile (System -> Preferences -> Screen resolution)
    3. Rimuovere il fastidiosissimo “beep” del terminale:echo "blacklist pcspkr" | sudo tee -a /etc/modprobe.d/blacklist
      (è sufficiente un reboot affinché il beep sparisca)
    4. Abilitare i repository per i software multiverse (Menu -> System -> Administration -> Software sources -> abilitare restricted, multiverse, e partner)
    5. Visualizzare i file nascosti: aprite il file browser in una directory qualsiasi e andate in Edit -> Preferences -> “Show hidden and backup files”
      (si poteva fare anche tramite gconf-editor ma perché non usare le scorciatoie quando ci sono?)
    6. Installare software utile tra cui:
      • Flash player per Firefox
      • Filezilla (client FTP)
      • Font Microsoft (utili per OpenOffice) + font terminus (li preferisco per l’utilizzo nel terminale)
      • Java Development Kit (JDK) (utile per sviluppare software Java)
      • I principali tools di sviluppo (build-essential)
      • VLC (per vedere i filmati senza installare codec)
      • Mozilla Thunderbird + Enigmail (client e-mail + supporto a PGP)
      • Alcuni plugin utili per Pidgin (client per IM multipiattaforma, GTalk, MSN, etc.)
      • Software di compressione e decompressione (rar, zip, 7z, etc.)
      • Editor di testo Emacs e vim
      • Plugin utili per nautilus, il file browser di Gnome (plugin per aprire un terminale nella directory corrente, e così via)
      • Parcellite, un clipboard manager per Gnome
      • Deluge Torrent, il client BitTorrent che preferisco
      • CVS, subversion e git come strumenti di versioning del software sviluppato
      • htop, una versione di top che presenta molte più informazioni utili rispetto alla versione standard di top
      • sysinfo, un programma che visualizza tutte le caratteristiche hardware del computer
      • TeXmaker e la relativa suite LaTeX per produrre documenti scientifici come tesi, report, etc. (ho già pubblicato un post relativo al LaTeX poco tempo fa)

      sudo apt-get install flashplugin-nonfree filezilla msttcorefonts sun-java6-bin sun-java6-javadb sun-java6-jdk sun-java6-jre sun-java6-plugin ubuntu-restricted-extras vlc vlc-data vlc-dbg vlc-nox vlc-plugin-arts vlc-plugin-esd vlc-plugin-ggi vlc-plugin-jack vlc-plugin-pulse vlc-plugin-sdl vlc-plugin-svgalib thunderbird console-terminus pidgin-plugin-pack pidgin-libnotify pidgin-extprefs pidgin-themes pidgin-encryption pidgin-sipe pidgin-librvp pidgin-guifications pidgin-hotkeys python-psyco sun-java6-fonts compizconfig-settings-manager unace rar unrar zip unzip p7zip-full p7zip-rar sharutils aish uudeview mpack lha arj cabextract file-roller ttf-larabie-straight ttf-larabie-deco mplayer-fonts xfonts-terminus-dos xfonts-terminus xfonts-terminus-oblique xfonts-mona tv-fonts ttf-tuffy ttf-sjfonts ttf-sil-padauk ttf-sil-ezra ttf-paktype ttf-georgewilliams community-themes nautilus-open-terminal terminator tilda openssh-server emacs22-gtk htop workrave vim vim-gnome vim-gui-common vim-gtk vim-python nautilus-actions nautilus-gksu nautilus-image-converter nautilus-open-terminal nautilus-script-audio-convert nautilus-script-collection-svn nautilus-script-manager nautilus-sendto nautilus-share nautilus-wallpaper parcellite deluge-torrent subversion thunderbird-gnome-support mozilla-thunderbird-enigmail subversion-tools sysinfo texmaker texlive-latex-base git-core cvs

    7. Non installiamo Eclipse e/o Netbeans tramite i repository Ubuntu perché la versione installata tramite package è troppo datata. Per installare Eclipse, ad esempio, andiamo sul sito ufficiale e scarichiamo il tar.gz, scompattiamo il tutto in /opt/eclipse ed il gioco è fatto. Per Netbeans, invece, è sufficiente scaricare l’installare e lanciarlo (chmod +x netbeans-installer.sh && sudo ./netbeans-installer.sh ).
    8. Abilitare gli effetti grafici (System -> Preferences -> Appereance -> Visual Effect -> Extra), abilitare gli hot corner e gli effetti grafici che ritenete più opportuni (ad esempio abilito Exposè, System -> Preferences -> Compiz Settings Manager -> Scale) e disabilitare la fastidiosissima resistenza delle finestre al trascinamento lontano dal bordo (System -> Preferences -> Compiz Settings Manager -> Snapping Windows -> Behaviour -> deselezionare “Edge resistance”)
    9. Abilitare il ssh keep-alive (altrimenti dopo un certo timeout la connessione ssh verso altri host verrà abbattuta): sudo echo "TCPKeepAlive yes" >> /etc/ssh/ssh_config ; sudo echo "ClientAliveInterval 60" >> /etc/ssh/ssh_config
    10. Installare il software rimanente (andate sui siti ufficiali per effettuare il download dei package autoinstallanti): Google Desktop, Google Picasa, Skype, VMWare Player, …

    Di seguito trovate un mio screenshot: non ho trasformato Ubuntu in Windows 7, infatti grazie a VMWare (e alla copia gratuita e in versione beta di Windows 7, ho potuto provare con mano il nuovo sistema operativo Microsoft.

    ubuntu_win7

  • Python: uno script per eliminare i file Thumbs.db e le cartelle .DS_Store

    Windows XP crea automaticamente un file, chiamato Thumbs.db, in tutte le cartelle che visita per salvarne la visualizzazione (dettagli, anteprima, etc.). La stessa cosa fa OSX, creando addirittura (!) una cartella dal nome .DS_Store, contenente gli stessi attributi.

    Stanco di avere il mio hard disk pieno di questi file (in Vista la gestione di questi file è intelligentemente centralizzata), ho creato uno script Python che analizza ricorsivamente una directory (specificata dall’utente) e stampa tutte le posizioni di questi file e directory indesiderati.image

    Lo script richiede esattamente due argomenti: il path da cui si vuole iniziare ad analizzare ricorsivamente la presenza di file e directory indesiderate, e una stringa che conferma l’azione: nel caso in cui l’opzione sia delete, lo script cancella i file desiderati, altrimenti stamperà soltanto le loro posizioni.

    Esempio:
    python recursiveDeleteUnwantedFilesAndDir.py C:\ print

    stampa la posizione dei i files/directory indesiderati

    python recursiveDeleteUnwantedFilesAndDir.py C:\ delete

    stampa la posizione dei i files/directory indesiderati e li elimina dal disco

    Veniamo al codice sorgente:

    import os
    import sys
    
    def recursiveDeleteUnwantedFilesAndDir(path,action):
        for root, dirs, files in os.walk(path):
            for name in files:
                if name == 'Thumbs.db':
                    print os.path.join(str(root),str(name))
                    if action == 'delete':
                        os.remove(os.path.join(str(root),str(name)))
            for name in dirs:
                if name == '.DS_Store':
                    print os.path.join(str(root),str(name))
                    if action == 'delete':
                        os.removedirs(os.path.join(str(root),str(name)))
    
    recursiveDeleteUnwantedFilesAndDir(sys.argv[1],sys.argv[2])
    

    Per scaricare lo script: recursiveDeleteUnwantedFilesAndDir.zip

  • Python: come mandare un e-mail con GMail TLS/SSL

    Mi è capitato di dover mandare un e-mail da uno script Python: quale provider utilizzare? Ovviamente GMail!

    Per questioni di spam, alcuni server SMTP non permettono di inviare e-mail senza essersi prima autenticati; nel caso di GMail, il protocollo per l’invio di mail non è il semplice SMTP in chiaro, bensì SMTP con autenticazione via TLS/SSL.

    Ecco lo script Python che vi permetterà di mandare un’e-mail con GMail tramite il vostro account GMail:

    #!/usr/bin/python
    
    import smtplib
    import time
    import datetime
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEBase import MIMEBase
    from email.MIMEText import MIMEText
    from email import Encoders
    import os
    
    gmail_user = "username@gmail.com"
    gmail_pwd = "password"
    
    def mail(to, subject, text):
    msg = MIMEMultipart()
    
    msg['From'] = gmail_user
    msg['To'] = to
    msg['Subject'] = subject
    
    msg.attach(MIMEText(text))
    
    mailServer = smtplib.SMTP("smtp.gmail.com", 587)
    mailServer.ehlo()
    mailServer.starttls()
    mailServer.ehlo()
    mailServer.login(gmail_user, gmail_pwd)
    mailServer.sendmail(gmail_user, to, msg.as_string())
    mailServer.close()
    
    file = open('body.txt','r')
    document = file.read()
    mail("dst_addr@gmail.com",
    "Subject",
    document,
    )
    
  • Python in 10 minuti

    E’ da un bel po’ di tempo che mi piacerebbe imparare il Python. Tra l’altro, le applicazioni basate su questo linguaggio di programmazione sono molto numerose.

    Ieri ho trovato quest’articolo molto interessante: propone di insegnare Python in soli 10 minuti!