mercoledì 18 dicembre 2013

Un pieno di eBook da mettere sotto l'albero di Natale!!!


Amici "geek" a cui non sapete che regalare ?!?!? 

Un bel bigliettino e poi approfittare dell'interessante campagna della Packt da condividere con tutti: dal 19 dicembre al 3 gennaio tutti gli eBook ed i video di Packt sono acquistabili a 5$!

Ecco il testo della new:


Packt’s $5 eBook Bonanza is back!  
Following on from the success of last year’s festive offer, the publisher will be celebrating the holiday season with an even bigger $5 Bonanza.

From December 19th, customers will be able to get any eBook or Video from Packt for just $5. This sale covers every title in the 1700+ range and customers can grab as many as they like until January 3rd 2014 – more information is available at http://bit.ly/1jdCr2W





lunedì 4 novembre 2013

La terra è piatta!... o forse no?!?! piccolo viaggio verso il NoSQL


I database rappresentano uno dei punti fondamentali della composizione di qualunque progetto o soluzione informatica. La capacità di raccogliere ed organizzare le informazioni è alla base dell'informatica - in quanto scienza dell'informazione (e quindi del suo trattamento)

Negli ultimi 20 anni il Database (per definizione) è sempre stato idealizzato con il modello relazione descritto negli anni 70 da CODD (http://en.wikipedia.org/wiki/Relational_database).

Un modello che introdusse una serie di concetti rivoluzionari per l'epoca, ad iniziare dal legame tra il valore dell'attributo e la relazione tra insiemi (in contrapposizione dal modello che prevedeva puntatori e legami posizionali)

Oggi però, a 40 anni dalla sua formulazione, il modello di Codd evidenzia alcuni limiti. Limiti che sono sempre stati presenti e conosciuti, ma che fino ad oggi erano stati superati maggiore potenza di calcolo e di archiviazione.

Però a differenza di quanto avvenne con l'avvento del modello relazionale di Codd, oggi non ci si trova davanti a delle rielaborazioni tali da mettere in discussione tale modello - come avvenne con i sistemi reticolari e gerarchici - eppure è in corso una contrapposizione quasi "filosofica" tra i i difensori del modello relazione e "gli altri".

Nel corso degli anni gli "altri" sono stati classificati come NoSQL (http://it.wikipedia.org/wiki/NoSQL), ma in effetti sono differenti soluzioni che non rinnegano i principi del modello relazione, ma ne evidenziano i limiti e le forzature d'uso.

Però pare che in molti ambienti Aziendali  - e non Enterprise perchè li R&D funzionano veramente - mettere in discussione i RDBMS ed il paradigma SQL pare essere equivalente a dire che la terra non è piatta e gira intorno al sole: si rischia di essere additati come eretici!

Eppure la terra è tonda! 
E non vuol dire che le mappe fino ad oggi utilizzate non sono corrette. Semplicemente che per alcuni scenari che vanno oltre gli orizzonti previsti dal modello relazionale, è necessario utilizzare altri paradigmi....

Ho da poco finito di leggere "Instant MongoDB" ( http://bit.ly/17RQbZ7 ), ed è un testo interessante e sufficientemente leggero per chi volesse iniziare ad affacciarsi sul mondo del NoSQL e di MongoDB.

Il testo è scritto con un inglese semplice e scorre velocemente, ed introduce ad alcuni concetti fondamentali del mondo NoSQL:
  • SchemaLess: Schema for Read vs Schema for Write
  • Modalità di interrogazione
    • Cursori
    • Operatori
    • Attributi annidati
  • Modalità di aggiornamento
    • creazione
    • $set e $unset
    • aggiornamento del documento vs aggiornamento delle proprietà
    • aggiornamenti di massa
  • Indici
  • Disegno di una soluzione: Modello Relazionale e Modello Document Oriented
  • Aggregation Framework
  • Map / Reduce
Innanzitutto si chiarisce un concetto che ultimamente è sempre più presente: la modellazione di un database è inadeguata a rappresentare i vincoli dettati dalle "regole di business", e sempre più spesso si tende a tralasciare i vincoli relazionali per concentrarsi sulla consistenza delle regole di business.
Da questo comportamento derivano due assunzione fondamentali per comprendere il modello NoSQL;
  1. che è inutile fare il lavoro due volte: se l'applicativo dovrà controllare la consistenza di vincoli applicativi dovrà anche verificare la coerenza delle "relazioni"
  2. lo storage ha un costo ed un valore di gran lunga inferiore rispetto ai costi di calcolo ed alla velocità di elaborazione: una ridondanza minima di informazioni (come la duplicazione di una etichetta) è da interpretare come una ottimizzazione di risorse e non come un errore di implementazione
Particolarmente interessante il capitolo "Designing the Collection". Avendo chiari i concetti sulle modalità di interrogazione e di inserimento, questo capitolo, facendo il paragone tra la creazione di un modello relazione e un modello documentale, chiarisce molte delle più comuni domande sulla mancanza di join, di schemi e di aggregazioni.

Alcuni appunti che mi sento di fare:
  1. Si parla di Scalability all'inizio come uno dei punti forza di MongoDB, ma non se ne danno altri accenni, così come non si parla nè di nodi nè di cluster.
  2. Introdurre il concetto di nodi e cluster renderebbe ancora più esplicita la potenza nascosta dietro il "Map/Reduce": potrebbe apparire una sorta di iteratore o di ciclo, ma la reale capacità è quella di poter essere eseguita parallelamente su differenti nodi del sistema.
  3. il libro si chiude ricordando che difficilmente ci si troverà ad operare direttamente sul database, ma esistono driver specifici per i vari linguaggi di programmazione: un accenno dei principali progetti e driver sarebbe stato interessante (ma probabilmente sarebbe servito un altro libro)
Detto questo... Buona Lettura

sabato 26 ottobre 2013

ACG Vision4 - Installare IE 10 e continuare a vivere felici

Bene.. ho deciso di aggiornare IE9, e passare ad IE10 (non è stata proprio una decisione spontanea.... ma sorvoliamo).

Appena conclusa l'installazione una spiacevolissima sorpresa. Ok dover ogni volta impostare Modalità Browser IE9 .... ma Report Studio ed Analysis Studio NON NE VOLGIONO SAPERE.

Quindi mi trovato davanti un dilemma:

A) perdere almeno 2 giornate di lavoro per formattare il pc, reinstallarci tutto ed evitare accuratamente Internet Explorer 10


B) Comprare un nuovo notebook, possibilmente leggero, visto che dovevo portarlo appresso solo per poter avere Internet Explorer 9 e poter continuare a lavorare su ACG e Cognos 8

Visto che solitamente non permetto alla tecnologia di avere vittorie così assurde, ho cercato ed alla fine ne sono venuto a capo.

Si.. anche se non ufficialmente supportato, POTETE UTILIZZARE INTERNET EXPLORER 10 per lavorare sia con ACG che con COGNOS, Report Studio ed addirittura ANALYSIS STUDIO.

Condivido l'esito delle mie ricerche, nella speranza di rendere più piacevoli i fine settimana di chi si appresta ad aggiornare il proprio ambiente di lavoro.

Tramite REGEDIT modificate la chiave

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

aggiungendo un valore DWORD con nome iexplorer.exe e valore 9999 (decimale)


Da ora in poi il browser si aprirà automaticamente in "modalità browser:IE9"... comprese le popup di lancio di Cognos!


giovedì 12 settembre 2013

Il DBB per il test della componente "Server" - parte 2


Prosecuzione del post sul BDD per il test del server

Il BDD - behavior-driven development (continua)

Definito lo scenario con cucumber, come abbiamo fatto nel post precedente, è necessario definire i test di validazione delle features, che si concentreranno sul "consumo" dei webservice e non sulla tecnica di programmazione.

I punti focali di questi test sono che:
  1. possiamo farli prima di iniziare a (o a far) codificare
  2. sono indipendenti dal linguaggio con cui sarà realizzato il progetto.
Per la definizione degli step possiamo partire dagli snippet generati automaticamente da cucumber (sul sito vi sono vari tutoriarl che illustrano come codificare gli step).
In questo caso, volendo scrivere un test di controllo su come un client esterno possa consumare i servizi esposti, non verrà verificata la logica dei modelli, ma il funzionamento dei controller. 

Ad esempio nel nostro case avremo:


Given(/^a user "(.*?)" with password "(.*?)"$/) do |user, password|
 @username=user
 @password= password
end

When(/^he logs whit username and password$/) do
  header 'Accept', 'application/json' 
  header 'Content-Type', 'application/json'
  params={username: @username, password: @password}
  post 'users/sign_in', params.to_json
  page = JSON.parse(last_response.body)
  @token=page["auth_token"]
  @token.should_not == nil
end

Then(/^he should navigate page "(.*?)" and see (\d+) records$/) do |arg1, arg2|
  get arg1, {auth_token: @token}
  page = JSON.parse(last_response.body)
  page.size.should == arg2.to_i
end
 
Then(/^he should navigate page "(.*?)"$/) do |arg1|
  get arg1, {auth_token: @token}
end

Then(/^he should see olny his documents$/) do 
  get "my_documents", {auth_token: @token}
  last_response.status.should == 200 #HTTP status OK
  page = JSON.parse(last_response.body)
  page.map{|u| u["user"]["customer_name"]}.compact.uniq.should include(@user.customer_name)
end

Then(/^he shouldn't navigate page "(.*?)"$/) do |arg1|
   get arg1, {auth_token: @token}
   last_response.status.should == 403 #HTTP status forbidden
end

Questo test verificherà - indipendentemente dalla modalità di realizzazione - che il nostro server risponda a: 
- un servizio di login
- un servizio di risposta agli indirizzi customers, operators, settings, documents, che verifichi il tocken ed il profilo dell'untente , eventualmente restituendo uno stato di fobidden e che restituisca una array di record
- un servizio denominato "my_documents"

Naturalmente alcuni di questi test, come ad esempio l'autenticazione con username e password, presuppongono che il sistema sia stato popolato. Basta predisporre un passo di popolazione dell'ambiante di test, attraverso una delle 2 modalità che preferiamo (ed in funzione di cosa dobbiamo testare):

A) utilizzo degli script di avvio di cucumber, in particolare dello svript env.rb, in cui, in questo caso ho aggiunto il blocco
    Before do
      User.create(:username=>"operator1", :password=>"test1234", :role=>"operator", :email=>"operator1@mail.local")#this code is run before each scenario
      User.create(:username=>"operator2", :password=>"test1234", :role=>"operator", :email=>"operator2@mail.local")#this code is run before each scenario
      User.create(:username=>"operator3", :password=>"test1234", :role=>"operator", :email=>"operator3@mail.local")#this code is run before each scenario
      cust1=User.create(:username=>"customer1", :password=>"test1234", :role=>"customer", :customer_name=>"azienda1", :email=>"customer1@mail.local")#this code is run before each scenario
      cust2=User.create(:username=>"customer2", :password=>"test1234", :role=>"customer", :customer_name=>"azienda2", :email=>"customer2@mail.local")#this code is run before each scenario
      cust1.documents.create(document_type: "F24_init")
      cust1.documents.create(document_type: "Bilancio_init")
      cust2.documents.create(document_type: "F24_init")
      cust2.documents.create(document_type: "Bilancio_init")
    end

B) scrittura di scenari di popolazione, che utilizzeremo per i test sui servizi.


Abbiamo quindi simulato - evitando di farlo manualmente ogni volta -
- l'apertura della finestra di login
- l'inserimento di user e password "amministrative"
- la navigazione (manuale, mancando al momento i link) di 4 pagine e il conteggio de record
- il logout
- l'inserimento di user e password "utente"
- la navigazione (manuale, mancando al momento i link) di 5 pagine e il conteggio de record

Considerando che al progredire di un progetto i dati da immettere per verificare quanto abbiamo codificato aumentano esponenzialmente... siamo ancora sicuri che scrivere test in questo modo sia una perdita di tempo?