venerdì 17 dicembre 2010

Image Carousel Rilasciato

Image-Carousel è uno script javascript che visualizza in sequenza una serie di immagini con effetti di fade in e fade out, possibilità di andare avanti e indietro la sequenza e di visualizzare una precisa immagine della sequenza.

Attualmente lo script è stato rivisto in ottica object oriented, è basato su prototype ma la prossima versione sarà sviluppato come plugin di jQuery.

Puoi scaricare, ridistribuire, e modificare gratuitamente il codice a patto di citare l'autore e condividere allo stesso modo le modifiche da te effettuate, rispettando la licenza Gnu/GPL v2.

Il pacchetto è scaricabile attraverso GitHub a questo indirizzo.

Tips in Python #1: Avviare un webserver nella directory corrente

Con Python configurato e installato è possibile lanciare nella cartella corrente un web server semplicemente lanciando il comando da console:

python -m SimpleHTTPServer &

mercoledì 3 novembre 2010

Italian Agile Day 2010!

Venerdi’ 19 Novembre 2010 si terrà a Genova il settimo Italian Agile Day. Si tratta di una conferenza gratuita di un giorno dedicata alle metodologie Agili per lo sviluppo e la gestione dei progetti software rivolta agli sviluppatori, project leaders, IT managers, tester, architetti e coach che hanno esperienze da condividere o che iniziano solo ora ad interessarsi a queste tematiche. La giornata ha come obiettivo la conoscenza pratica, le esperienze sul campo e un attivo coinvolgimento di tutti i partecipanti. L’accesso è libero previa registrazione, i posti sono limitati. L’evento, per la quarta volta consecutiva, si auto-finanzierà.

martedì 24 agosto 2010

Facebook API: un fallimento di grande successo

Le nuove API (Application Programming Interface) annunciate durante la conferenza F8, che dovevano semplificare tanto la vita agli sviluppatori, sono arrivate già da un pò e anzichè semplificarla hanno incasintato ancora di più la vita al programmatore. Già perchè sebbene alcune idee siano molto buone (interfaccia REST, protocollo oAuth 2.0) la documentazione e gli esempi sono completamente errati e sbagliati, privi di coerenza e nella fattispecie inutilizzabili. E' una vergogna che il sito con più iscrizioni al mondo si presenti così male dal punto di vista professionale. L'unico modo per imparare le nuove API è quello di cercare in giro per internet su blog o articoli vari e procedere a TASTONI!

Probabilmente le nuove funzionalità sono state rilasciate in fretta e furia, senza controllare che ciò che rende una libreria o una API utilizzabile: la documentiazione.

Facebook gioca con la pazienza e con la vita dei programmatori (si perchè ovviamente si deve perdere tempo per cercare di capire come funzionano queste API che definirle uscite dal sedere di una vacca è un gran complimento).

Cosa andrebbe fatto:

  1. Stilare una VERA guida che indichi cosa si può fare oggi e cosa è sconsigliato

  2. Completare la documentazione

  3. Scrivere esempi funzionanti

  4. Infine riorganizzare la documentazione (com'erano le vecchie api andava benissimo!)

giovedì 22 luglio 2010

Installare CUnit sotto SnowLeopard

Il Test Driven Development è una tecnica di design del software che permette di scrivere del buon codice con un ampio tasso di coverage di test automatizzati. Esistono diverse librerie per fare questo, generalmente almeno una per linguaggio, basate tutte sul design di SUnit (originariamente xUnit), il framework di test scritto da Kent Beck (ideatore di Extreme Programming).

Non fa eccezione il linguaggio C che possiede diverse librerie di testing, tra cui Check e CUnit. Queste due sono caratterizzate dall'essere implementate in puro C e non in C++ come ad esempio googletest.

Installare CUnit sotto Mac è molto semplice anche se mi ha dato qualche problema dovuto alle numerose piattaforme su MacOs X ha girato nel corso degli anni (nato su PPC, PPC64, portato su i386 e ora x86_64, senza contare universal che racchiude le due famiglie).

Per prima cosa possiamo installare la libreria da MacPort:

  1. sudo port install cunit
    MacPort  scaricherà, compilerà e installerà CUnit e libncurses

  2. Modificare il path di MacOS X
    Purtroppo l'installazione di port non mi ha aggiunto i path alle librerie e agli include installati tramite MacPort, quindi è necessario modificare il file /etc/paths e aggiungere le seguenti righe:
    /opt/local/
    /opt/local/lib
    /opt/local/include/


  3. Riavviare il Mac per rendere attive le modifiche al path

  4. A questo punto possiamo provare a compilare il codice di esempio presente sul sito di CUnit con l'accortezza di specificare l'architettura e l'inclusione delle librerie CUnit e Ncurses:
    gcc -lcunit -lncurses -Wall example.c -o example -arch x86_64


  5. Il codice di test ora risulta essere compilato e funzionante possiamo lanciarlo con
    ./example




Happy coding!

giovedì 8 luglio 2010

Come modificare il file host su un mac

Questo post lo dedico ai colleghi del piano superiore :)

1) Aprire il Finder (l'icona che rappresenta il disco del vostro Mac)
2) Andare in Applicazioni/Utility e aprire l'applicazione "Terminale"
3) digitare "sudo nano /etc/hosts" e premere invio
4) Vi verrà chiesta la vostra password, digitatela (ATTENZIONE: non saranno visualizzati i caratteri mentre digitate, nemmeno un asterisco o un segnaposto)
5) Premete invio
6) Con la freccetta verso il basso spostate il cursore alla fine del file di testo
7) digitare l'indirizzo ip del server, premere TAB, e digitare l'host desiderato
8) premere CTRL+O e premere invio
9) premere CTRL+X per uscire dall'editor
10) chiudete pure il Terminale, ignorate gli eventuali messaggi

mercoledì 9 giugno 2010

.htaccess cambiare il dominio mantenendo la querystring

Per poter ridirigere correttamente tutte le richieste inviate ad un dominio example.com ad un example2.it è possibile modificare l'htaccess del primo dominio scrivendo una regola di redirect che includa la querystring in questo modo:

RewriteEngine on
RewriteRule .* http://www.sito.com%{REQUEST_URI}?%{QUERY_STRING} [R=301,NE]


Con questa semplice regola ogni url che punterà sul primo compresi i parametri sarà reindirizzata sul secondo dominio mantenendo la querystring

Accesso ad un modello in cascata in CakePhp

CakePhp si è ispirato molto a Ruby On Rails e se ne vedono alcuni tratti nella scrittura del codice del framework, purtroppo a Cake manca l'eleganza e la compattezza di Ruby.

Facendo un esempio è esattamente quello che succede con i prodotti Apple, cos'ha un pc di diverso da un Mac?
Nulla fanno le stesse cose, ma un Mac è decisamente più elegante, un iPhone è più cool e usabile di un Nokia e via dicendo.

Ad esempio immaginiamo questi tre modelli:
Modello1(campi vari, modello2_id) -----belongsTo----> Modello2(campi vari, modello3_id) ------belongsTo----->Modello3(campi_vari)

nel primo modello dovrei dichiarare la seguente relazione:
 
var $belongsTo = array(
'Model2',
'Model3' => array(
'foreignKey' => false,
'conditions' => array('Model2.model3_id = Model3.id')
)
);


che in effetti è molto più lungo del corrispettivo ruby:
 
belongsTo => :Model2


difatto la relazione con il Model3 sarebbe gestita dalla relazione specificata nel Model2, cosa non funzionante con CakePhp

sabato 29 maggio 2010

DRY up your code e Anti-If... please!

Ieri un'amica mi ha chiesto di spostare il suo sito da un provider ad un altro.

Ecco alcuni spunti di riflessione che ho trovato spulciando il codice sorgente:

  1. DRY up your code (Don't Repeat Yourself)
    Nel codice erano presenti 4 punti dove modificare i parametri di accesso al database, non era molto più semplice mettere tutto in un file di configurazione separato?

  2. Ancora:  DRY up your code (Don't Repeat Yourself) e Anti-If (e qui siamo ai livelli di CodingHorror)
    Il codice che impostava la home page nel caso non ci fossero richieste specifiche era una interminabile catena di if.


Ecco qui un bel esempio da non seguire:
$pid=$HTTP_GET_VARS['pid'];
if($pid == '0' ||
$pid == '1' ||
$pid == '11' ||
$pid == '2' ||
$pid == '3' ||
$pid == '4' ||
$pid == '5' ||
.....
) {
;
}else{
$pid = '0';
}

Bene, proviamo a rifattorizzare un pò questo codice e renderlo in po più flessibile:

  1. Creiamo un array di 'pagine'
    $authirizedPages = array('0', '1', '11', '2', '3', '4', '5',.......);
    $pid = '0';
    if(in_array($HTTP_GET_VARS['pid'], $authirizedPage)){
    $pid =$HTTP_GET_VARS['pid'];
    }

    A questo punto il codice è già molto più flessibile rispetto a prima, basta modificare l'array di pagine autorizzate.

  2. Il passo successivo è rendere indipendente il codice dalla base dati
    $authirizedPages = mysql_fetch_array( mysql_query( 'SELECT id FROM pages' ));
    $pid = '0';
    if(in_array($HTTP_GET_VARS['pid'], $authirizedPage)){
    $pid =$HTTP_GET_VARS['pid'];
    }



  3. Ora possiamo anche eliminare una variabile:

    $pid = '0';
    if(in_array($HTTP_GET_VARS['pid'], mysql_fetch_array( mysql_query( 'SELECT id FROM pages' )))){
    $pid =$HTTP_GET_VARS['pid'];
    }

    A questo punto potremmo anche fermarci, il codice è molto più compatto e flessibile rispetto a prima e l'aggiunta di una pagina comporta semplicemente l'aggiunta di un record sul database e nessuna modifica al codice. Questa è e deve essere una buona norma! Codice indipendente e non ripetuto!


Qualunque suggerimento ovviamente è ben accetto, solo in questo modo è possibile migliorarsi.

Ciao
P

CakePhp, MacOs Snow Leopard, Apache e malditesta

CakePhp, un mac e Snow Leopard mi hanno causato dei bei malditesta oggi.

Il problema principale è che la catena di RewriteRule negli .htaccess non funzionava correttamente per via del fatto che mettevo la root di cakephp sotto la cartella Sites del mio utente, e nonostante abbia modificato /etc/apache2/httpd.conf e il file /etc/apache2/users/<my_user>.conf aggiungendo 'AllowOverride All' i file statici nella cartella webroot (come le immagini e i css) non mi venivano serviti.

La mia soluzione con virtual host
1) ho modificato  /etc/apache2/users/<my_user>.conf aggiungendo un virtual host con document root uguale alla root di Cake e impostando 'AllowOverride All' sulla document root in questo modo:


/Sites/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all



DocumentRoot /Users//Sites/MyNewSite
ServerName mynewsite.dev
ServerAlias www.mynewsite.dev


/MyNewSite">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all




2) Ho inserito una entry manuale nel file /etc/hosts

127.0.0.1 mynewsite.dev


Ora funziona tutto correttamente compresi i vari RuleRewrite dei tre .htaccess di cakephp

Ciao
P.

mercoledì 21 aprile 2010

Code Sign error

Se quando compilate la vostra applicazione su iPhone vi viene restituito
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain

è probabile che vi siano dei problemi con i vostri certificati di provisioning.

Ecco alcuni consigli:

  1. Controllate se nel file plist è settato il corretto certificato di provisioning (generalmente è il reverse domain del vostro dominio più nome dell'app o * se è un certificato generico)

  2. Se avete cambiato macchina di sviluppo, oppure sviluppate con più macchine, assicuratevi che tutte abbiano la stessa chiave privata che avete utilizzato per generare certificati con Apple.

  3. Controllate che i certificati stiano sotto il portachiavi "Login" e non "Root si sistema", altrimenti XCode non riuscirà a reperirli

  4. Controllate che i certificati non siano scaduti

  5. Createne di nuovi utilizzando l'Assistente alla creazioni di certificati presente sul Provisioning Portal


Ciao

P

martedì 6 aprile 2010

Wordpress: Facebook Connect and Role Scope issue

Recently I've developed a very funny website with wordpress and a lots of plugins.
With my surprise, after a coupe of week of correct working, some users told me that, after the login with facebook connect, all the site contents, such as menus and posts, aren't accessible.

That's is caused by an incompatibility issue between Role Scoper and wp-facebookconnect plugins.
I think that after login Role Scoper don't recognize the user level of the registred Facebook Users, and so revoke all the permission to them.

My solution consists to decrease the Wp Facebook Connect hooks execution priority to zero:

  • Open wp-contents/plugins/wp-facebookconnect/fbconnect.php

  • Find the line 93

    add_action('init', 'fbc_init_auth');

    this line add an action to wordpress init hook

  • Decrese the priority of the action adding the priority option after the action name

    add_action('init', 'fbc_init_auth', 0);

  • Save and now everything is working fine :)