Programmazione

RSS-Bot

Ho scritto questa cazzata un po’ di tempo fa a lavoro nel tentativo (non riuscito) di migliorare un po’ di comunicazione interna intra-dipartimentale e rendere l’azienda un posto piu’ geek dove lavorare. Serviva un luogo dove tutti potessero stare per lavorare insieme a delle robe, con un bot che stampasse nei diversi canali ticket di nagios, jira e altre robe basate su RSS feed. Non doveva essere ne’ Skype, ne’ qualcosa XMPP based (perche’ le stanze in XMPP sono un casino da creare). Ho proposto il classico server IRC + questo bot. Cosa c’e’ di meglio di IRC? 😀 La proposta non e’ stata recepita ovviamente…

Magari a qualcuno serve e/o puo’ prenderci spunto per fare qualcosa di migliore o diverso ma sempre basato su irc, ho messu su un po’ di codice (non che sia poi il massimo) sul mio GitHUB a questa URL.

Il bot legge un file YAML dove si possono specificare una serie di feed rss che poi possono essere associati a piu’ canali, in modo tale che quando qualcosa di nuovo viene postato su un feed il bot printi un summary su ogni canale a cui e’ associato.

Il codice e’ molto basic, giusto un proof of concept che ho messo su’, e non vuole essere niente di performante, infatti dopo un po’ di feed le prestazioni fanno un po’ schifo 😀

Immagino che per tanti feed tocchi passare ai thread. Magari glieli aggiungo, oppure magari provo a farlo in Python visto che sto imparando…

Uso un CPAN module chiamato Bot::BasicBot, basta solo estendere la sua classe e implementare il proprio codice per avere qualcosa di basic.

Alla prossima

Evviva YAML! Abbasso XML!

Ultimamente le mie vicessititudini perliste mi hanno portato a scoprire YAML.

Ho sempre pensato che XML sia una merda che puo’ andare bene per i programmi ma non e’ molto umano.

YAML puo’ essere usato per molte robe al posto di XML. Io ad esempio lo sto usando per file di configurazione. Ad esempio questo piccolo fiel di configurazione qui sotto:

$ cat mm.conf.yml
---
hosts:

    - hostname: localhost
      port: 2812

    - hostname: linutop
      port: 2812
      username: admin
      password: monit

Puo’ essere parsato e schiafatto in un bel hash tree solo con queste poche linee di codice:

open (TEST, $f);
$file .= $_ while();
close TEST;
$cfg_file = Load($file);

Quello che vedrete nel hashref sara’ cosi’:

$VAR1 = {
          'hosts' => [
                       {
                         'hostname' => 'localhost',
                         'port' => '2812'
                       },
                       {
                         'password' => 'monit',
                         'hostname' => 'linutop',
                         'port' => '2812',
                         'username' => 'admin'
                       }
                     ]
        };

In XML lo stesso file potrebbe essere scritto cosi’:

< ?xml version="1.0" encoding="UTF-8"?>

  
  

O chissa’ in quali altri modi astrusi…
Come vedete YAML e’ molto piu’ leggibile di XML.
Fico vero?

Come ti estendo l’homebanking col Perl

Ireland, 1 year.

Sono al giro di boa del primo anno. Non faro’ il solito post commemorativo del tipo “questo giorno un anno fa ero all’aeroporto ignaro del futuro”. Forse lo faro’ dopo. Accontentati di quello che avevo scritto un mese fa. Piuttosto festeggio con un bel rilascio su CPAN.org dei miei sforzi informatici delle ultime 2 settimane, per provare quanto sia sensato il fumetto di xkcd.com : cioe’ che abbia piu’ senso una settimana incasinando col Perl che 900 ore di corso universitario o 400 ore di compiti a casa 🙂

11th_grade

Cosi’, dopo 2 settimane di programmazione piu’ o meno autistica, ho rilasciato una prima release usabile: il modulo si chiama Finance::Bank::IE::PermanentTSB, e si aggiunge al namespace Finance::Bank, accanto ad altri moduli dello stesso tipo.

Il modulo permette di stampare da riga di comando il saldo di tutti i conti correnti bancari collegato all’homebanking di PermanentTSB.

pallotron@terminus ~ $ ptsb -b
Parsing configuration file...

You need a passphrase to unlock the secret key for
user: "Angelo Failla <afailla@newbay.com>"
2048-bit ELG-E key, ID F83D3FCA, created 2008-02-18 (main key ID B68B318D)

gpg: encrypted with 2048-bit ELG-E key, ID F83D3FCA, created 2008-02-18
      "Angelo Failla <afailla@newbay.com>"

Connecting...

-----------------------------------------------------------
|       Account name | Acc. # |     Balance |   Available |
-----------------------------------------------------------
| Switch Current A/C |   0220 |      135.35 |      235.35 |
|          Visa Card |   2667 |     -419.66 |       80.34 |
-----------------------------------------------------------

Ovviamente i dati dell’output sono taroccati 😀
Lo script e’ anche in grado di stampare l’estratto conto basandosi su range temporale, regular expression (per matchare la description), e condizioni matematiche (tipo <300, >=2000, etc).

L’idea del modulo mi e’ venuta dopo che ho scoperto la potenza di WWW::Mechanize. E’ un modulo Perl che permette di automatizzare l’interazione con un sito web: gestisce la navigazione attraverso pagine, i click, la gestione delle form, il fill out delle form, etc. C’e’ qualche pazzo che l’ha usato per scriversi bot che tengono d’occhio aste di Ebay o che effettuano operazioni periodiche su Ogame (famoso gioco alla Warcraft, ma online; ci giocavo 2 anni fa, ma poi ne sono uscito pulito!).

Il miglior modo per imparare qualcosa quando programmi e’ di solito scrivere qualcosa che ti serva veramente. Cosi’ mi sono detto: «devo scrivere qualcosa che mi serva veramente e nel frattempo mi possa servire per imparare il modulo e rispolverare altre cose del Perl».

Noi sistemisti siamo pigri e non amiamo fare le stesse cose ripetutamente, e, dove possibile (quasi dovunque!), ci piace automatizzare 😀
Se poi possiamo avere tool command line per fare le cose piu’ disparate sicuramente non disdegniamo.

Il sito di PermanentTSB e’ una chiavica, non fa grafici e istogrammi del conto, non salva/esporta gli estratti conto in file CSV, non tiene dati piu’ vecchi di 6 mesi! Un invito a nozze per rimediare a cio’ con WWW::Mechanize!

D’apprima ho iniziato scrivendo un modulo per familiarizare con le librerie, obiettivo: “inserire da command line, le ore lavorate nel sistema di time tracking aziendale”. Devo dire che lo script e’ stato molto apprezzto a lavoro visto che per inserire anche un solo record nella interfaccia aziendale si devono cliccare milioni di volte, e il sistema non e’ a prova di errore!

Queste due settimane mi sono servite a:

  • rispolverare Perl;
  • imparare la programmazione dei package/moduli;
  • capire come funziona la comunita’ CPAN;
  • imparare WWW::Mechanize;
  • imparare come funzionano le test unit in Perl usando Test::More e Test::MockObject;
  • imparare come funziona git, il sistema di versioning creato da Linus Torvalds usato dalla comunita’ di sviluppo del Kernel Linux. Veramente fico per velocita’ e completezza di opzioni e feature. Meglio di subversion/cvs.

In piu’ e’ servito a coprire anche un po’ di spazi vuoti che ultimamente sto avendo a lavoro. 😛

Alla prossima!