Si comincia!

By abell on 2008-12-01-01:24:11 | In

È passato un bel po' di tempo da quando ho registrato questo dominio. Volevo farne uno spazio di condivisione di informazioni interessanti per chi, come me, passa gran parte della propria vita lavorativa e molte ore del proprio tempo libero nell'interazione con un computer. Volevo avere un'interfaccia semplice per annotare i trucchetti fichi imparati nella pratica quotidiana dello sviluppo software e dell'amministrazione server, perché altri potessero magari trovarli utili, diffonderli, migliorarli. Finalmente, ritagliando un'oretta qua e una là, mettendo a frutto la pratica accumulata per altri progetti più seri, sono riuscito a mettere online una prima versione. Solo un abbozzo, siamo d'accordo: controllo degli accessi carente, nessuna possibilità di registrarsi o scrivere commenti, gestione delle utenze solo manuale, sicurezza quasi inesistente (o forse no?), per non parlare dell'aspetto a dir poco spartano, ma ci siamo. Release early, release often, secondo le pratiche della programmazione agile, estrema, famolo-strano. Poi, se il progetto si dimostrerà meritevole, si potrà aggiungere un moduletto qui, un foglio si stile là, una spruzzata di Ajax dove serve, e avere un sitarello di interesse. Se invece gli unici visitatori resteranno gli amici intimi e i crawler di qualche motore di ricerca, sarà stato un esperimento interessante, ma varrà la pena dedicare le (ahimé poche) energie libere ad altre cose.

Ma bando alle ciance ed andiamo al sodo (tecnico)! Il sito è realizzato in perl, utilizzando il framework Catalyst. Il DB che si prende premurosamente cura delle utenze, dei post e delle altre informazioni a futura memoria è Sqlite. Il server web è Apache su piattaforma Linux Debian (o Debian GNU/Linux, se preferite), con processi fastcgi. Tutto Software Libero (o Open Source, secondo i vostri gusti).

Perché creare una applicazione ex-novo, invece di usare uno dei CMS e piattaforme di blogging già esistenti, come Wordpress, Drupal, Joomla?

La scelta non è stata facile ed ha comportato alcune rinunce, ma è stata ragionata.

Le piattaforme di CMS e blogging sono complesse e richiedono uno sforzo nell'installazione, configurazione e gestione degli update. Essendo complesse, è difficile capire le implicazioni di sicurezza derivanti dall'attivazione di moduli e plugin e la personalizzazione richiede lo studio dell'architettura specifica (oltre che la conoscenza del linguaggio utilizzato).

Catalyst è un'architettura potente e permette uno sviluppo rapido. La parte di mappatura oggetti-relazionale è automatizzata, l'utilizzo dei template è molto funzionale, e perl è un linguaggio molto efficace per lo sviluppo delle applicazioni web. L'applicazione, ad oggi, consta di 518 righe di codice perl, di cui almeno 272 autogenerate. In più, ci sono i template, la struttura del DB, un Makefile e qualche altro file sparso. Un impegno abbastanza ridotto, per un sito semplice da far crescere nel tempo secondo i bisogni.

Visto che l'obiettivo è la trattazione di argomenti tecnici, chiudiamo questo post inaugurale con un frammento di codice per dare un assaggio della struttura che tiene in piedi Developer.it. Ecco il codice perl che genera la home page:

sub index : Private {
    my ( $self, $c ) = @_;
    $c -> stash -> { posts } =
       [ $c -> model('DB::Posts')
            -> search ( { status => 'published' },
                        { rows => 10, order_by => 'ctime DESC' } )
            -> all ];
    $c -> stash -> { template } = 'index.tt2';
}
L'interazione col DB usa DBIx::Class per avere un'interfaccia orientata agli oggetti e una sintassi molto espressiva. Nella struttura dati $c -> stash vengono messi i dati accessibili al template, che li estrarrà per la visualizzazione.

Il template (basato su Template Toolkit) che crea l'anteprima del singolo post nella home page è questo:

<div class="postblurb">
<h3><a href="[% c.uri_for ( "/post/" ) _ post.normtitle %]">[% post.title | html %]</a></h3>
[% matches = post.content.match('^(.{0,100})(s|$)') %]
[% IF matches; matches.0; ELSE %]No match???[% END %]
<div class="postattrib">By [% post.author.username %] on [% post.ctime %]</div>
</div>
che viene chiamato all'interno di un ciclo, nel template index.tt2:
[% IF posts.size > 0;
     FOREACH p IN posts; INCLUDE posts/showblurb.tt2 post=p; END;
   ELSE %]
Benvenuti su Developer.it.
[% END %]
Se vi fosse venuta voglia di farvi un'idea su Catalyst, date un'occhiata al tutorial.