Disclaimer per i contenuti del Blog


DISCLAIMER:Questo blog non rappresenta una testata giornalistica in quanto viene aggiornato senza alcuna periodicità . Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n° 62 del 7.03.2001.
L'autore non è responsabile per quanto pubblicato dai lettori nei commenti ad ogni post. Verranno cancellati i commenti ritenuti offensivi o lesivi dell’immagine o dell’onorabilità di terzi, di genere spam, razzisti o che contengano dati personali non conformi al rispetto delle norme sulla Privacy. Alcuni testi o immagini inserite in questo blog sono tratte da internet e, pertanto, considerate di pubblico dominio; qualora la loro pubblicazione violasse eventuali diritti d'autore, vogliate comunicarlo via email. Saranno immediatamente rimossi. L'autore del blog non è responsabile dei siti collegati tramite link, del loro contenuto che può essere soggetto a variazioni nel tempo ne degli eventuali danni derivanti dall'utilizzo proprio od improprio delle informazioni presenti nei post.

domenica 8 ottobre 2017

validateForm: una classe Javascript per la convalida dei form


Una delle operazioni più noiose quando si realizzano front-end HTML è la verifica della validità dei dati inseriti dall'utente.

Normalmente è il modulo attivato dal submit del <FORM></FORM> a farsi carico di tutti i controlli e a decidere se i dati sono accettabili o se si renda necessario l'intervento dell'utente per la loro correzione.

Intendiamoci, non mi sono inventato nulla di talmente innovativo da evitare tutta questa serie di noiose operazioni ma sicuramente le rendo più agevoli ed "eleganti".

Il modulo principale è uno script JS che si appoggia a jQuery (testato dalla v2.1 in poi, probabilmente funzionante anche con versioni precedenti) e che comunica con un modulo PHP di controllo via AJAX così da ridurre il più possibile i reload del form in caso di errori; questo modulo JS si fa carico delle verifiche più semplici e di delegare quelle più complesse a quello PHP.

Attualmente il modulo PHP supporta la verifica del Codice Fiscale, della partita IVA (solo italiana per ora) del codice IBAN (solo italiano per ora), della correttezza di una URL, della validità ed esistenza di una URL; eventuali routines di controllo aggiuntive possono essere implementate molto semplicemente.

Se la pagina HTML dovesse contenere più <FORM></FORM>, è possibile attivare una istanza di  validateForm per ogni blocco ricordando ovviamente di attribuire un id diverso ad ogni form.

L'implementazione è molto semplice e si riduce al caricamento del modulo validateForm.js e validateForm.css (e di jQuery se non già presente), all'aggiunta di una porzione di codice nella sezione <SCRIPT></SCRIPT> e nella specifica di quali controlli effettuare per ogni tag <INPUT> o <SELECT> aggiungendo l'attributo (personalizzabile, se necessario) data-validation="[tipo_di_verifica]".

Vediamo quali tipi di verifiche sono attualmente implementate, la colonna data-validation contiene il valore da inserire nell'omonimo attributo e facendo seguire tale valore dal suffisso -required si ottiene, oltre alla verifica descritta, anche la necessità di valorizzazione del campo (es. number-required):

data-validation Tipo di verifica
skip Nessun controllo di validità
required Richiesta valorizzazione dell'input
number Accettati solo caratteri numerici
email Indirizzo email formalmente valido
date Data valida in formato GG/MM/AAAA
equal-next Valore uguale a quello del campo successivo
equal-prev Valore uguale a quello del campo precedente
cf Codice Fiscale formalmente corretto
iban IBAN (italiano) formalmente valido
piva Partita IVA (italiana) formalmente valida
url URL formalmente valida
urlexists URL formalmente valida ed esistente

Una nota particolare spetta a equal-next e equal-prev: li ho implementati per verificare la doppia digitazione di password in due campi distinti in fase di cambio o creazione. Anche in questo caso il suffisso -required rende obbligatoria la digitazione del dato.

Iniziamo ad analizzare il codice. La prima cosa da fare è includere jQuery ed i moduli JS e CSS di validateForm inserendo queste righe tra i tag <HEAD></HEAD>:

    <!-- jQuery -->
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

    <!-- validateForm -->
    <script src="js/validateForm.min.js"></script>
    <link href="css/validateForm.css" rel="stylesheet">

ATTENZIONE: posizionare il caricamento di validateForm.css come ultimo per evitare modifiche indesiderate da eventuali altri CSS presenti!!

La seconda è l'inclusione trai i tag <SCRIPT></SCRIPT> del seguente codice di inizializzazione del modulo:

        $(document).ready(function() {
            //-- Inizializzazione modulo di validazione form
            $("#testform").validateForm({
                attr: "data-validation",
                phpAjax: "ajax/validateForm.php",
                skipCheck: function() {
                    return false;
                },
                dispError: function() {
                    alert("Riscontrati errori nel form - verificare i campi evidenziati in ROSSO");
                    return true;
                },
                submitForm: function() {
                    $.ajax({
                        cache: false,
                        async: true,
                        type: "POST",
                        url: "ajax/submitform.php",
                        dataType: "JSON",
                        data: $("#testform").serialize(),
                        success: function(response) {
                            if (response.theRc == 0) {
                                $("#result-data").html(response.theData);
                            } else {
                                alert(response.theMsg);
                            }
                        },
                        error: function(data, errorThrown) {
                            alert("Si è verificato un errore AJAX: " + data.responseText);
                        }
                    });
                }
            });
        });
Affinché l'inizializzazione si completi correttamente è necessario:

  • sostituire #testform con l'id del form da convalidare
  • verificare che il nome dell'attributo "data-validation" sia non utilizzato per altri scopi e semmai modificarlo
  • verificare che lo script associato alla proprietà phpAjax (quello che esegue i controlli lato host) sia corretto
  • personalizzare, se necessario, la routine di visualizzazione errore (ora è un semplice alert())
  • personalizzare le due funzioni success() ed error() presenti all'interno della funzione submitForm()
  • personalizzare l'url legata alla proprietà url della funzione submitForm() (in pratica è il modulo PHP che verrà eseguito all'atto del submit del form)

La terza ed ultima fase consiste nell'individuare i campi che dovranno essere sottoposti a verifica e completarli aggiungendo l'attributo data-validation (o altro definito in fase di inizializzazione del modulo) con il tipo di controllo richiesto ed un id (io per abitudine imposto ID e NAME con lo stesso valore ma non è obbligatorio ovviamente):

    <label for="cf">Codice fiscale</label>
    <input id="cf" name="cf" type="text" data-validation="cf-required">

A questo punto il lavoro è terminato e possiamo verificare il funzionamento del tutto. Una demo è disponibile su https://www.paolobertinetti.it/esempi/validateform/ ed il relativo codice sorgente può essere scaricato da https://www.paolobertinetti.it/esempi/validateform/validateform.zip.

In caso di dubbi, curiosità, consigli o semplicemente per farmi notare eventuali sviste, lasciate pure un commento qui sotto.

Se avete trovato utile questo modulo e vi fosse passato per la testa di fare una micro-donazione con PayPal sappiate che NON mi riterrò offeso :-)


mercoledì 21 settembre 2016

Internet va lento? Potrebbe essere colpa di WUDO...

Con Windows 10 Microsoft ha introdotto un sistema di distribuzione aggiornamenti parallelo a quello canonico il cui fine è velocizzare le operazioni di download.

Questo sistema è chiamato WUDO (Windows Update Delivery Optimization) e funziona, come molti altri software p2p, riservando una parte della banda internet per l'interscambio di aggiornamenti tra macchine W10 (anche esterne alla LAN) senza necessariamente coinvolgere i server Microsoft.

Sebbene Microsoft avesse garantito che questa porzione di banda fosse abbastanza limitata, nella realtà dei fatti diversi utenti con molte macchine Windows 10 hanno riscontrato frequenti rallentamenti della linea internet.

Fortunatamente il modo per disabilitare questa nuova caratteristica c'è:

  • andare su Impostazioni->Aggiornamento e Sicurezza->Windows Update
  • selezionare Opzioni Avanzate->Scegli come recapitare gli aggiornamenti



a questo punto possiamo scegliere se disattivare completamente questa funzione spostando lo switch su Disattivato, oppure lasciarla attivata ma limitarla all'ambito rete locale così da distribuire gli aggiornamenti solo in ambito LAN senza compromettere le performance di internet.


venerdì 19 agosto 2016

Visualizzare su una foto luogo, data ed ora di scatto con Situ


Mi sono imbattuto in questo software casualmente, durante la ricerca di una soluzione ad un problema con il modulo exiftools, e me ne sono innamorato immediatamente.

Il modulo è stato realizzato da Michael Lee, anche autore di GPStamper ed è attualmente disponibile e scaricabile da https://gpstamper.com/situ/.

Il suo compito è semplice, apporre nell'area in basso a sinistra di ogni foto alcune informazioni estratte dai metadati Exif:




Il programma non dispone di alcuna GUI, si utilizza tramite Drag&Drop o InviaA dal menù contestuale di una immagine o di una cartella contenente immagini:


Durante l'elaborazione dei fotogrammi, Situ crea una cartella di nome "Situ" all'interno della quale saranno presenti i nostri scatti modificati (Situ non modifica i files originali) e, utilizzando un algoritmo di stamping lossless, ci permette di ottenere immagini "marchiate" ma senza la minima perdita di qualità. L'immagine di sinistra è quella elaborata mentre quella di destra è quella originale, si nota chiaramente che entrambe presentano i stessi artefatti jpeg nelle stesse posizioni a dimostrazione della qualità dell'algoritmo:


A questo punto spiego come inserire i dati necessari allo stamping nell'area dei metadati Exif di ogni foto:
in un precedente articolo ho presentato il software GeoTag, utilissimo per inserire all'interno delle nostre foto le coordinate GPS relative al luogo dello scatto; questo stesso software può essere utilizzato per inserire, manualmente o programmaticamente, informazioni relative a località di scatto e/o descrizione delle immagini.

Qualora servisse posso approfondire l'argomento con esempi più dettagliati; attendo commenti.




mercoledì 10 agosto 2016

Georeferenziazione dei nostri scatti fotografici con software freeware (Win&Mac)

Premessa

Quante volte vi sarà capitato di guardare una fotografia e non ricordare esattamente il punto nel quale è stata scattata: la georeferenziazione è la risposta al problema!

Ho già affrontato il problema della georeferenziazione delle immagini fotografiche ma il target dell'articolo era limitato a programmatori con conoscenze di PHP; questa volta andrò ad affrontare il problema per tutti coloro che desiderano includere nei propri scatti fotografici indicazioni del luogo ove lo scatto è stato realizzato, senza necessità di conoscenze particolari.

I formati fotografici JPEG e TIFF così come i vari formati RAW, permettono di memorizzare, insieme ai dati relativi all'immagine vera e propria, una serie di informazioni alfanumeriche in formato TAG in un'area chiamata Dati Exif. Queste informazioni possono riguardare i dati relativi ai parametri dello scatto (apertura, tempo, iso, modello fotocamera, modello obiettivo, utilizzo o meno del flash, ecc.) alla data/ora, latitudine/longitudine/altitudine, orientamento della fotocamera e moltissimi altri e la valorizzazione dei TAG relativi a latitudine, longitudine ed altitudine è strettamente correlata alla presenza di un GPS collegato alla fotocamera (presente ormai in molte compatte, es. Nikon AW110/120/130 così come in tutti i smartphone).

E se la nostra fotocamera non dispone di un GPS come possiamo risolvere il problema? Fortunatamente un sistema esiste, ed è alla portata di chiunque disponga di un GPS o di uno Smartphone ed abbia un minimo di dimestichezza con il computer. Il GPS o lo Smartphone (con opportuno software installato) terrà traccia dei nostri movimenti in modo da sapere, istante per istante, dove siamo stati e interpolando data/ora di scatto con le posizioni del GPS potremo ottenere il dato necessario (con una approssimazione accettabilissima, specialmente se ci spostiamo a piedi).

ATTENZIONE!!!!
Affinché il sistema funzioni è ESSENZIALE che data ed ora del GPS/Smartphone e Fotocamera siano sincronizzati al meglio.


Di cosa abbiamo bisogno

  • Un GPS od un software di tracking da installare sullo Smartphone in grado di salvare le tracce in formato GPX; io uso da diversi anni l'app di ViewRanger che si è dimostrata, almeno su iPhone, moooooolto stabile e precisa, ma qualunque app in grado di svolgere lo stesso lavoro sarà comunque adatta allo scopo
  • Java VM Runtime
  • Il software ExifTool
  • Il software GeoTag

Dove reperire il software

L'eventuale software da installare sullo Smartphone lo potete trovare nei rispettivi Store (Android, iOS, Win, ecc.).
Il download di Java VM Runtime si può eseguire partendo da qui così che il sito possa indirizzarvi al giusto download sulla base del S.O. utilizzato, ExifTool lo si può scaricare da questa pagina (verificate bene quale modulo scaricare sulla base del vs. S.O.), mentre GeoTag si può scaricare dalla sezione download del sito relativo.


Installazione e configurazione

Se non lo abbiamo già presente nel nostro sistema, il primo modulo da installare è Java VM Runtime sia su Windows che su OS X.

A seguire per OS X installiamo prima il PKG di ExifTool quindi copiamo il file .JAR di GeoTag nella cartella /Applications mentre per Windows creiamo una cartella dove meglio crediamo nella quale andremo a copiare il file exiftool(-k).exe estratto dal fie .ZIP scaricato (avendo cura di rinominarlo exiftool.exe) ed il file .JAR di GeoTag.
Creiamo un collegamento sul desktop/scrivania al file .JAR e la fase di installazione è completa.

Per quanto riguarda la configurazione dovremo solo dire a GeoTag dove si trova il modulo ExifTool: in Windows lo avrete deciso voi (consiglio la stessa cartella di GeoTag) mentre su OS X il file si trova in /usr/local/bin.



Sono disponibili altre opzioni di configurazione, lascio a voi il piacere di esplorarle dal momento che quelle indicate sono sufficienti per lo scopo prefisso.

Utilizzo del programma

Abbiamo iniziato la nostra sessione fotografica, abbiamo sincronizzato data ed ora sui nostri device, abbiamo messo in REC il GPS prima di iniziare a scattare ed abbiamo concluso la sessione ricordandoci di terminare la registrazione delle posizioni. Arrivati a casa abbiamo poi scaricato sul nostro computer le immagini e la traccia GPS: ora abbiamo tutto quello che ci serve!

La prima cosa da fare è indicare al programma dove si trovano i nostri scatti fotografici ed abbiamo la possibilità di caricare tutti i files presenti in una cartella o singole immagini.




Dopo aver caricato le immagini dobbiamo caricare il file GPX registrato durante la sessione fotografica (a titolo puramente indicativo, sebbene non abbia mai provato, ho letto che installando altro software aggiuntivo GeoTag è in grado di interfacciarsi direttamente con alcuni GPS).



Ora non resta che attivare la funzione di ricerca ubicazioni facendo click con il tasto destro su una delle righe quindi selezionando la relativa opzione dal menu contestuale...



...per ottenere le coordinate (e le altitudini, se disponibili) di tutti i nostri scatti.

I dati sono stati estrapolati ma non sono ancora stati memorizzati quindi di nuovo click con il tasto destro selezionando dal menu contestuale la voce Registra le nuove ubicazioni/Tutte le immagini per ottenere la memorizzazione delle informazioni nei nostri scatti.


I files originali verranno resi disponibili con il nome [nomefileoriginale]_original a scopo di backup, qualora qualcosa dovesse andare male, ma sebbene abbia elaborato migliaia di foto fino ad ora, non ho mai avuto la necessità di recuperare un originale danneggiato da questo processo.


I scatti sono ora georeferenziati. Altre utili funzioni presenti in GeoTag sono:
  • la possibilità di recuperare indicazioni relative alla località dello scatto (comune/provincia/regione)
  • la ricerca dell'altitudine dello scatto qualora il dato non fosse presente nel file GPX
  • il posizionamento su una mappa GoogleMaps con tanto di pinpoint ed anteprima dell'immagine.





Per qualunque chiarimento, rettifica o suggerimento non esitate ad utilizzare la sezione commenti qui in basso.


martedì 10 novembre 2015

PHP: Georeferenziare un'immagine utilizzando un file GPX

Procedendo con lo sviluppo di polpiteam.it, il mio portale per la condivisione di percorsi escursionistici, mi sono imbattuto nel problema, apparentemente complesso, di georeferenziare delle immagini scattate con fotocamere prive di GPS durante una escursione per poterle posizionare su una mappa di Google Maps, lungo la linea del percorso ricavata da un GPS.
Complesso solo apparentemente perché una fortunata googolata mi ha portato a conoscenza di un software per Windows che, utilizzando il file GPX del percorso ed interpolandolo con la data/ora di scatto, permetteva di estrapolare latitudine e longitudine dello scatto. Il programma in se non mi è servito a nulla ma l'idea SI!

Ho implementato in PHP un piccolo esempio (scaricabile qui) con tanto di immagine e file GPX per provarlo subito.

Ecco il codice, si potrebbe ottimizzare utilizzando una ricerca dicotomica sull'array dei punti (l'array ha un indice numerico proprio in previsione di questa modifica) e sicuramente andranno aggiunti ulteriori controlli ma l'idea è funzionante ed utilizzabile:

<?php
//*******************************************************
//* Esempio di una semplice tecnica per georeferenziare *
//* immagini scattate con fotocamera priva di GPS       *
//* elaborando il file GPX ottenuto utilizzando uno dei *
//* tanti software di registrazione percorsi installato *
//* sullo SmartPhone.                                   *
//*                                                     *
//* NOTA:                                               *
//* E' necessario che la versione minima di PHP sia la  *
//* 4.2.0, che siano utilizzabili le librerie standard  *
//* "SimpleXML" ed "Exif"                               *
//*                                                     *
//*                                                     *
//*******************************************************
//* Paolo Bertinetti - info@paolobertinetti.it          *
//*******************************************************

//* Inizializzo il timezone (IMPORTANTE)
date_default_timezone_set("Europe/Rome");

//******************************************************
//* Questa funzione restituisce un array con tutti i   *
//* punti presenti nel file GPX                        *
//******************************************************
function loadGPX($gpx){
    //* Carico in una array tutti i trackpoint del file GPX
    $gpxArray = new SimpleXMLElement(file_get_contents($gpx));
    $tp = array();
    foreach ($gpxArray->trk->trkseg as $seg) {
        foreach ($seg->trkpt as $point) {
            $tp[count($tp)] = array("lat"=>(float)$point->attributes()->{'lat'}, 
                                    "lon"=>(float)$point->attributes()->{'lon'}, 
                                    "ele"=>(int)$point->ele, 
                                    "time"=>(string)$point->time);
        }
    }
    return $tp;
} 

//******************************************************
//* Questa funzione cerca nell'array il primo elemento *
//* del GPX con data/ora maggiore od uguale a quella   *
//* della fotografia                                   *
//******************************************************
function searchImage($img, $tp) {
//* Carico in un array le informazioni EXIF, 
//* se presenti, per ricavare data ed ora dello scatto
    $exif = exif_read_data($img, "ANY_TAG", true);
//* Verifico la presenza dei dati EXIF
    if (!($exif === false)) {
//* Verifico la presenza della sezione dedicata 
//* alla data/ora dello scatto
        if (isset($exif["EXIF"]["DateTimeOriginal"])) {
//* Compongo data ed ora nel formato "AAAA-MM-GG HH:MM:SS"
            $d = explode(" ", $exif["EXIF"]["DateTimeOriginal"]);
            $dateTime = str_replace(":", "-", $d[0])." ".$d[1];
//* Ora $dateTime contiene la data della foto, converto in formato UTC
            $dtUTC = gmdate('Y-m-d H:i:s', strtotime($dateTime));
//* Separo data ed ora...
            list($d, $t) = split(" ", $dtUTC);
//* ...e li ricompongo ottenendo il formato utile per la 
//* comparazione con il campo <time></time> del file GPX
            $dt = $d."T".$t."Z";
//* Verifico che la data da cercare sia inclusa nell'array di coordinate
            if ($dt >= $tp[0]["time"] and $dt <= $tp[count($tp)-1]["time"]) {
                foreach  ($tp as $point) {
//* Cerco il primo elemento del GPX con data posteriore a quella dell'immagine
                    if ($point["time"] >= $dt) {
//* Trovato!
                        $answer = array(0, $point["lat"] ,$point["lon"], $point["ele"]);
                        break;
                    }
                }
            }
            else {
// La data dell'immagine non è compresa bel file GPX
                $answer = array(1, null, null, null); 
            }
        }
        else {
// Campo DateTimeOriginal non trovato nella sezione EXIF
            $answer = array(2, null, null, null); 
        }
    }
    else {
// Dati EXIF non trovati nell'immagine
        $answer = array(3, null, null, null); 
    }
    return $answer;
}

/*** MAIN *****************************************************************/

//* Inizializzo le variabili con il nome del file GPX e quello del file JPG
$gpxName = "testgpx.gpx";
$imgName = "testimg.jpg";
//* Chiamo la routine di caricamento GPX
$trackPoints = loadGPX($gpxName);
//* Chiamo la routine di ricerca della data/ora di scatto nel file GPX
list($rc, $la, $lo, $al) = searchImage($imgName, $trackPoints);
//* Visualizzo i risultati
echo $rc===0  ? "Lat:$la Lon:$lo Alt:$al" : "Data scatto non trovata nel file GPX";
?>


giovedì 14 maggio 2015

PolpiTeam.it - il portale per la condivisione di percorsi/escursioni


PolpiTeam Logo
Molti mesi sono ormai passati dal mio ultimo post su questo Blog e la causa di questa assenza non è dovuta ad una attacco di pigrizia ma ad una lunga sessione di studio (jQuery, Bootstrap, Google Maps API v3) che mi ha aiutato a realizzare un portale che mi permette di conciliare la mia attività lavorativa con il mio passatempo preferito: il trekking, o meglio, l'hiking.

L'idea del portale è scaturita dopo che mi sono reso conto di quanto fosse difficile riuscire ad ottenere informazioni valide relative alle escursioni che si possono trovare sparse per la rete.

Alcuni siti propongono mappe del paleolitico inutilizzabili, spesso di dimensioni "francobollo",  altri propongono descrizioni estremamente imprecise e fuorvianti, altri ancora, pur fornendo informazioni valide, le rendono poco fruibili a causa di interfacce di ricerca pesanti e farraginose.

I punti sui quali ho focalizzato la mia attenzione sono:
  • creare qualcosa che sia liberamente accessibile in lettura, utilizzabile in scrittura previa registrazione e comunque gratuito
  • realizzare una interfaccia utente semplice, chiara e leggera
  • fornire informazioni valide relative al punto di parcheggio, utilizzabili con un normale software di navigazione (io uso Waze e Sygic), così da arrivare alla partenza senza perdere tempo
  • fornire una traccia in formato GPX utilizzabile su GPS (o Smartphone con adeguati software) da utilizzare come base per l'orientamento a piedi
  • fornire informazioni base sulla tipologia di percorso, ad es. il profilo altimetrico che permette di avere una prima idea del grado di difficoltà del percorso, la sua lunghezza, le altitudini minime e massime toccate, il guadagno di elevazione, ecc.
  • dare spazio per la descrizione "a parole"...
  • dare la possibilità agli utenti registrati di commentare i percorsi pubblicati
  • fornire strumenti che possano aiutare gli escursionisti, es. l'analizzatore GPX che permette di analizzare una traccia restituendo tutte le informazioni che potrebbero essere utili, disponibile anche per gli utenti non registrati (altri strumenti sono in cantiere...)
  • dare la possibilità di caricare fotografie che illustrino il percorso e sfruttare l'eventuale e presenza di informazioni di georeferenziazione per il loro posizionamento su mappa
  • far si che il sito fosse sia utilizzabile su computer desktop come su periferiche mobile (SmartPhone, Tablet), inclusa la gestione delle interazioni touch
  • realizzare una bacheca utilizzabile da tutti gli utenti per consigli, segnalazioni, ecc.
  • integrazione con Facebook, Twitter e Google+ per la condivisione (opzionale) dei percorsi pubblicati (questa parte verrà affrontata in seguito in quanto comporterà lo studio delle tecniche di autenticazione utilizzate nei tre Social Network)
Buona parte di questi punti è già stata affrontata, alcuni sono solo su carta, altri solo in testa e, sebbene ancora in testing, il portale permette attualmente di accedere al database percorsi e di registrarsi per caricarne di nuovi; il nome PolpiTeam è in onore del nostro cane, Polpetta (per gli amici Polpi), sempre pronta ad accompagnarci nelle nostre uscite e che impazzisce quando vede i zaini e le bacchette...


L'adozione di Bootstrap come framework, sebbene non lo avessi mai utilizzato, è stata una scelta a mio parere vincente:
  • semplicità nella creazione di siti 'responsive'
  • utilizzo su browser mobile senza particolari attenzioni
  • semplice da imparare a da utilizzare
  • un grande quantità di plug-in disponibili in rete
Per quanto riguarda jQuery, la scelta è stata obbligata dal fatto che è un prerequisito per Bootstrap ma  qualora non lo fosse stato, lo avrei adottato comunque dal momento che lo utilizzo ormai da diverso tempo.

Sono graditi commenti e suggerimenti...

martedì 27 gennaio 2015

CTB-Locker, l'ennesimo ransomware che crittografa i files personali, si scatena in Italia!!

Se ricevete una mai insolita, tipo quella che ho riportato in basso, che vi spinge ad aprire un allegato, diffidate!!!

Sta girando in italia una variante di CTB-Locker, un trojan della famiglia dei Ransomware, che 'prende in ostaggio' i vostri files personali crittografandoli e richiedendovi un riscatto di circa 1500€ per il ripristino dei stessi. Solo oggi già due miei clienti sono stati colpiti.

L'unica vera protezione, oltre ad una buona dose di diffidenza nei confronti delle mail in arrivo non provenienti da contatti noti, è un frequente backup dei dati con distacco dell'unità di backup dal computer al termine dell'operazione (c'è la possibilità che vengano crittografati anche i files presenti sul disco di backup se questo dovesse essere connesso al momento dell'attacco).

Al momento i soli computer Windows dovrebbero essere a rischio... Per ora...

AGGIORNAMENTO IMPORTANTE
Sembra che il trojan dopo aver crittografato i files utente, cancelli gli originali senza utilizzare tecniche che impediscono il recupero dei dati. Questo significa che con un qualsiasi programma di UNDELETE potrebbe essere possibile recuperare i documenti persi!!!!

L'informazione proviene da questa fonte: http://www.digitalic.it/wp/mercato-2/business/ctb-locker-la-soluzione-per-recuperare-file/88156

Farò delle verifiche e posterò i risultati, nel frattempo converrà tenere spenti i computer colpiti per evitare che la normale attività possa andare a sovrascrivere le aree del disco contenenti i documenti cancellati.

Consiglio l'esecuzione del programma di undelete solo dopo aver effettuato un boot da CD/DVD con una delle tante distribuzioni WinPE disponibili sulla rete, questo per evitare scritture sull'HD.


DELUSIONE
Ho eseguito un paio di test, uno su una virtual machine ed uno su una macchina reale, installata ad hoc, eseguendo il file .cab (contenente un file .scr) ed ottenendo il 'rapimento' dei files ma in nessuno dei due casi ho trovato traccia dei file cancellati ai quali si fa riferimento nell'articolo precedentemente indicato (ma ho trovato file giustamente cancellati, il sw di undelete ha operato correttamente) quindi, almeno nei casi presi in esame da me, questo metodo non ha funzionato.

Sarebbe cosa gradita ricevere dei feedback relativi alla vostra esperienza.