Mi elido dai social network

Ho rinominato il mio account di facebook, ho eliminato tutti gli amici, tranne i colleghi, non prendetevela a male, ma ho quell’account solo ed esclusivamente per fare i test di lavor (ecco perchè ho tenuto i colleghi)

Ho anche eliminato il mio account Twitter.

Mi rimangono le foto su Flickr che manterrò, i miei link Delicious,  i miei indispensabili su Anobii e la mia musica su Last.fm.

Non ho tempo per dedicarmi ai social network che portano via solo tempo.

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

Un iPost

L’app per iPhone per scrivere su wordpress non sembra affatto male! Ottima interfaccia, facile utilizzo!
Ecco il mio bumper… Giusto per provare l’upload di foto, peccato che non sembri esserci un editor wyswyg…

Vergogna @3Italia

Vergogna 3Italia!
Venerdì, il giorno di lancio dell’iPhone4, io e la mia fidanzata ci siamo recati presso il centro 3 di Gallarate e, stufi delle tariffe Vodafone, abbiamo acquistato due telefoni e due usim 3, una in abbonamento (Top400 a 29euro / mese) e una con una ricaricabile (ricarica obbligatoria 10 euro/mese).

Abbiamo attivato anche la vantaggiosissima offerta 3 Insieme (600 mex al giorno, 10h al giorno, tutto a 5euro al mese).

Con lo stupore della mia fidanzata dopo neanche un giorno si è trovata la ricarica del cellulare prosciugata (le avanzavano 5 euro). Abbiamo fatto così altri 10euro di ricarica in buona fede. Dopo neanche due giorni la carica residua del telefono era neanche 60centesimi.

Che fine hanno fatto le grandi offerte della 3?
Semplice 3 sul telefonino ricaricabile ha impostato di default la ricevuta di ritorno dei messaggi, quindi ogni messaggio inviato veniva a costare il doppio, e ogni messaggio inviato sotto offerta 3 insieme veniva a costare comunque 10 centesimi.

Altro fatto percui 3Italia si deve VERGOGNARE:
Nell’opuscolo allegato alla USIM per iPhone intitolato “Scopri come attivare il tuo nuovo iPhone” c’è una pagina che potrebbe arrecare confusione ai meno attenti: “Per attivare il Roaming Dati sul tuo iPhone”.
Il fatto che sia nell’opuscoltetto “Scopri come attivare il tuo nuovo iPhone” fa quasi intendere che sia una procedura necessaria per l’utilizzo di iPhone. In realtà non è cosi, serve solo a 3italia per rubare dal vostro contratto 60centesimi a megabyte in roaming!
VERGOGNA!

In mattinata segnalerò questa condotta discutibile al garante delle tlc e vediamo come va a finire.

VERGOGNA!
3 dovrebbe quantomeno avvisare di questi sporchi trucchi per raccattare soldi.
P.

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!

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

.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

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.