Archivi categoria: Nerdaccia

tunnel-data

Hadoop e “Big Data”

Si dice che il 2014 sarà l’anno del Big Data… qualunque cosa questo significhi…

HadoopBig Data è una parola che va molto di moda, anche se ognuno di noi ha un’idea diversa sul suo significato. Analizzare “big data” significa estrarre conoscenza da grandi moli di dati, come possono essere i dati generati dal crawling di una gran quantità di siti internet, dai post nei social network di un gruppo cospicuo di persone, dalle variazioni di valore delle azioni in borsa nel corso degli anni per un numero consistente di titoli.

Il problema nasce proprio da qui… quanto grande ? che significa cospicuo ? 1 terabyte può essere considerato “big data” ? e 10 terabyte ?

Continua a leggere

big_data

Raccolta differenziata di foto digitali

apple ios
Ormai ognuno porta con sé una potente fotocamera integrata nel proprio telefono, con la quale si prendono appunti, si condividono situazioni divertenti, si lavora. Inoltre, applicazioni come Whatsapp rendono ancora più frequente l’uso della fotocamera e, soprattutto, rendono ancora più affollata la memoria del telefono con le innumerevoli foto (spesso ripetute) che ci inviano i nostri amici.

L’operazione di backup, che già normalmente richiede delle noiose attività di sincronizzazione, diventa ancora più odiosa quando ci rendiamo conto che:

  1. non possiamo sincronizzare su un computer qualsiasi, ma abbiamo bisogno di quello sul quale abbiamo predisposto/autorizzato il software;
  2. abbiamo lasciato a casa il disco esterno dove archiviamo le nostre foto, quindi dobbiamo rimandare a quando avremo tutto l’occorrente;
  3. nella migliore delle ipotesi, ci rendiamo conto che almeno il 70% della memoria è costituita da foto di cui non ce ne può fregare di meno, però come facciamo a isolarle da quelle realmente scattate dal nostro telefono?

Ci sono tanti software che effettuano selezioni e organizzazioni del software, ma un prodotto freeware e uno open source ci aiutano a fare ordine in maniera gratuita: ifunbox per iPhone e l’estensione Perl “exiftool“, che ci permette di leggere i metadati contenuti nelle nostre foto.

Il primo strumento ci consente di salvare il “rullino fotografico” su una qualsiasi memoria senza particolari autorizzazioni o sincronizzazioni. Il secondo strumento, invece, ci permette di discriminare le foto in base ai dati EXIF contenuti al loro interno, basandoci sul concetto che le foto pervenute tramite App non contengono il marchio Apple (ragionamento analogo per la controparte Android, seppur non verificato).

A questo punto, basta eseguire un semplice script per raccogliere i dati omogenei e archiviarli secondo la loro reale natura.

#!/bin/bash

# Find and collect in the Apple dir what Apple did (or who you want)
exiftool '-Directory<Make' -if '$Make eq "Apple"' -r *.JPG
exiftool '-Directory<Make-ita' -if '$Make-ita eq "Apple"' -r *.MOV

# PNGs are being moved if any
if [ $(ls -1 *.PNG 2>/dev/null | wc -l) != 0 ]; then
mkdir -p Screenshot
mv *.PNG ./Screenshot
fi

# All the other stuff remains where it was
echo "Job done."

In tal modo avremo una cartella Apple (uguale al valore della proprietà Exif.Image.Make, ossia del costruttore dell’apparecchiatura) dove confluiranno foto e video creati dalla fotocamera, una cartella Screenshot con tutti i nostri file PNG, e tutto il resto transitato via App e via rete, rimarrà nella cartella da cui è stato lanciato lo script.

Infine, per ottimizzare ulteriormente la cartella contenente le foto ricevute e individuare, quindi, tutti i file immagine duplicati, anche di dimensioni diverse, suggerisco l’impiego di software open source (es: DupeGuru), facilmente reperibili in rete.

 

oracle-ecommerce-integration

Oracle e LOB

di Andrea Tassotti

Non me ne vorranno i colleghi di questo blog che per lavoro o diletto praticano il mondo della programmazione Java, ma nello storico contenzioso tra sistemista e programmatore (contenzioso su risorse e sicurezza) si osserva una (dico) “perversa” tendenza tutta (ahimé) dei programmatori Java nel prediligere l’uso di campi LOB di tipo BLOB o CLOB (raramente NCLOB) per risolvere questioni di memorizzazione di informazioni non strettamente primitive, con particolare propensione alla serializzazione di oggetti o immagazzinamento di file di ogni sorta (e orrore, anche xml, trascurando il tipo nativo Oracle) [a difesa dei colleghi del blog…molte volte si ereditano scelte progettuali che sarebbero devastanti da cambiare] in questo tipo di campi, con buona pace o la connivenza [close your eyes] di tanti DBA.
Continua a leggere

Java

oAuthentication – Java

OAuth2oAuthentication è un plugin Java EE 6 per integrare in un’applicazione web i meccanismi di autenticazione oAuth 2 di Facebook o Google.

ll plugin richiede una configurazione molto semplice, da effettuare nel file web.xml dell’applicazione. Il modulo JAR include la maggior parte dei parametri di configurazione all’interno di un web-fragment.

Sono richiesti un container Java EE 6 o Java EE 6 Web Profile.

E’ possibile ottenere la libreria tramite Maven nel seguente modo:

</p>
<p style="text-align: justify;">it.nerdammer
oauthentication
1.0.5</p>
<p style="text-align: justify;">

Il file web.xml va configurato nel seguente modo:

</p>
<p style="text-align: justify;">oAuthenticationFilter
it.nerdammer.oauthentication.web.AuthenticationFilter</p>
<p style="text-align: justify;">DEFAULT_PROVIDER google
LOGIN_ERROR_PAGE /myErrorPage
FACEBOOK_APP_ID --get an app id from facebook--
FACEBOOK_APP_SECRET --the app secret from facebook--
GOOGLE_CLIENT_ID --get a client id from google app--
GOOGLE_CLIENT_SECRET --the client secret from google app--
oAuthenticationFilter
/web/private/*</p>
<p style="text-align: justify;">

Per informazioni sull’utilizzo si rimanda a Google Code.

Sea Surf – Protezione CSRF

LockCSRF o XSRF è uno dei più noti attacchi informatici che possono essere diretti a qualsiasi sito web, indipendentemente dalla tecnologia di backend. Una grande percentuale di siti, infatti, non sono protetti nei confronti di questo tipo di attacco o possiedono delle pagine vulnerabili facilmente individuabili da un attaccante.

La vittima di un attacco CSRF è quasi sempre l’utente. L’attacco sfrutta l’assunto che le operazioni fatte da un browser web, all’interno di una sessione autenticata, corrispondono sempre a richieste fatte esplicitamente dall’utente. Si tratta di un assunto molto rischioso perché facilmente sfruttabile da un attaccante che, indirizzando l’utente su un sito creato ad hoc, riesce a comandarne il browser con l’utilizzo di javascript.

Continua a leggere

OAuth made easy

OAuth2OAuth è un protocollo per l’autorizzazione d’accesso alle risorse utilizzato principalmente dai social network. Le specifiche OAuth 2.0, tuttavia, descrivono un framework generale per lo scambio di autorizzato di informazioni, non un insieme di regole precise perché questo possa avvenire. Di conseguenza, ogni service provider OAuth, anche rispettando le specifiche, richiede un’implementazione diversa del client.

Il protocollo OAuth è diverso da OpenID, per scopi e principio di funzionamento. Nonostante questo, OAuth può essere utilizzato come strumento di autenticazione e rende OpenID relativamente inutile. Il supporto a OpenID da parte dei service provider, infatti, è decisamente limitato.

Continua a leggere

Oracle RMAN – Creazione e configurazione di un recovery database

di Andrea Tassotti

Introduzione

Oracle DB

Un RMAN Recovery Catalog è uno schema di database che mantiene dei metadati dettaglianti le operazioni per il backup eseguite da RMAN su un database obiettivo. I metadati includono le seguenti informazioni riguardo il database gestito: struttura, configurazione RMAN, i backup dei datafile e degli archive log (backup sets, pieces e copie), i redo logs archiviati e le loro copie. Continua a leggere

tux-banner

Linux & SAN

Premesso che lasceremo al lettore l’onere di trovare il software citato nel post nel sistema di pacchetti della distribuzione su cui opererà, diamo alcuni suggerimenti utili per la configurazione di connessioni a SAN per sistemi Linux.

Esistono molti modi per determinare le informazioni su indirizzi dell’HBA e mappature dei dischi, e in giro si trovano molti tutorial al riguardo.

Il punto finale può essere sempre considerato il seguente comando:

sg_map -x

che ci fornisce i nomi dei dispositivi a blocchi mappati su una qualche LUN.

Partiamo da qui per determinare altra informazione, in genere molto utile in sistemi complessi per orientarsi tra i vari dischi e storage: il nome dello storage e le WWN delle LUN.Ipotizziamo che la nuova LUN sia stata mappata sul dispositivo /dev/sda, quindi interroghiamo questo per determinare le informazioni richieste:

  • Informazioni sullo storage (produttorel,modello,S/N)
/lib/udev/scsi_id --page=0x80 --whitelisted \
--device=<b>/dev/sda</b> | awk '{ print substr($0,2)}'
  • Informazioni sulla LUN (WWN)
/lib/udev/scsi_id --page=0x83 --whitelisted \
--device=<b>/dev/sda</b> | awk '{ print substr($0,2)}'

Consigliamo di trascrivere queste due linee di codice in due distinti file, denominati scsi_storage_info e scsi_lun, dotarli di diritti di esecuzione e porli nel percorso /sbin (tutto quanto detto in questo post presuppone che siate amministratori delle macchine su cui operate). Avrete così altri comandi utili nel processo di configurazione di una connessione a SAN in un host Linux.

Guida alle date in Oracle

oracle db

Innanzitutto chiariamo un fatto troppo spesso equivocato: Oracle RDBMS, come qualsivoglia software, gestisce le informazioni sul tempo in forma numerica (rappresentazione interna), tipicamente considerando un spiazzamento da un punto temporale prefissato e stabilendo una unita di misura, avvalendosi oppure no del segno e dunque fissando il riferimento dello 0. Ma questi sono “internals” che riguardano gli sviluppatori in casa Redwood.

La struttura di memoria per conservare l’informazione varia dai 7 agli 11 bytes secondo il tipo di dato (fisso a 7 per le date, variabile per intervalli e timestamp), pertanto siamo tra 256 e 288 di possibili valori per la unita di misura minima considerata (secondi nel caso di date, frazioni di millesimi di secondo negli altri casi), ossia valori ragguardevoli.

Ma veniamo alla rappresentazione esterna di queste informazioni.

Per rappresentazione esterna intendiamo le forme in cui l’utente esprime questi valori e come il motore li presenti allo stesso utente (il meccanismo ha una certa reciprocità)

Dobbiamo considerare che l’interfaccia utente è mediata dal linguaggio SQL: questo non è un fatto marginale.
Come ogni linguaggio artificiale dobbiamo considerare simboli terminali e le varie forme di composizione, fino all’apporto fornito da “funzioni”.

Il linguaggio SQL implementato in Oracle concepisce i valori temporali come “letterali”, ossia come simboli terminali: pertanto riconosce una data come cosa differente da un char. Allo stesso modo, benché non ne introduca letterali, saprà riconoscere la diversità semantica da un valore numerico (e quindi gli operatori applicabili) per tutto ciò che è timestamp o intervalli.

Cosa vogliamo dire?
Semplicemente che esiste una sintassi, un formato con cui esprimere o in cui vengono espressi valori temporali. In particolare un formato per esprimere date.
Questo risente ovviamente della localizzazione geografica dell’interfaccia in quanto la data (più che il tempo) si esprime in modi diversi nelle varie culture.

Entrano in gioco in questo caso due variabili server (che possono essere reimpostate in sessione): NLS_DATE_FORMAT o NLS_TERRITORY
La prima consente di impostare la rappresentazione delle date esplicitamente, la seconda come conseguenza della localizzazione di tutte le informazioni che lo prevedano (date, valute, ecc)

Nell’ipotesi di un motore configurato per la lingua italiana, la stringa formata da due cifre per giorno, tre lettere per la forma abbreviata del mese e due cifre per l’anno (senza il secolo) e divise da un separatore (‘-‘ per sqlplus, ‘/’ per sqldeveloper grazie appunto a modifiche nella sessione di collegamento) rappresenta una data:

21-SET-12

Questa è la forma che otteniamo leggendo colonne di tipo data, ma se quotata, questa è anche la forma naturalecon cui impostare il valore in una colonna di tipo data:

INSERT INTO DATARIO VALUES ('21-SET-12')

Se impostiamo NLS_DATE_FORMAT in un altro modo, allora tutto potrà essere fatto con forme (ad esempio) anglosassoni per le date (nei nomi, e nella disposizione delle componenti).

Ma esistono alcuni problemi: un problema (se così li vogliamo considerare) è mostrare la completezza dell’informazione: le colonne di tipo data mantengono informazione sul secolo, sull’orario fino ai secondi, ma nessuna di queste viene mostrata nel formato standard impostato da NLS_DATE_FORMAT.Un altro problema nasce considerando il fatto che non sempre le informazioni pervengono al motore SQL nel formato utile, e tantomeno è utile estrarre dati in questo formato in quei contesti in cui occorre una maggiore attenzione alla forma (in documenti, report, interfacce utente finale, ecc).

Ed è in questi casi che entrano in gioco le funzioni SQL per la conversione (tra tipi di dati): TO_CHAR e TO_DATE.

Facciamo due esempi:

  • nel primo esempio cerchiamo di estrarre l’informazione sull’orario da una colonna di tipo data
  • nel secondo consideriamo l’ipotesi di trasformare in formato utente (o esterno) in data e una data in formato utente, ed è naturale che il tipo per lo scambio con il mondo esterno sia il più malleabile VARCHAR.

Per il primo problema usiamo la funzione TO_CHAR.
Questa converte un tipo dati (tra quelli definiti nel suo campo di azione) in una rappresentazione a caratteri attraverso una maschera di formato definita da utente e passata come argomento assieme al dato da convertire.
Abbiamo:

Formato interno -> TO_CHAR -> Formato utente specificato

Per questo esempio sfruttiamo un’altra funzione, SYSDATE, che restituisce un tipo data e viene quindi visualizzzato attraverso quanto stabilito da NLS_DATE_FORMAT. Ma attraverso la funzione TO_CHAR provvediamo a mostrare anche le componenti assenti nell’altra visualizzazione:

SELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "NOW" FROM DUAL;

Per il secondo problema utilizzeremo entrambe le funzioni TO_CHAR e TO_DATE e creeremo una tabella di esempio:

CREATE TABLE anag (
cod NUMBER(4),
nome VARCHAR2(20),
data_ass DATE);

In particolare la funzione TO_DATE converte una stringa che esprime una data in un tipo data. Al fine di far comprendere all’interprete SQL la data specificata occorre indicare anche il suo formato.

Formato utente -> TO_DATE -> Formato interno

Inseriamo dei dati in diversi formati utente:

INSERT INTO anag VALUES(1, 'Rossi', TO_DATE('10/01/1999', 'dd/mm/yyyy'));
INSERT INTO anag VALUES(2, 'Verdi', TO_DATE('12/02/06', 'dd/mm/yy'));
INSERT INTO anag VALUES(3, 'Gialli', TO_DATE('20100815', 'yyyymmdd'));
INSERT INTO anag VALUES(4, 'Blu', TO_DATE('101-2005', 'ddd-yyyy'));
SELECT nome, TO_CHAR(data_ass, 'dd.mm.yy') FROM anag;
SELECT nome, TO_CHAR(data_ass, 'dd-month-yy') FROM anag;
SELECT nome, TO_CHAR(data_ass, 'dd day month-yyyy') FROM anag;

Possiamo infine concludere con due osservazioni:

 

  • non è necessario utilizzare TO_DATE per impostate una data; è sufficiente essere conformi al formato dettato da NLS_DATE_FORMAT
  • se proprio occorre una conversione, e la si considera necessaria per tutte le query (in senso assoluto), è possibile reimpostare NLS_DATE_FORMAT secondo esigenze, almento a livello di sessione

 

Si imposta il formato data (nella sessione) con:

ALTER SESSION SET nls_date_format='dd.mm.yy';

Per tutti gli altri casi: usate TO_CHAR e TO_DATE a volontà.

dacloud

Cloud & Backup… Quante Insidie!! – AAI

Grazie Mille ad AAI
Disclaimer:

questa mail è scritta da nerd per esigenze nerd e può non essere confacente al tuo corrente stile di vita. La presente si intende, inoltre, priva di alcuna finalità commerciale (o quasi…)

Introduzione

Recenti disgrazie mi hanno indotto a riprendere una riflessione che avevo già in mente da qualche tempo: la soluzione definitiva ai problemi di backup dei dati.

Personalmente ho sempre effettuato un backup incrementale dei “miei averi” con la TIMEMACHINE ma, ahimè come per altri prodotti di quel-marchio-che-non-posso-pronunciare-per-policy-aziendale, ho scoperto ex-post diverse controindicazioni. Innanzitutto, un backup su disco esterno non risolve il problema della fragilità dei supporti magnetici (occorrerebbe usare tavolini giapponesi per ridurre tali rischi); inoltre, in caso di dipartita del buon vecchio pc, il suddetto software PRETENDE un nuovo Mac per ripristinare il tutto come prima (per i più masochisti, provate ad aprire una partizione Timemachine da linux: greatly insane!™ ).

Come insegnano gli amici paranoici, dunque, occorrerebbe affiancare al backup locale una soluzione remota (possibilmente in un altro continente) per proteggersi dai disastri naturali e dal prossimo album della Tatangelo. In altre parole: MUVING IOR DETA TO DA CLAUD! Continua a leggere