BlogBabel Home Page Discussioni Libri Video Classifiche
8.11.07
ludo
5

Un paio di bug, e il guru delle regexp

Tra ieri e oggi ho sistemato un paio di problemi del crawler, che per chi non lo sapesse è il "motore" che recupera i feed dei blog in classifica, ed estrae post e link.

Il primo problema era dovuto a un bug di feedparser, la libreria di Python che utilizziamo per processare i feed, per cui a volte i titoli corretti dei post venivano sovrascritti con il contenuto di un altro elemento del feed. Per fortuna il bug è noto e c'è una soluzione, anche perchè feedparser è utilissimo e molto completo ma il suo codice è scritto in maniera... uhm... diciamo poco lineare, e metterci le mani non è mai né semplice né tantomeno veloce. Feedparser ha altri problemi ed è anche decisamente pesante e quindi molto lento, e dato che è forse il componente più sollecitato del nostro crawler, appena ho un po' di tempo vedo di riscriverlo. Ho già dei pezzi di codice qui e là, prima o poi verrà la volta buona.

Il secondo problema è stato molto più difficile da individuare: da ieri pomeriggio inspiegabilmente uno dei processi del crawler, arrivato ad un certo punto, si bloccava utilizzando un processore al 100%. Capire a che punto si bloccasse ha richiesto parecchie ore di tentativi (ogni giro completo del crawler ormai impiega quasi due ore) e qualche migliaio di righe di log. Alla fine ho scoperto che il problema era dovuto alla regular expression che estrae i link dai post, che dopo aver funzionato senza problemi per un anno, aveva improvvisamente deciso di piantarsi su un post particolare.

Estratto il post in questione, ho quindi scritto un piccolo test che replicasse il problema e l'ho fatto girare tra gli amici pythonisti con cui dialogo ormai quotidianamente in IM. Dopo qualche tentativo è stato chiamato in causa Marco Beri, vicepresidente dell'associazione italiana Python, pydinnerista e autore per Apogeo di “Espressioni Regolari”. Con molta pazienza, Marco ci ha spiegato che il problema non era dovuto a un bug di Python come pensavamo all'inizio, ma ad un caso limite che si può verificare con espressioni regolari complesse. La spiegazione tecnica sta in un'appendice del libro di cui Marco mi ha inviato un estratto, ed ha a che fare con i Nondeterministic Finite Automata su cui sono modellate quasi tutte le librerie moderne per le espressioni regolari. Il testo di Marco spiega in termini ciari la questione, e rimanda per approfondimenti ad un bell'articolo di Russ Cox, “Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...)” che potrebbe interessare qualcuno di voi.

Il bug è stato risolto, il crawler ha ripreso a girare normalmente, e la morale di questi ultimi due giorni è: in Italia ci sono un sacco di persone veramente in gamba (e disponibili), che spesso sono poco conosciute dal grande pubblico perchè ancora non hanno un blog. C'è anche un'altra morale, forse più importante per quelli di voi che programmano: le regular expression sono uno strumento potentissimo e imparare a conoscerle ed usarle con profitto richiede parecchia esperienza. Le scorciatoie però ci sono, e una di queste è appunto il libro di Marco che vi consiglio di acquistare, magari da BOL o IBS.

Aggiornamento. Vincenzo di Divide By Zero parla della correzione del primo problema, che mi aveva segnalato un paio di giorni fa. Fosse sempre così semplice... :)

Commenti

  • 1.

    Io ce l'ho ma non lo mostro spesso in giro perché alla gente normale si rizzano i capelli in testa (con buona pace dei miei e di quelli di Marco per altro :D)

    10.11.07 | theo
  • 2.

    Caro Theo, c'hai proprio ragione. Avevo chiesto a Ludo di non dire niente in giro ma lui no ha voluto sentire ragioni.Ma come sai della mia folta capigliatura? ;-)

    10.11.07 | marcob
  • 3.

    mi scuso con la redazione sono sicuro che non è questo il luogo adatto per fare una domanda allo staff.Ho scoperto oggi di essere iscritto a blogbabel ma non ho mai fatto domanda o almeno cosi credo (ho spesso amnesie dovute alle sbronze). certo mi fa piacere essere nella classifica ma mi sembra strano di essere stato iscritto senza avere un avviso e soprattutto non ho idea di chi possa averlo fatto al posto mio.Potete aiutarmi a risolvere il mistero?magari mi potete anche dare una mano a scalare la classifica ;-)

    12.11.07 | FAXE BINDER
  • 4.

    @ Faxe Binder: se sei presente in classifica, è probabile che:1) tu abbia segnalato il tuo blog e te ne sia scordato2) l'abbia segnalato qualcun'altro per teChe sia il primo o il secondo caso, non abbiamo modo di sapere chi l'abbia fatto... ma sta di fatto che ora ci sei! :)Per scalare la classifica... non so, magari inizia ad offrirci una delle tue birre, e poi ne riparliamo... :D

    12.11.07 | Giovy
  • 5.

    Le RegExp sono davvero una manna dal cielo per una enormità di situazioni. :)

    Interessantissimo il link che hai postato. :)

    Non si possono avere maggiori dettagli sul problema che avete riscontrato? :D

    26.11.07 | Folletto Malefico