ArToo Campus, scuola di eccellenza per la formazione Web e mobile developer ad Ancona nelle Marche.

“Scuola, Formazione, Lavoro: parole importanti che richiedono attenzione e riflessione, ma anche cratività e innovazione. Innovazione Dirompente. Disruptive! Parola difficialmente traducibile in Italiano che trasmette quasi in forma onomatopeica una sensazione di urgenza di azione, di movimento, di nuove sfide e nuovi traguardi da raggiungere. Formare giovani e manager per un nuovo modo di lavorare in un mondo fatto di cultura e visione futura, applicando metodi e strumenti per ottenere risultati validi in tempi ridotti. Ci piace chiamarli “crash courses” e anche in questo caso la traduzione letterale è riduttiva: “corsi intensivi” non rende l’idea. Crash, scontro, attimo, momento, compressione.”

ArToo Campus - Disruptive Innovation

Sono queste le parole di presentazione con cui si presenta Artoo Campus, realizzato nella struttura storica della “Stella Maris” di Ancona ospita le aule di formazione, gli spazi per gli eventi e le attività parallele, e le camere riservate agli allievi. Un’immersione nel verde a due passi dal mare che ricalca lo spirito di un college per crescere un’atmosfera di condivisione e collaborazione fra allievi e docenti.

Il programma è sicuramente interessante vasto e completo, spaziando da HTML5 e CSS3, JQuery, PHP e SQL, Security, UX Design, Angular.js/Node.js/MongoDB, Android, iOS, AJAX e Webservices.

A nostro avviso il percorso più completo da intraprendere per entrare a piedi pari nel mondo dello sviluppo Web, con la finalità di padroneggiare ciò che oggi sono inopinabilmente gli strumenti per un professionista del web.

Potete trovare ulteriori informazioni sui corsi a http://www.artoocampus.it/

Utilizzare professionalmente in ambito web un RDBMS come MySQL o PostgreSQL garantendo l’integrità dei dati, migliorandone le performance e la sicurezza.

databaseTra le cose che più destano indignazione nel mio lavoro, è quello di vedere colleghi o sedicenti tali, fare un uso delle tecnologie in modo errato, non avendo a cuore la lungimiranza e gli eventuali problemi che potrebbero verificarsi da li a poco.
Tra tutte le regole che ho imparato in 10 anni di lavoro ed altrettanti di studio è che prevenire è meglio che curare, e che con gli attrezzi giusti sei già a metà dell’opera.

Oggi voglio parlare di tutti quei web developer, che per scelta o causa di forza maggiore decidono di occuparsi anche della progettazione della base di dati su cui poi andrà a girare l’applicazione web scritta con un linguaggio server side, (PHP, Ruby, Python, ASP, ecc.)

Quello che trovo nella maggior parte dei casi quando non c’è un DBE (Database Engineer) a svolgere il delicato ruolo di progettare la base di dati, è  un progetto inconsistente, non performante e lacunoso sotto tutti i punti di vista.

Ciò potrebbe anche “andar bene” qualora gli effetti nefasti di una cattiva progettazione non mettano a rischio l’integrità dei dati e la coerenza del database stesso, o nei casi in cui l’integrità dei dati e la coerenza non siano uno dei requisiti fondamentali da tener presente in fase di progettazione.

Vuoi perchè sia un blogghettino personale, vuoi perchè i dati trattati non hanno un valore tale da giustificare un’accurata pianificazione e progettazione dello stesso.

Non è invece possibile vedere progetti campati per aria quando si ha a che fare con software seri che gestiscono informazioni riservate o dati fiscali e finanziari, in cui l’integrità e la consistenza della base di dati è fondamentale.

Anche un “banale” e-commerce dovrebbe rispondere a questi requisiti.

La realtà è fatta invece di dilettanti che usano i potentissimi RDBMS, (normalmente in ambito LAMP MySQL) limitandosi all’utilizzo più banale che se ne possa fare : un semplice “archivio con tanti cassetti” in cui fare INSERT, SELECT, UPDATE, e DELETE tramite l’applicazione web che ci gira sopra.

Funzionalità come Viste, Stored Procedure, integrità referenziale, Trigger, Transazioni, Indici , vengono prettamente ignorate.

Se una persona competente decidesse di eliminare la casa automobilistica FIAT dal database veicoli a cui è referenziata la tabella modelli:

FIAT

– Panda
– Punto
– Palio
– Siena
– Brava

Avrebbe solo l’accortezza in fase di progettazione di settare il vincolo ON DELETE CASCADE, sulla relazione Casa<-Modelli.
Questo vincolo impartisce l’ordine di cancellare i record referenziati alla cancellazione della chiave primaria esterna a cui è stata referenziata.

Un dilettante invece dovrebbe scorrere tutta la tabella modelli, cancellare tutti gli elementi con una DELETE FROM Modelli WHERE casa like “FIAT”; e solo successivamente salire al “nodo padre” e cancellare definiticamente la casa automobilistica con un DELETE FROM Casa WHERE nomecasa LIKE “FIAT”;

Cosa succede poi quando un DB genera un errore ?

Vuoi che sia generato a livello applicativo da un codice scritto male, vuoi che vada via l’energia elettrica, la rete, o si rompa l’alimentatore ?

Mettiamo l’ipotesi banale in cui due utenti della stessa banca, decidano di farsi un bonifico tra loro : Tizio bonifica 1000 euro a Caio.

Tizio fa click col mouse, il sistema riceve il dato, toglie 1000 euro a Tizio e … BUM (scoppia l’alimentatore del server).

Arriva il tecnico, ripara l’alimentatore, riavvia il sistema e ci troviamo nella condizione in cui Tizio ha 1000 euro in meno sul suo conto, Caio non ha 1000 euro in più, in quanto l’operazione di accredito non è andata a buon fine perchè appena prima l’alimentatore si è rotto.

In queste situazioni un progettista serio avrebbe dovuto usare una TRANSAZIONE ACID, ovvero una metodologia per eseguire un gruppo di query, in cui o le si eseguono TUTTE, o si ripristina il DB allo stato iniziale, prima dell’esecuzione del gruppo di query.

Nel caso avesse usato una transazione, al riavvio del sistema, il DBMS avrebbe letto i log e accorgendosi che era stata eseguita solo una parte delle query, avrebbe eseguito il ROLLBACK e ritornato nelle condizioni iniziali prima del bonifico.

Questi esempi sono volutamente banali in quanto rivolti appunto a coloro che approcciano al mondo dei DB, senza avere padronanza di concetti basilari come modello E/R, normalizzazione e peculiarità di DBMS Relazionali avanzati come possono essere MySQL, PostgreSQL, Oracle, SQL Server o altri.

La pigrizia spesso genera quella falsa illusione di fare bene le cose, ignorando funzionalità che permettono di farle in maniera molto più facile e sopratutto sicura.

Approcciare ad una sana lettura sulle potenzialità del motore InnoDB, e le relative differenze con MyISAM, per chi si approccia alla progettazione di una base di dati su MySQL è il primo passo.

Determinare se un utente sia loggato a facebook utilizzando solo javascript

facebook-spyQuello che voglio mostrare in questo articolo è la possibilità di determinare tramite puro Javascript (ed in appena 4 righe di codice) se un utente è loggato o meno a Facebook.

Ciò potrebbe essere utile per proporre dei contenuti diversi quando l’utente visita la nostra pagina web, in relazione al fatto che l’utente sia loggato o meno.

Va premesso che Facebook fornisce uffcialmente dei comodi ed esaustivi  SDK Javascript e PHP per fare questo tipo di operazioni, ma che l’utilizzo di questi strumenti comporta alcuni passi obbligatori che sebbene possano andare più che bene per la maggior parte degli utenti, potrebbe non andare bene a chi vorrebbe farne un uso “diverso”.

  1. L’utente deve registrare un applicazione a cui sarà associata un APPID univoca.
  2. L’utente che naviga deve aver accettato precedentemente il consenso per l’applicazione
  3. A livello applicativo il webmaster deve portarsi dietro tutto il framework configurato su misura per quella applicazione.

Ma se volessimo “SOLO” sapere se l’utente sia loggato a Facebook nel momento in cui naviga sulla nostra pagina ? 

Premesso che non ci interessa sapere nulla di più e nulla di meno se risulta loggato, senza dover dunque registrare nessuna applicazione Facebook e senza far interagire minimamente il visitatore con le applicazioni Facebook.

Il modo migliore è quello di usare i codici di stato di risposta del Webserver.

L’idea alla base è quella che alcune pagine di Facebook possano ritornare un codice di stato differente se si è loggati o meno.

Se ad esempio si crea un profilo Facebook visibile solo agli utente correntemente loggati su Facebook quando un utente NON loggato tenterà di vedere il profilo privato riceverà uno stato HTTP di errore di tipo 404.
Viceversa quando un utente loggato cercherà di visualizzare il profilo privato otterrà uno stato HTTP di tipo OK, cioè 200.

Tutto quello che bisogna fare dunque è di caricare l’url di un profilo privato (che volendo potremmo creare maliziosamente fasullo appositamente per lo scopo) in un tag di tipo script e agganciarci l’evento onload() e onerror().

Se si verificherà l’errore (ovvero la restituzione di un codice di stato HTTP di tipo 404) l’utente non è loggato a FB e stamperà a video il messaggio “Non Loggato a Facebook”.
Se si verificherà l’evento onload() (è stato ricevuto un codice di stato HTTP di tipo 200) l’utente è correntemente loggato a FB e stamperà a video il messaggio “Non Loggato a Facebook”.

Il codice è molto semplice e banale ma di reale efficacia, visionabile in questo esempio caricato su jsFiddle :

Crystal Reports 2011 : The Product Keycode is not valid INS00140. Soluzione al problema.

Ho deciso di scrivere questo post e proporre la soluzione nel download, perchè molta gente (come me) è diventata matta nell’installare SAP Crystal Reports 2011.
Al momento dell’installazione infatti pur disponendo di un codice di attivazione originale, l’installazione si blocca con questo snervante errore : “The Product Keycode is not valid INS00140.
Il motivo per cui generi quest’errore mi è sconosciuto, ma ho trovato un modo semplice ed efficace per bypassare la validazione del codice e proseguire l’installazione senza ulteriori errori.

Nota : Si ricorda che questo metodo viene divulgato per quegli utenti in possesso di una licenza d’uso originale e una regolare chiave d’attivazione.

Alla base dell’errore c’è il malfunzionamento dell’eseguibile isKeyCodeValid.exe che per oscuri motivi ritorna 0 all’installer, invece di 1, e dunque risulta impossibile proseguire.
L’hack è dunque piuttosto semplice, basta infatti sostituire il file isKeyCodeValid.exe con uno creato adhoc che ritorna 1 (lo trovate nel download alla fine di questo articolo) per bypassare la validazione del codice di attivazione e proseguire indisturbati nell’installazione.

L’eseguibile è stato prodotto tramite Visual C++ in appena 3 righe di codice :

#include “stdafx.h”

int _tmain(int argc, _TCHAR* argv[])
{
    return 1;
}

Il file da sostituire lo trovare nella cartella di installazione, ovvero : DATA_UNITS\CrystalReports\dunit\product.crystalreports-4.0-core 32\actions\isKeyCodeValid.exe

Per chi non ha dimestichezza con linguaggi di programmazione e compilatori, l’eseguibile precompilato può essere scaricato alla fine di questo articolo cliccando sul bottone download.
Sostituite il file originale con quello che avete scaricato da qui e proseguite sereni con l’installazione.

English note for all non italian readers :

if u cannot install Crystal Report 2011 cause setup return “The Product Keycode is not valid INS00140.” error, download file at the end of this post, extract and replace  DATA_UNITS\CrystalReports\dunit\product.crystalreports-4.0-core 32\actions\isKeyCodeValid.exe with isKeyCodeValid.exe found in the downloaded archive.

Cause unknow reason the original isKeyCodeValid.exe sometimes don’t validate original key code activation and return 0 to setup installer. The replacement file return 1 and allow the installation.

Personalizzare checkbox html. Customizing checkbox form html. Ie6 compatibile.

Se avete mai avuto il bisogno di poter effettuare lo skinning di elementi checkbox in pagine html, ovvero sostituire il bruttissimo e classico quadratino per la spunta, con la vostra grafica, per dare un tocco di eleganza e personalizzare la vostra pagina web, potrete vedere nel seguente videotutorial i passi da fare per riuscire in pochissimi minuti nell’impresa altrimenti non proprio banale.

In questo tutorial vedremo dunque come :

  1. nascondere il checkbox originale.
  2. Sostituire il checkbox originale con uno creato ad hoc da noi stessi.
  3. Come far in modo che il checkbox sia cliccabile in tutti i browser (da internet explorer 6 in poi) anche quelli che non supportano CSS3

 

Il progetto si avvale esclusivamente di “trucchi” CSS per soddisfare i primi 2 punti, e dell’aiuto di selectivizr ( una utility JavaScript che emula le pseudo-classi CSS3 e i selettori di attributo in Internet Explorer 6 a Internet explorer 8 ) per rendere la nostra checkbox cliccabile.

Inoltre la tecnica utilizzata non genera “interferenze” o incompatibilità rendendo comunque il codice validabile e non effettua il replacement a runtime come alcuni plugin per lo styling delle form html (jqTransform ad  esempio) che successivamente danno l’impossibilità di accedere a runtime agli elementi html precedentemente dichiarati.

Attualmente questo è il modo più semplice e pulito per effettuare la personalizzazione di checkbox html.

Il file zip con l’esempio è scaricabile cliccando qui.

Correggere `ereg is deprecated` in PHP 5.3

Se avete aggiornato a PHP 5.3 troverete probabilmente alcuni messaggi di warning riguardanti le funzioni deprecate.

Ad esempio la famiglia delle funzioni ereg sono state sostituite con le compatibili Perl preg.

Per migrare ereg():

ereg('\.([^\.]*$)', $this-&gt;file_src_name, $extension);

diventerà

preg_match('/\.([^\.]*$)/', $this-&gt;file_src_name, $extension);

Per migrare ereg_replace():

$this-&gt;file_dst_name_body = ereg_replace('[^A-Za-z0-9_]', '', $this-&gt;file_dst_name_body);

diventerà

$this-&gt;file_dst_name_body = preg_replace('/[^A-Za-z0-9_]/', '', $this-&gt;file_dst_name_body);