30 dic 2010

ElementTree: primi test!

Sto un po' giocherellando con la classe ElementTree, libreria di Python che serve a semplificare la gestione dei documenti XML.

Questo codice scansiona alcuni documenti di esempio e li scrive nella console, strutturati ad albero:

from elementtree.ElementTree import Element
from elementtree.ElementTree import parse
import urllib

proxies = {'http': 'http://proxy:80'}

def scanNode(node, depth):
  for element in node.getchildren():
    if element.text and element.text.strip():
      print "  "*depth + element.tag, "(" + element.text + ")"
    else:
      print "  "*depth + element.tag
    if element.getchildren():
      scanNode(element, depth+1)

def parseTree(url):
  print "--] Parsing di " + url + " [--"
  tree = parse(urllib.urlopen(url, proxies=proxies))

  print tree.getroot().tag
  scanNode(tree.getroot(), 2)
  print

def main():
  parseTree("http://www.w3schools.com/xml/note.xml")
  parseTree("http://www.w3schools.com/xml/cd_catalog.xml")
  parseTree("http://www.w3schools.com/xml/plant_catalog.xml")
  parseTree("http://www.w3schools.com/xml/simple.xml")
  
if __name__ == "__main__":
    main()

Semplice semplice, ma lo scrivo qui perché mi può sempre servire!

19 dic 2010

Unix e le password di default...

Qualche settimana fa ricevo un avviso automatico che segnala un probabile malfunzionamento ad un apparato hardware che abbiamo in sala macchine.
Ora, generalmente non mi occupo di queste cose, ma visto che in ufficio non c'era nessun altro prendo in carico la segnalazione e chiamo l'assistenza:

Tecnico help desk: Sì, sembrerebbe proprio un guasto hardware, se è così faccio subito uscire un tecnico per la riparazione. Possiamo fare un po' di troubleshooting per avere conferma che si tratti di proprio un guasto hardware?
Io: Certamente... ma mi deve spiegare come fare perché non è un apparato che conosco o che gestisco io!
Tecnico help desk: Allora intanto si colleghi alla console....
Io: Va bene! Mi dia un attimo di tempo che devo recuperare la password...
Tecnico help desk: La password? Nessun problema, quella gliela posso comunicare io!
Io: Ah, però! Conoscete le password degli apparati dei clienti? Che efficienza! :-)
Tecnico help desk: Allora, le detto le credenziali: l'utente è root, e la password abcde123
Io: Ehm, abcde123? Ma cos'è? La password di default?? Perché c'è una leggera probabilità che nella nostra azienda le password di default vengano modificate...
Tecnico help desk: (silenzio)
Io: Ehm, ma è la prima volta che vi capita un cliente che modifica la password dei propri apparati?
Tecnico help desk: (silenzio)

Una volta recuperata la vera password, ed una volta confermato il guasto hardware, nel giro di un paio d'ore arriva il tecnico on site:

Tecnico on site: Questo è il pezzo da sostituire. Ora dobbiamo entrare nella console e disabilitare quello guasto prima di scollegarlo.
Io: OK, mi collego alla console...
Tecnico on site: Perfetto... l'utente è root e la password è abcde123....

Sistemato anche questo, chiamo il nostro consulente e chiedo conferma che il problema sia stato risolto:

Consulente: Allora! Prima di lasciare andare via il tecnico, puoi fare qualche controllo?
Io: Certamente! Basta che mi spieghi come fare...
Consulente: Allora, ti colleghi alla console, la password è abcde123 e....

Uhm! Ho l'impressione che nel mondo Unix la sicurezza non sia sempre presa molto sul serio...

16 dic 2010

Bejeweled: determinare se ci sono ancora mosse disponibili

Come determinare se in una partita di Bejeweled ci sono ancora delle mosse disponibili?

L'input della funzione è una matrice MxN in cui il valore rappresenta uno dei colori.

Per stabilire se ci siano ancora mosse possibili, ho pensato sia sufficiente ricercare nella matrice se ci sono tre pattern fissi, e naturalmente i relativi pattern inversi, che però sono già compresi se effettuo il controllo in tutte e quattro le direzioni.

I pattern sono i seguenti:

XXyX

XyX
 X

XXy
  X

Ed y deve essere diversa da X, oppure si può ignorare? Io voglio che sia diversa, casomai basta eliminare il confronto!

Poi ho pensato che invece di verificare a mano se le coordinate sono fuori dalla matrice, ci starebbe bene un bel TRY...EXCEPTION! Provo a cercare il pattern... se viene sollevata un'eccezione, vuol dire che il pattern non c'è! Spero non sia un sacrilegio... sono pigro lo so... però è il modo migliore per rendere leggibile il codice!

Questo è il mio codice Python... linguaggio che ancora non conosco bene! Quindi ci saranno sicuramente dei giganteschi errori di stile (ehm ad esempio non c'è un modo migliore per gestire le matrici??) ma speriamo ci siano solo quelli, e che la soluzione sia abbastanza corretta!

# esempio di matrice di colori
matrice = [ [1, 1, 2, 4, 4],
            [1, 2, 9, 3, 4],
            [8, 9, 8, 9, 8],
            [7, 6, 5, 4, 3] ]

altreMosse = False

def cella(direzione, a, b):
  # restituisce la cella a,b della matrice, ruotata secondo la direzione
  try:
    if   direzione==0: return matrice[a][b]
    elif direzione==1: return matrice[len(matrice)-1-a][b]
    elif direzione==2: return matrice[a][len(matrice[0])-1-b]
    elif direzione==3: return matrice[len(matrice)-1-a][len(matrice[0])-1-b]
  except:
    raise Exception

def Pattern1(direzione, a, b):
  # ricerca il pattern XXyX
  try:
    return (cella(direzione, a, b) == cella(direzione, a, b+1) and
            cella(direzione, a, b) != cella(direzione, a, b+2) and
            cella(direzione, a, b) == cella(direzione, a, b+3))
  except:
    return False

def Pattern2(direzione, a, b):
  # ricerca il pattern XyX
  #                     X
  try:
    return (cella(direzione, a, b)!=cella(direzione, a, b+1) and
            cella(direzione, a, b)==cella(direzione, a+1, b+1) and
            cella(direzione, a, b)==cella(direzione, a, b+2))
  except:
    return False

def Pattern3(direzione, a, b):
  # ricerca il pattern XXy
  #                      X
  try:
    return (cella(direzione, a, b)==cella(direzione, a, b+1) and
            cella(direzione, a, b)!=cella(direzione, a, b+2) and
            cella(direzione, a, b)==cella(direzione, a+1, b+2))
  except:
    return False

for direzione in range(0, 4):
  for a in range(0, len(matrice)):
    for b in range(0, len(matrice[0])):
      altreMosse = altreMosse or Pattern1(direzione, a, b)
      altreMosse = altreMosse or Pattern2(direzione, a, b)
      altreMosse = altreMosse or Pattern3(direzione, a, b)

print "Ancora mosse? ", altreMosse