Integrazione con un “SMTP relay on the cloud”

Recentemente ho dovuto affrontare il problema di monitorare il corretto invio di e-mail da un sito web verso gli utenti destinatari. Non essendo questo il core business del sito web mi sono subito chiesto se ci fosse qualche servizio esterno che si potesse occupare della cosa al posto mio. La risposta è arrivata presto ed ha preso il nome di SendGrid.

Direttamente dal sito del produttore leggiamo:

SendGrid’s cloud-based email infrastructure relieves businesses of the cost and complexity of maintaining custom email systems. SendGrid provides reliable delivery, scalability and real-time analytics along with flexible API’s that make custom integration a breeze.

Attraverso SendGrid in sostanza è possibile semplificare l’invio delle email aggiungendo simpatiche funzionalità come:

  • Monitoraggio real time dell’invio, apertura, spam, rifiuto, ecc di una email
  • Possibilità di inserire una “signature” su tutte le mail
  • Possibilità attraverso degli header della mail di categorizzare le email per poter fare analitiche
  • Invio di newsletter
  • Invio dei report di spam
  • Possibilità di integrare la propria piattaforma ad ogni evento collegato al workflow di delivery di email

Questa ultima funzionalità è stata particolarmente importante per il mio progetto, poichè molto facilemente ora riesco a far conoscere agli utentei del mio sito web se un certo messaggio è stato inviato e soprattutto se è stato aperto.

Se siete interessati anche voi ad integrare anche la vostra piattaforma web con questo servizio non esitate a contattarmi!!

Geolocalizzazione in PHP

Negli ultimi mesi ho lavorato ad un mio progetto personale, Oltre Tata, probabilmente alcuni di voi ne avranno già sentito parlare. In pratica un motore di ricerca geolocalizzato attraverso il quale agevolare l’incontro tra domanda ed offerta di educatrice familiari e famiglie.

In questo progetto ho esplorato in maniera dettagliata vari servizi esterni di geolocalizzazione, in pratica dei servizi web che prendono in input un indirizzo e restituiscono come risultato un punto nello spazio terrestre identificato attraverso la latitudine e la longitudine.

Il mio requisito principale era quello di avere più di un servizio attivo in modo da diminuire il rischio di non avere una risposta in caso il servizio fosse down o non trovasse l’indirizzo stesso. Dato questo requisito ho iniziato a studiare i vari servizi in giro per la rete e alla fine ne ho scelti due: Google Geocoding e OpenStreetMap Nominatim.

Scelti i due servizi ho deciso di creare un componente php 5.3 che fosse trasparente nelle configurazione dei servizi e nel modo in cui il mio codice potesse comunicare con loro ed è nato GeoAdapter. Il componente è rilasciato sotto licenza MIT.

L’architettura del componente è suddivisa in una classe Search che si occupa di passare la query ai servizi. Due classi di servizio che adattano l’interfaccia di Google Geocoding e OpenStreetMap Nominatim all’interfaccia della classe Search, una classe SearchCache che serve a crare una cache delle richieste fatte in modo da abbassare il numero di chiamate che si fa al servizio e una classe Location che viene restituita come risultato della ricerca che rappresenta il punto cercato e implementa un metodo per cercare la distanza tra due punti.

Il componente è del tutto configurabile e estendendo l’interfaccia Service è possibile aggiungere altri servizi di geolocalizzazione. Di seguito un esempio di utilizzo del componente:

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
32
require_once(__DIR__.'/../lib/Geo/Autoload.php');
 
Geo\Autoload::register();
 
class Search extends Geo\Search
{
  protected function configure()
  {
    $this->addService(new Geo\Service\OpenStreetMap\Nominatim);
    $this->addService(new Geo\Service\GoogleMap\GeoCode);
  }
}
 
$search = new Search();
 
$search->query('via Montenapoleone, Milano');
 
$location_a = $search->getFirst();
 
$search->query('piazza Boccolino, Osimo');
 
$location_b = $search->getFirst();
 
echo 'Address1: via Montenapoleone, Milano'.PHP_EOL;
echo 'Latitude: '.$location_a->getLatitude().PHP_EOL;
echo 'Longitude: '.$location_a->getLongitude().PHP_EOL.PHP_EOL;
 
echo 'Address2: piazza Boccolino, Osimo'.PHP_EOL;
echo 'Latitude: '.$location_b->getLatitude().PHP_EOL;
echo 'Longitude: '.$location_b->getLongitude().PHP_EOL.PHP_EOL;
 
echo 'Distance from Address1 to Address2: '.$location_a->distance($location_b).' Km'.PHP_EOL;

Questo codice restituirà il seguente output:

Address1: via Montenapoleone, Milano
Latitude: 45.4685166
Longitude: 9.1948891
 
Address2: piazza Boccolino, Osimo
Latitude: 43.4863912
Longitude: 13.4825126
 
Distance from Address1 to Address2: 251.64 Km

Attraverso questo componente sono ruscito a localizzare tutte le educatrici che si iscrivono ad Oltre Tata e a memorizzare in fase di regitrazione del loro profilo le loro coordinate geospaziali.

Una volta memorizzate le loro coordinate su database ho dovuto creare una query che dato il punto di ricerca della famiglia restituisse in un raggio di 30km tutte le educatrici disponibili. Un post di Derick mi è corso in aiuto e dopo un’attenta lettura di tutte le funzioni trigonometriche per il calcolo delle distanze ho trovato la soluzione implementando la seguente formula in una query SQL:

acos( sin(latA) * sin(latB) +cos(latA) * cos(latB) * cos(longB - longA) ) * 3956

dove latA è la latitudine del punto A, latB è la latitudine del punto B, longB è la longitudine del punto B e longA è la longitudine del punto A. Alla fine della formula moltiplico tutto per 3956 per avere il totale in km. Tutti i valori di latitudine e longitudine devono essere dati in valoti radianti.

In questo modo ad esempio se voglio cercare babysitter a milano il sistema cerca prima il punto di ricerca e poi trova tutte le educatrici nelle vicinanze di quel punto, stessa cosa per le altre città come Roma, Napoli, Ancona e così via.

Sentitevi liberi di clonare GeoAdapeter e di aggiungere ulteriori servizi, o di migliorare il componente, però mi raccomando inviatemi le vostre pull request ;-) !!

Un matrimonio veramente fico!!

E’ già passato più di un mese dal 21 Maggio, e ormai da qualche settimana sono tornato alla solita routine, anche se con la mente sono ancora alle Seychelles.

Con un po’ di ritardo volevo ringraziare tutti quelli che hanno reso il matrimonio mio e di Chiara, il più bel giorno che abbia mai vissuto nella mia vita. Siete stati veramente grandi, e quella giornata ha sicuramente superato ogni mia aspettativa. Siamo andati oltre ogni formalità e abbiamo rischiato anche un po’ :-) festeggiando alla grande!! Ringrazio anche tutto il parentato che è sceso con il pulmin per l’evento….!!

Beh che dire, io e Chiara sicuramente vorremmo ripetere l’evento… vi terrò aggiornati ;-) !!

Grazie di cuore

Si avvicina un grande giorno

Era il lontano 2001, quando conobbi una ragazza alla facoltà di psicologia, una tipa esplosiva che mi ha attratto fin dal primo minuto. Questa ragazza si chiama Chiara e per chi non la conoscesse è la mia attuale compagna nonché futura sposa. Sono passati molti anni da quel primo giorno, ma ve lo dico sinceramente a me non sembrano così tanti.

Il 21 Maggio prossimo per me e Chiara sarà un giorno molto importante, il giorno del nostro matrimonio. Voglio ringraziare, prima di tutto Chiara, che mi sopporta da così tanto tempo e che follemente ha deciso di sopportarmi ancora per un bel po’ :-P . Voglio anche ringraziare tutti i miei amici (bastardi) che in questi ultimi quaranta giorni ci hanno rallegrato le giornate con un count down veramente creativo.

Beh che dire, l’emozione sale insieme al desiderio di vedere arrivare questo giorno e viverlo appieno con tutti gli amici e i parenti. Poi ci attende un bel viaggio alle Seychelles!!!

Per chi ci sarà ci vediamo il 21 Maggio!!!

Interessati a fare refactoring del vostro codice php?

Il 6 Dicembre 2010 alle ore 11:00 si terrà il primo webinar in collaborazione tra Zend ed Ideato sul refactoring del codice PHP. Di seguito un estratto direttamente dal sito ufficiale di zend:

Sono sempre più numerose le applicazioni legacy aziendali che sono diventate difficili da manutenere e da estendere. La riscrittura completa di un’applicazione non è quasi mai l’approccio corretto da seguire, soprattutto dal punto di vista business. In questo webinar si parlerà di come realizzare il refactoring di codice PHP e di alcune metodologie di ingegneria del software da seguire per non perdersi nei meandri del codice. Dal punto di vista degli strumenti da utilizzare si parlerà di PHPUnit e Selenium, per il testing automatico del codice PHP, e di Zend Studio, l’IDE di Zend Technologies per facilitare il refactoring e la gestione del codice PHP.

Presentano: Francesco Trucchia, CTO di Ideato srl, Solution Partner di Zend Technologies e Enrico Zimuel, Senior Consultant & Architect, Zend Technologies

Il webinar è gratutito e in lingua italiana. Registratevi!!

Prossima pagina »