-+  Associazione
-+  Documenti
-+  Eventi
-+  Community
-+  Blog
-+  Link

Ottobre 2013

Dom Lun Mar Mer Gio Ven Sab
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Cerca






 


« Maggio 2006 | Home | Luglio 2006 »

Perl... e domani?


Signore e Signori vi presento Dante Ortolani! Alla veneranda età di 83 anni anche questo signore ha a che fare col Perl! Non ci credete? beh la foto parla da sé!

Altro che il nonno multimediale!! vi presento mio nonno che non a caso si chiama Dante Ortolani proprio come me e che oggi dopo essersi accidentalmente sporcato la T-shirt che aveva mi ha chiesto: "Non è che hai qualcosa da prestarmi?" stavo per dirgli no quando mi sono ricordato che in macchina avevo ancora la maglietta del IPW05 (ma presa quest'anno... l'azzurro non mi dona! ;).

Ho dovuto per forza fargli la foto, era troppo fico mio nonno con la maglietta perlica, e lui quando ha visto l'importanza che davo a quella maglietta si è prestato per la foto.

Ora apparte farvi conoscere mio nonno, volevo riportarvi una mia piccola considerazione guardandolo con quella maglietta. Infatti molto spesso, vuoi per lo stesso nome o vuoi per il fatto che (non a caso) gli assomiglio, mi identifico in lui. Così mi sono chiesto ma come sarò io a 83 anni? e soprattutto che maglietta indosserò?

Forza nonno Dante!

Inviato da LucaS alle 17:14 | Commenti (2)

Link!

Cerco di cominciare da questa settimana la stesura di un post con cadenza periodica. Se volete contribuire, leggete il box in fondo al post.

  • todobot.pl Come scrivere un bot AIM che aiuti a mantenere una TODO list testuale
  • YAPC::NA 2006 E` in corso in questi giorni lo YAPC North America 2006. Dal sito ufficiale si arriva al programma (che conterrà poi slide e proceeding vari), al wiki e in generale a molte informazioni interessanti.
  • Conferences For Beginners Dal wiki di YAPC::NA 2006, ad esempio, ecco come ottenere il massimo da una conferenza (utile magari per l'anno prossimo, all'IPW)
  • Class::DBI vs DBIx::Class Un thread interessante su Perlmonks, a proposito dei due ORM che vanno per la maggiore nella community degli sviluppatori

Se vuoi contribuire alla raccolta settimanale di link per Perl.it manda una mail a larsen@perl.it, indicando i link che ti piacerebbe segnalare, con una breve descrizione per ciascuno.

Inviato da larsen alle 19:47 | Commenti (0)

IPW2006 - "Look behind you, a three-headed monkey!"

Uno dice "Adesso scrivo qualcosa sul Workshop!". Sembra facile: il saggio farebbe in modo di non trovarsi due giorni dopo con la pretesa di raccontare tutto; il saggio farebbe in modo di "non essere offerto volontario"; il saggio scriverebbe brevi note durante l'evento, via via che le cose accadono. Ma c'è così tanto che accade che o lo si osserva o lo si descrive. Almeno per me.

Facciamo così: io scrivo qualcosa qui sotto, e chi mi legge contribuisce nei commenti con un thread fiume, a tratti off-topic, entusiasta e spontaneo :). Comincio.

Quest'anno IPW partiva sotto gli auspici di un notevole cambiamento: ingresso gratuito. E difatti, il giorno prima dell'inizio della conferenza, stavamo a 82 registrati.

Ingenuamente pensavo che solo una percentuale piccola avrebbe dato forfait alla "resa dei conti": visto però che l'iscrizione non comportava alcun impegno economico, si vede che molti si sono iscritti alla leggera, o l'hanno fatto sul serio per poi dimenticarselo. Ad ogni modo, relativamente pochi ma buoni.

Altra novità importante è stato il servizio di streaming A/V verso l'esterno, per chi non fosse riuscito a partecipare di persona. Ringrazio tantissimo emi, dakkar (che ha procurato parte dell'hardware necessario) e il personale del Polo Fibonacci dell'Università di Pisa, perché lo streaming ha funzionato benissimo (a parte qualche problema durante il secondo giorno), e come se non bastasse il tutto è stato anche registrato, per essere disponibile al più presto.

Poi, le cose che non cambiano: Pisa, sempre più piccina (ma immensa, se vista dall'autobus numero 7 ;>). La cena del Giovedì, quest'anno in versione bavarese. Il piacere di rivedere vecchie conoscenze frequentate solo telematicamente da mesi. Le slide non finite in tempo, che distolgono l'attenzione da quel che accade nel resto del mondo (anche qui, il saggio avrebbe da insegnare). La pausa caffè. Ovviamente i talk e le discussioni, il fulcro di IPW. L' asta, che quest'anno anche se era registrata dovevate esserci.

Insomma, grande IPW: ci son tante cose da limare, ma l'andamento è incoraggiante. Grazie a tutti, ci vediamo nel 2007 :)

Inviato da larsen alle 13:58 | Commenti (1)

IPW2006 - Streaming!

Ci sono alcuni problemi di rete e solo grazie a magheggi che non riferirò sto riuscendo a postare, comunque:

Lo streaming A/V dei talk è raggiungibile all'indirizzo

http://streaming.perl.it:8080

(usate un client tipo VLC)

stream_frodo.png

Inviato da larsen alle 13:37 | Commenti (0)

80!

Nel momento in cui sto scrivendo le statistiche mostrano un numero bello tondo. 80. Grazie a tutti coloro che si sono iscritti, domani finalmente ci vediamo :)

Mi vengono in mente un po' di consigli molto molto spicci per gustarsi al meglio il workshop.

  • raggiungere il Polo Fibonacci non è complicato, e non prende neppure tanto tempo ("Pisa è piccina! ..."). Se chiedete indicazioni, provate anche "Scusi, per il dipartimento di Informatica?". Siamo lì
  • se avete intenzione di fare fotografie e vi piace metterle online man mano su Flickr, usate il tag ipw2006, in maniera che sia semplice aggregarle e mostrarle anche sul sito
  • se siete relatori, portate gli eventuali adattatori che servono a connettere il vostro portatile al proiettore. In caso di dubbi tecnici, rivolgetevi a qualcuno dello staff, e vedremo di organizzare una prova
  • sempre se siete relatori, e fatti i debiti scongiuri, portate una versione delle slide in formato PDF su una chiavetta USB. Potrebbe essere la salvezza quando tutti gli altri tentativi sono andati male
  • siete per caso relatori? forse già sapete che quest'anno abbiamo pensato di divulgare in streaming, e di registrare, gli interventi della due giorni. Se per qualche motivo preferite non essere ripresi, o volete che il vostro talk non venga pubblicato, fatecelo sapere.

Inviato da larsen alle 18:43 | Commenti (0)

SQL::Abstract per non scrivere più (troppo) SQL

Non saprei stimare quanti statement SQL ho scritto nella mia vita di programmatore. Mischiare codice SQL all'interno del proprio linguaggio di programmazione, qualunque esso sia, lo rende meno leggibile, più brutto, e - specialmente se le query sono complesse - particolarmente inelegante. Anche programmando secondo il paradigma MVC (caldamente raccomandato in alcuni casi, come le applicazioni web) si finisce semplicemente con lo spostare il codice SQL nel modello, mentre forse la scelta migliore sarebbe quella di liberarsene del tutto. Il problema è che è necessario interrogare il database, quindi non è possibile rimuovere il codice SQL; si può, tuttavia, inserire qualcos'altro al suo posto. Vediamo cosa, ovviamente dal punto di vista del programmatore Perl.

Esistono moduli che permettono l'astrazione dal linguaggio SQL generando codice a partire da una struttura dati. Ciò consente di utilizzare strutture arbitrariamente complesse per generare query arbitrariamente complesse senza scrivere una riga di codice database-related all'interno del proprio programma Perl. È opportuno notare che ciò è diverso da quello che fanno gli ORM (Object Relational Mappers): questi ultimi astraggono il database in oggetti, mentre qui si parla di astrazione di query SQL. Spesso, comunque, un buon ORM (come DBIx::Class) fornisce anche l'astrazione delle query, di solito utilizzando uno dei moduli disponibili su CPAN. Probabilmente vorrete utilizzare un ORM, ma questa è un'altra storia.

In questo breve articolo verrà trattato SQL::Abstract, che tra l'altro è quello utilizzato da DBIx::Class). È piuttosto semplice imparare come scrivere semplici query con questo modulo, e con un po' di ragionamento anche quelle complesse possono essere espresse sotto forma di strutture dati Perl. Se per esempio si ha:

my $query = "SELECT users.name, users.phone, users.email
    FROM users
    WHERE users.id = 1 OR users.id = 2
    ORDER BY id
";
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute() or die $dbh->errstr;

utilizzando SQL::Abstract si può scrivere:

my $sql = SQL::Abstract->new();

my ($query, @bind) = $sql->select(
    'users',
    [ 'name', 'phone', 'email' ],
    { id => [ 1, 2 ] },
    [ 'id' ],
);
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute(@bind) or die $dbh->errstr;

Si potrebbe obiettare che il codice è più lungo, ed in effetti un po' lo è (anche se la formattazione contribuisce a ciò). Esso è tuttavia molto più chiaro: non c'è codice extra-Perl accanto ai nomi ed ai valori dei campi, e si può capire alla prima occhiata cosa fa la query. Il metodo select accetta 4 parametri: il nome della tabella su cui si intende lavorare; i nomi dei campi da ritornare; la where clause; l'opzionale ordinamento dei risultati. Come valore di ritorno si ottiene una stringa contentente la query, e l'array dei bound values da utilizzarsi al momento di chiamare execute.

La where clause è il luogo dove tutto avviene. È possibile utilizzare una struttura dati Perl per specificare le condizioni di cui si ha bisogno:

my $conds =    {
       id => [qw/ 1 2/]
    }

Si possono indicare condizioni arbitrariamente complesse:

my $conds =    {
    -or => [
        id => [qw/ 1 2/]
        -and => [
            name => 'Fatina buona',
            email => { '!=', 'joker@example.com' },
            phone => { 'like' => '%3456%' },
       ],
    ]
};

In questo caso le condizioni di "primo livello" sono contenute in un arrayref chiamato -or, il quale fa sì che SQL::Abstract le associ tra loro utilizzando l'operatore OR anziché l'AND che rappresenta il default. L'id deve assumere valore 1 oppure 2, come negli esempi precedenti; se ciò non accade, devono essere soddisfatte tutte le 3 condizioni all'interno dell'arrayref -and. Come si nota, la seconda e la terza condizione sono specificate utilizzando un arrayref anziché un valore singolo: ciò permette di specificare l'operatore da utilizzare nella comparazione (il default è '='). A questo punto dovreste essere in grado di ricavare da soli il codice SQL generato dalla struttura sopra riportata.

Le inner join sono semplici da implementare:

</pre> my ($query, @bind) = $sql->select( [ 'users', 'payments' ], # Arrayref con i nomi della tabelle [ 'user.name', 'payment.dsc' ], { 'users.id' => [ 1, 2 ] }, [ 'users.id' ], ); </pre>

Utilizzando una sintassi simile si possono specificare operazioni diverse da SELECT. Ad esempio, per inserire un record in una tabella si può scrivere:

my ($query, @bind) = $sql->insert(
    'users',
   [ 'Michele', 'my@email.com', '123 546 874' ],
);
$dbh->do($query, undef, @bind);

oppure - in maniera più chiara e scalabile - si può scrivere:

my ($query, @bind) = $sql->insert(
    'users',
    {
        name => 'Michele',
        email => 'my@email.com',
        phone => '123 546 874',
    },
);
$dbh->do($query, undef, @bind);

Questa sintassi garantisce che, al momento di rileggere il codice, l'operazione esatta che esso compie sia comprensibile all'istante. Le istruzioni UPDATE sono simili alle INSERT, ma di solito è desiderabile indicare una where condition:

my ($query, @bind) = $sql->update(
    'users',
    {
        name => 'Michele',
        email => 'my@email.com',
        phone => '123 546 874',    # Numero di telefono di default
    },
    {
        id => 4,     # Aggiorna solo l'utente il cui ID è 4
    }
);
$dbh->do($query, undef, @bind);

Come si nota, è anche più semplice inserire i commenti. Infine, si può cancellare un record:

my ($query, @bind) = $sql->delete(
    'users',
    {
        name => { 'like' => 'M%' },    # Cancella tutto ciò il cui nome inizia per 'M'
    },
);
$dbh->do($query, undef, @bind);

Facile, eh? Si può anche ottenere una where clause da utilizzarsi al di fuori di SQL::Abstract. Ciò non è normalmente utile (perché si dovrebbe voler scrivere una parte di query a mano?), ma permette di effettuare SELECT multi-tabella con join diverse dalla inner (SQL::Abstract al momento supporta solo quest'ultima, come mostrato in precedenza) continuando ad utilizzare questo modulo per costruire la where clause (il che è caldamente raccomandato, poiché essa è la parte più complessa e di difficile lettura della query). Ad esempio, si può scrivere:

my ($where, @bind) = $sql->where(
{
    'users.id'      => { '!=' => 1 },
    'users.birth'   => {
        -between => [ '1977-01-01', '1977-11.15' ],
    },
    'locations.name' => {
        'like' => [ 'A%', 'B%' ],   # Inizia con 'A' o 'B'
    },
},
[
    'users.birth', 'locations.name',
]
);
my $query = "
    SELECT users.id, users.birth, locations.name
    FROM users LEFT JOIN locations ON locations.id = users.idlocation
    $where
";
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute(@bind) or die $dbh->errstr;

Se si ha bisogno della clausola LIMIT, si può utilizzare il modulo SQL::Abstract::Limit:

my $sql = SQL::Abstract::Limit->new( limit_dialect => $dbh );

my ($query, @bind) = $sql->select(
    'users',
    [ 'name', 'phone', 'email' ],
    { id => [ 1, 2 ] },
    [ 'id' ],
    5, 10
);
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute(@bind) or die $dbh->errstr;

Le strutture dati che costituiscono la where clause possono essere complesse quanto si desidera: benché le subselect non siano al momento supportate, è possibile utilizzare tutte le funzioni e stored procedures offerte dal proprio database server. Ulteriori esempi e dettagli di utilizzo si trovano nella documentazione del modulo: questo articolo non vuole costituire una documentazione, ma semplicemente una dimostrazione delle feature di SQL::Abstract, che si spera convinca il lettore a provarlo.

Utilizzando DBIx::Class si può ottenere il massimo da SQL::Abstract, dato che si guadagna la possibilità di effettuare facilmente join con vari tipi di relazioni, group_by, prefetch e (presto) subselect. Tutto ciò senza scrivere SQL. Scriverò qualcosa in merito prossimamente.

Inviato da arthas alle 11:42 | Commenti (0)

IPW2006 - Ecco la nuova locandina!

Ecco la nuova versione della locandina di IPW2006. Ci sono nuovi sponsor, che ringraziamo. E poi c'è il programma completo delle due giornate Scaricate il PDF, stampatelo e attaccatelo in giro, se volete.
Ricordo inoltre che siamo oltre i 70 iscritti: la partecipazione è gratuita, ma è senz'altro meglio registrarsi per darci modo di organizzarci al meglio. Ci vediamo tra pochi giorni!

thumb_locandina.png

Inviato da larsen alle 12:51 | Commenti (0)

IPW2006 - Il programma è online!

L'IPW si avvicina a grandi passi. Per questa volta tralascio il solito paio di raccomandazioni (iscriversi è un attimo, ed è gratuito; aiutateci a spargere la voce) per passare a novità più interessanti.

Il programma del workshop è online: dal corso introduttivo al Perl, pensato per dar modo a tutti di seguire al meglio il resto degli interventi, al panel su Perl, Javascript e AJAX, ci sarà occasione per parlare di Perl in tutte le salse.

Vi aspettiamo dunque a Pisa, il 22 e il 23 Giugno :-)

Inviato da larsen alle 01:01 | Commenti (0)

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google