Meglio PHP, Python o Rails?

Bella domanda, eh? E non sperate che vi infonda la saggezza con una risposta univoca…

Entriamo più nei particolari: questa domanda mi è stata posta da un neolaureato in Ingegneria Informatica che una infarinatura di base in ogniuno di questi tre linguaggi e che “mira” ad una occupazione nel campo dell’application web development. In quali di questi tre linguaggi è più conveniente approfondire le conoscenze per trovare occupazione?

Posta in questo modo, la domanda è meno banale di quanto sembri e la risposta deve essere ponderata attentamente.

Intanto bisogna prendere in esame il mercato di riferimento: dove il nostro eroe vuole proporsi come programmatore? Se è in Italia la risposta è abbastanza scontata: meglio approfondire PHP in quanto è senza dubbio il linguaggio più usato dagli sviluppatori e quindi è più facile trovare una occupazione. All’estero non è sempre così: Python, Rails e lo stesso Java (Scala) sono prodotti molto utilizzati e quindi la risposta non potrà essere univoca: meglio documentarsi su quali sono i linguaggi utilizzati dalle aziende su cui si vorrebbe trovare occupazione e scegliere di conseguenza.

Altra cosa da tenere in considerazione oltre al linguaggio è il framework. Difatti programmare un sito “da zero” è una cosa che non viene più fatta da tempo: di solito si utilizza un framework che mette a disposizione delle primitive in grado di levarci l’onere di gestire le funzionalità più comuni, soprattutto ora che il web 2.0 ha reso lo sviluppo di siti web molto più complesso.

Difatti se nel caso del lingaggio Rails il framework Ruby on Rails la fa da pardona, così come nel caso di Python con il framwork Django, non è assolutamente così nel caso del PHP in cui esistono una gran varietà di framework tutti molto diffusi: quindi, nel caso in cui si ricerchi occupazione in Italia, la metodologia di “informarsi a priori” su quale Framework è meglio approfondire è valida.

Arrivati a questo punto, non abbiamo però comunque risposto alla domanda iniziale. Ammettiamo che il nostro eroe non abbia alcuna possibilità di informarsi a priori e quindi debba adare alla cieca. Cosa fare?

In questo caso vale una regola importante che spesso viene trascurata: il linguaggio di programmazione scelto, così come il framework, sono degli strumenti per arrivare ad un obiettivo, per cui un bravo programmatore deve comunque avere al capacità di non spaventarsi nell’imparare un nuovo linguaggio.

PHP è un linguaggio che è molto diffuso perchè è molto facile da imparare: la documentazione è imponente e comunque non impone delle regole precise a cui attenrsi rendendo al programmatore la vita apprentemente più facile. Questa caratteristica, in contrapposizione alla sua diffusione in Italia, ha reso PHP un linguaggio che viene spesso snobbato nell’ambiente in quanto è facile trovare delle autententiche porcate sviluppate da “simil-programmatori” con pochi scrupoli. Sia ben chiaro, non è colpa del linguaggio, è colpa di chi programma in maniera oscena.

Al contrario Ruby on Rails è un framework/linguaggio che impone un metodo di programmazione ben definito (il già citato MVC), è il linguaggio più “di moda” in questo momento ed è un framework estremamente completo.

A mio avviso, per chi “sa programmare” ma deve imparare un linguaggio, Ruby on Rails è la scelta migliore perchè così si prende confidenza con alcune best practices di programmazione sempre valide. Con una conoscenza approfondita di RoR, nel caso in cui venga richiesto di programmare in PHP, il nostro eroe non avrà alcun problema ad imparare il nuovo linguaggio e il suo codice sarà certamente più di alta qualità rispetto ad un “autodidatta del PHP”.

La confusione tra IaaS, PaaS e SaaS

Una simpatica affermazione che si sente spesso dire nell’ambiente è che il cloud è come il sesso ai tempi del liceo: tutti ne parlano, pochi sanno cos’è, pochissimi lo sanno far bene 😉

Vediamo intanto di chiarire cos’è un cloud: un cloud è una struttura hardware formata da più nodi di calcolo e di storage che lavorano in maniera sincronizzata per offrire dei servizi.

Un qualsiasi cloud, quindi, è formato da tre componenti: lo storage (che può essere una SAN, un NAS, o una struttura complessa formata da un filesystem zeroshare), i nodi di calcolo (quindi un qualsiasi sistema in grado di gestire la virtualizzazione di processi, normalmente per comodità un Hypervisor com VMware, XEN o KVM che virtualizza l’intera struttura hardware) e un controller.

Come già detto in questo articolo, se il numero di processi istanziabili è minore del numero di nodi di calcolo si parla si grid computer (o supercomputer), nel caso in cui i processi istanziabili siano maggiori del numero di nodi hardware, si parla di cloud computer vero e proprio, anche se spesso i termini clud e grid vengono assimilati.

I servizi che possono essere offerti attraverso una struttura cloud sono di tre tipi IaaS, PaaS e SaaS e normalmente sono tutti offerti da chi possiede una struttura cloud. Spesso sentiamo nominare questi tre acronimi, ma di cosa si tratta in realtà? E’ su questa delucidazione che mi voglio soffermare in questo articolo.

IaaS è l’acronimo di Infrastructure as a Service ed è il servizio più vicino a ciò che forma il cloud. Quando acquisto un servizio IaaS, ho a disposizione una virtualizzazione dell’hardware di un computer tradizionale: quindi ho della CPU, della RAM, dello Storage e delle schede di rete con connettività. Attraverso questo sistema ho a disposizione tutte le potenzialità e la flessibilità di un computer fisico, senza avere la preoccupazione di dover pensare all’hardware o alla continuità di servizio in caso di guasto hardware, in quanto è compito del fornitore di servizi occuparsi di questi aspetti di livello basso. Per fare un esempio, il classico servizio EC2/S3 di Amazon è un servizio IaaS: compro il servizio, installo il sistema operativo che preferisco e creo le mie applicazioni in questo ambiente per poter offrire un servizio; d’altro canto dovrò essere io ad occuparmi di tutti gli aspetti legati al bilanciamento di carico su più istanze, a strutturare una base dati adatta, ecc. Per quanto riguarda i costi di un simile servizio, in Italia, normalmente, si è solito offrire servizi IaaS in modalità Flat con fatturazioni periodiche; i veri servizi IaaS, però, permettono la fatturazione “a consumo” in quanto una istanza IaaS è un costo per il fornitore solo quando lavora e non quando è “ferma”: in pratica se un servizio IaaS lavorasse sempre a pieno regime i costi sarebbero analoghi (di poco superiori) a quelli di una modalità Flat standard, ma contando sui “tempi morti” si riescono ad avere costi normalmente molto più convenienti.

PaaS è l’acronimo di Platform as a Service, cioè la virtualizzazione di una piattaforma. In questo caso non mi devo occupare della infrastruttra attraverso la quale è realizzata una piattaforma: ad esempio non mi devo preoccupare di quanto spazio occupa il mio database o come fare a distribuire il carico di lavoro tra più servizi IaaS, in quanto tali problematiche sono già state affrontate da chi mi offre il servizio PaaS (probabilmente utilizzando la sua infrastruttura IaaS): io devo solo preoccuparmi di creare la mia applicazione per poter offrire il mio servizio. In questo caso, però, ho meno oneri ma anche meno flessibilità: difatti il mio fornitore di servizi ha sicuramente optato per delle scelte riguardo alla piattaforma su cui offrire il servizio PaaS a cui mi devo adattare per sviluppare la mia applicazione. Ad esempio, se il mio fornitore ha optato per offrirmi una infrastruttura LAMP (Linux-Apache-MySQL-PHP), dovrò necessariamente scrivere la mia applicazione utilizzando il linuguaggio PHP e una base dati MySQL. Se, al contrario volessi programare in Ruby on Rails oppure avere una base dati Oracle o MongoDB, dovrò scegliere un altro fornitore di servizio o acquistre un servizio IaaS ed arrangiarmi nella configurazione sistemistica. Quindi, giusto per fare un esempio concreto come già accennato, un qualsiasi hosting PHP/MySQL attraverso il quale posso sviluppare una applicazione, è un servizio PaaS. Un altro esempio di PaaS è il Google App Engine che prentende che l’applicazione sia scritta in Java o in Python. Questo tipo di servizio normalmente è fatturato in modalità Flat: si sceglie un “taglio” (quanti MB di spazio su disco, la quantità di banda, ecc.) e si paga con cadenza periodica.

SaaS è l’acronimo di Software as a Service, cioè un servizio software realizzato su una piattaforma che a sua volta poggia su una infrastruttura. E’ il servizio di più alto livello che può essere offerto ed è quello del servizio per l’utente finale. Alcuni esempi di servizi SaaS sono un accesso webmail, un CRM, le classiche “Google Apps”… Questo tipo di servizi è normalmente fatturato con cadenza periodica sulla base del numero di utenti attivati.

Un nuovo servizio: www.quora.com

A chi di voi legge abitualmente la rivista Wired, non sarà sfuggito l’ottimo articolo sul numero di maggio a proposito di un nuovo servizio sul web: www.quora.com.
Per chi non legge Wired e non conosce cos’è quora, riassumiamo brevemente di cosa si tratta.

Il sito nasce dall’intraprendenza di due ragazzi provenienti dallo staff di Facebook con la volontà di realizzare un servizio di domande-risposte. La loro filosofia è quella che se qualcuno chiede “se ti offro una birra, mi dai un paio di dritte su come lanciare una startup?”, loro possono decidere di regalare 5 minuti del loro tempo per aiutarlo, ma questi consigli sono perduti per chi non sta ascoltando la conversazione nel momento in cui escono dalla loro bocca. Pertanto il loro sito vuole rispondere a questo problema, cioè essere un sistema per porre domande e ricevere una risposta che rimane scritta.

Diciamoci la verità, servizi simili ne esistono già a bizzeffe: Yahoo Answer, Expert Exchange… anche Google tentò in passato un simile servizio con Google Answer, salvo poi dover alzare bandiera bianca in quanto di poco successo.

Perchè allora Quora dovrebbe avere successo? Beh, come spesso accade, il motivo di successo di una iniziativa non è il cosa fa, ma il come lo fa: pensiamo a Facebook il cui core business è ricavare informazioni personali dai propri utenti, proprio come fanno i sondaggisti ma con un metodo totalmente diverso!

Quora nasce come “scommessa” di due persone del settore, che per lanciare il loro servizio hanno invitato inizialmente dei loro amici… tutti del settore! Tra i più prolifici risponditori di domande in quora ad esempio ci sono il fondatore di Foursquare, il vicepresidente di Google… Quindi, un conto è ricevere una risposta alla domanda precedente da Alberto Zuin, un conto è riceverla dal CEO di una azienda di successo della Silicon Valley. Questo per dire che il punto di forza di Quora è la qualità di chi partecipa e, di conseguenza, l’altissima qualità dei contenuti.

Se vi ho stuzzicato l’appetito e volete provare ad essere un membro di Quora, riceverete un’amara sorpresa: non è possibile iscriversi direttamente dall’Italia in quanto è necessario un invito. La scelta di Quora di non essere un sito aperto a tutti ma solo ad una elite di persone, serve per mantenere alto il livello dei contenuti. L’idea è far si che chi si assume la responsabilità di invitare un utente in Quora, debba fare opera di “evangelizzazione” a priori, in modo che il nuovo utente sia ben conscio di qual è il servizio e come funziona, in modo che contribuisca a mantenere gli elevati standard qualitativi che lo caratterizzano.

Come fare se nessuno dei nostri amici è un utente Quora? Da chi possiamo ricevere un invito per accedere al sistema? Bene, siamo in Italia: fatta la legge, trovato l’inganno. In realtà Quora non è chiuso a tutti, ma è un servizio che al momento è aperto alla maggior parte di utenti che si connettono dagli Stati Uniti, per cui è sufficiente iscriversi usando una connessione di quel paese: con questo non voglio dire che dovete prendere un aereo e andare oltreoceano, è sufficiente mascherare il proprio IP utilizzando un proxy in America.

Per entrare nel dettaglio: visitate il sito Hide my Ass e visualizzare la lista di proxy online. Scegliete un proxy in USA di tipo HTTP ed inserite l’indirizzo IP e la porta all’interno delle impostazioni del vostro browser. Quindi andate sul sito di quora e vedete che ora potete procedere con il signup.

Buona lettura!

Model View Controller (MVC) in PHP

Questo articolo è liberamente tratto da questo howto.

Il metodo di programmazione MVC è stato introdotto con Smalltalk e successivamente è stato reso famoso con l’intenso utilizzo in Java.
Attualmente questo modo di organizzare il codice è divenuto uno standard e più di una dozzina di Framework PHP, tra cui il diffusiussimo Zend, utilizza questo sistema: pertanto è utile capire cos’è in modo da non trovarci spiazzati nel momento in cui ci si ritrova ad averci a che fare.

Cos’è MVC
MVC è un metodo di organizzazione del codice che separa i file con il codice di una applicazione in 3 differenti moduli: Model, View e Controller:

  • Il model (modello)  è responsabile di gestire i dati; legge e memorizza i dati usati dall’applicazione, normalmente su un database, e contiene la logica implementata dall’applicazione.

  • Il view (vista) e reponsabile di mostrare i dati gestiti dal model in un formato specifico. E’ un sistema simile ai template presenti in alcune web application come wordpress o joomla

  • Il controller permette al model e al view di lavorare assieme: il controller riceve una richiesta dall’utente, chiama il model per trattarla e invia i dati al view; quest’ultimo formatta i dati che vengono presentati all’utente, nel nostro caso in formato html

In questo esempio realizzeremo una semplice applicazione PHP che sfrutta questa suddivisione di file.
Innanzi tutto, è utile sapere che per rispettare questa visione, dal punto di vista gerarchico, vengono create tre diverse directory ove ospitare i file relativi ai tre diversi moduli. Ecco come si presenta l’albero directory del nostro esempio:

Analizziamo quindi ogni singolo file descrivendo le funzioni:

index.php

<?php
 include_once("controller/Controller.php");

 $controller = new Controller();
 $controller->invoke();

?>

Il file index.php è il file che prende in carico le richieste del nostro sito, il cosidetto entry point. Questo file non fa altro che includere il file con il controller (controller/Controller.php), istanziare un nuovo oggetto Controller (che fantasia, eh?) e invocare l’unico metodo presente in questo oggetto (invoke, sempre per essere fantasiosi).

controller/Controller.php

<?php
include_once("model/Model.php"); 

class Controller {
 public $model; 

 public function __construct()  
 {  
 $this->model = new Model(); 

 }  

 public function invoke()
 {
 if (!isset($_GET['book']))
 {
 // nessuna richiesta specifica, mostro tutti i libri disponibili
 $books = $this->model->getBookList();
 include 'view/booklist.php';
 }
 else
 {
 // mostro solo il libro richiesto
 $book = $this->model->getBook($_GET['book']);
 include 'view/viewbook.php';
 }
 }
} 

?>

Il nostro controller è una classe formata dal costruttore (la funzione richiamata automaticamente quando si crea un oggetto) e da una sola funzione (invoke). Il costruttore si occupa solo di istanziare un nuovo oggetto “Model”, mentre la funzione invoke che viene richiamata ad ogni richista, si occupa semplicemente di capire quale tipo di dato è richiesto e di invocare il model relativo per poi mostrarlo attraverso il view opportuno.
Notare che il controller non conosce nulla riguardo la base dati o come la pagina viene generata, non fa altro che controllare ciò che viene richiesto e richiamare le funzioni opportune.

model/Model.php

<?php

include_once("model/Book.php");

class Model {
 public function getBookList()
 {
 // A titolo di esempio simuliamo un database con degli arrayt hard coded
 return array(
 "Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."),
 "Moonwalker" => new Book("Moonwalker", "J. Walker", ""),
 "PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "")
 );
 }

 public function getBook($title)
 {
 // Utilizziamo la precedente funzione per estrapolare dall'elenco libri solo quello richiesto.
 // in un caso reale, questa operazione sarà eseguita da un comando db select
 $allBooks = $this->getBookList();
 return $allBooks[$title];
 }

}

?>

Il file model.php, definisce una nuova classe (Model) con all’interno due funzioni:

  • getBookList è la funzione che restituirà l’interno elenco di libri presenti nella nostra base dati. In questo esempio, per semplicità, creeremo un array formato da tre oggetti “Book” i cui dati sono hard coded; in una situazione reale, ovviamente, tali dati saranno contenuti all’interno di un database;

  • getBook è la funzione che estrapola i dati relativi ad uno specifico libro dalla base dati; dato che la funzione precedente utilizza un array di dati, questa funzione seleziona l’elemento dell’array in base all’indice. In una situazione reale, ovviamente, si utilizzerà l’istruzione “SELECT” di un database.

Dato che nella funzione getBookList abbiamo fatto riferimento all’oggetto Book, inizialmente si include il file “Book.php” contenete la definizione di questo oggetto con il solo costruttore:

model/Book.php

<?php

class Book {
public $title;
public $author;
public $description;

public function __construct($title, $author, $description)
{
$this->title = $title;
$this->author = $author;
$this->description = $description;
}
}

?>

In una situazione reale, il file model.php includerà tutti i file che definiscono le classi usate con le funzioni per leggere e scrivere tali dati all’interno del database.

Ora analizziamo le view. Nel nostro controller.php, vengono inclusi due file view a seconda del tipo di dato da mostrare all’utente.

view/booklist.php

<html>
<head></head>

<body>

<table>
 <tr><td>Title</td><td>Author</td><td>Description</td></tr>
 <?php 

 foreach ($books as $title => $book)
 {
 echo '<tr><td><a href="index.php?book='.$book->title.'">'.$book->title.'</a></td><td>'.$book->author.'</td><td>'.$book->description.'</td></tr>';
 }

 ?>
</table>

</body>
</html>

Attraverso questo file viene creata una tabella con la lista dei libri presenti all’interno della nostra base dati. Facendo click sul titolo si aprirà una seconda pagina con i dettagli del libro.

view/viewbook.php

<html>
<head></head>

<body>

<?php 

 echo 'Title:' . $book->title . '<br/>';
 echo 'Author:' . $book->author . '<br/>';
 echo 'Description:' . $book->description . '<br/>';

?>

</body>
</html>

Attraverso questo file viene definita la vista con i dettagli del libro selezionato.

Aggiorniamo VMWare ESXi dalla 4.0 alla 4.1update1

In questo articolo spiegherò come aggiornare VMWare ESXi dalla versione 4.0 alla 4.1 update 1 usando la console SSH.

Innanzi tutto, per procedere con questa modalità di aggiornamento, è necessario abilitare l’accessio SSH a VMWare ESXi come spiegato in questo articolo.

Quindi procedere al download del pacchetto upgrade-from-esxi4.0-to-4.1-update01-348481.zip dal sito ufficiale di vmware e scopattare il file all’interno del proprio PC in una directory chiamata “upgrade”.

Ora collegarsi all’host VMWare tramite il vSphere Client, click sulla tabella “Summary” dell’host e click col pulsante destro del mouse sul datastore e scegliere “Browse Datastore…”

Una volta aperta la finestra, scegliere “Upload file to datastore” -> “Upload folder” e scegliere la direcory con i file scompattati all’interno del proprio PC.

Chiudere la finestra del Browse Datastore e, infine, dalla tabella “Summary” dell’host scegliere “Enter Maintenance Mode”.

Ora colleghiamoci in SSH all’host VMWare per lanciare il processo di aggiornamento.

I comandi da lanciare sono:

cd /vmfs/volumes/datastore1/upgrade

dove datasore1 è il nome del datastore nel quale è stato fatto l’upload e upgrade è il nome della directory caricata precedentemente;

esxupdate update –m metadata.zip

A questo punto inizierà il processo di aggiornamento vero e proprio.

Al termine del processo, verrà richiesto di riavviare il sistema. Fatelo e accedete nuovamente attraverso il vSphere Client per verificare il corretto aggiornamento. Ricordatevi a questo punto di uscire dal Maintenance Mode.