Archive for the ‘ programming ’ Category

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!)

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!

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

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:

<Directory "/Users/<my_user>/Sites/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
 
<VirtualHost *>
    DocumentRoot /Users/<my_user>/Sites/MyNewSite
    ServerName mynewsite.dev
    ServerAlias www.mynewsite.dev
</VirtualHost>
 
<Directory "/Users/piero/<my_user>/MyNewSite">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

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.

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 :)

Back to the future

Eccomi qui dopo più di un anno di assenza dal mio blog, che vergogna!
Ho in programma di scrivere diversi post nei prossimi giorni che riguardano i miei interessi lavorativi correnti:

  1. Sviluppo iPhone
  2. Sviluppo di plugin e temi per WordPress
  3. Geolocalizzazione con Ruby e GeoKit

Stay tuned!

Alcune librerie interessanti in Ruby

Ultimamente ho trovato molto utili o interessanti queste librerie:

Ruby Graph Library
Implementa una struttura dati a grafo, sulla quale e’ possibile applicare tutti gli algoritmi piu’ comuni sui grafi. Ogni istanza nodo possiede i metodi per aggiungere archi e collegare altri nodi, per gestire vertici, e ciclare sul grafo (anche l’iteratore non e’ ottimizzato)

Skynet
Skynet implementa MapReduce di Google. MapReduce e’ un modello di programmazione e di elaborazione di dataset enormi. Ecco come Google vi da istantaneamente i risultati della vostra ricerca su un database che rappresenta gran parte di internet. Grazie a questa libreria e’ possibile eseguire processi paralleli su piu macchine. Non solo, estendendo ActiveRecord permette facilmente di utilizzare MapReduce nella vostra applicazione Rails.

RubyProf
RubyProf e’ un profilatore delle applicazioni scritte in Ruby, evidenzia i colli di bottiglia e permette di analizzare, attraverso i grafici prodotti, le prestazioni di un determinato segmento di codice.

Bye
Piero

Italian Agile Day 2008!

Venerdi’ 21 Novembre 2008 si terrà a Bologna il quinto 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 terza volta consecutiva, si auto-finanzierà.

Mi ricorda qualcosa che mi è veramente accaduto…