SlideShare ist ein Scribd-Unternehmen logo
1 von 22
jHuery
Facciamo luce sul DOM – usi e abusi di tecnologie web
Chi sono
(Quello sulla destra)
Committer – Dojo Toolkit
Responsabile area AmI, Ricercatore – ISIN, DTI, SUPSI
Cofondatore – Tesseract SAGL
nicola.rizzo@supsi.ch
nicola.rizzo@gmail.com
2
jHuery - nota
• Avrei voluto sviluppare jQwerty, una libreria per la gestione dell’input da tastiera,
ma…
3
4
Ingredienti – 1 / 2
• Lampadine Philips Hue + bridge
• Un browser moderno (per quanto riguarda l’implementazione attuale)
• XMLHttpRequest
• CORS (due cucchiai)
• DocumentFragment
• MutationObserver
• localStorage
• jQuery*(dojo, altra libreria o solo querySelector e querySelectorAll)
* non strettamente indispensabile; ho scelto jQuery per il gioco di parole e per la notorietà, ma in ogni
caso non è una dipendenza
5
Ingredienti (demo) – 2 / 2
• tag video
• canvas
• un filmato :-)
6
Ingredienti (altro) – 3 / 2
• gestione moduli e dipendenze
• lib di pub-sub
• css / sass / less…
• un framework di test
7
DOM (Document Object Model)
doc
nodo
nodo nodo
nodo
nodo
8
Selezione elementi DOM
• Utilizzando dei selettori CSS è immediato ottenere gli elementi corrispondenti:
per esempio
jQuery(‘.light’);
restituisce tutti gli elementi con classe “light”.
jQuery però ha un secondo parametro facoltativo, a che cosa serve?
http://api.jquery.com/jQuery/
9
Contesto
• Il secondo parametro è un “contesto”, un nodo o un oggetto dal quale far partire il
selettore
Dato il frammento:
<div class=“light”></div>
<div id=“context”>
<div class=“light”></div>
<div class=“light”></div>
</div>
…
var context = document.getElementById(‘context’);
jQuery(‘.light’, context);
selezionerà solo i due div contenuti in context
10
HOME (Home Object ModEl)
home
kitchen
light light
room
room
home
kitchen
light light
room
room
11
L’idea
• Se fosse possibile rappresentare la propria casa con come un nodo DOM, potremmo
scrivere:
…
var jHuery = (function(){
var homNode = hom.getRootNode();
return function(selector){
return jQuery(selector, homNode);
};
})();
...
partial application
12
Risultato desiderato
// accende tutte le luci della cucina
jHuery(‘kitchen light’).attr(‘on’, ‘true’);
è possibile?
Notare, non ho usato classi ma nomi di tag
13
Philips Hue
• Sono lampadine led RGB colorate wireless
comandabili
• Il bridge è da collegare al router di casa con un
cavo di rete: invia e riceve informazioni verso e
dalle lampadine
• Sul bridge gira un web server** che espone
delle uri REST per l’esecuzione dei comandi da
un qualsiasi client, anche da un browser
(documentazione su
http://developers.meethue.com )
** ma avevi detto “niente server”!
intendevo che non l’avremmo sviluppato noi :P
14
Spazio CIE
Le lampadine Hue non usano RGB per definire il
proprio colore; è possibile utilizzare le due
coordinate x, y per arrivare ai colori del diagramma
a destra.
E’ possibile convertire in modo più o meno
(in)esatto una terna RGB in CIE (x, y).
15
Hue + saturation
Un altro modo possibile per assegnare un colore è dato dalla coppia
• hue: 16 bit: 0 e 65535 sono rosso, 25500 è verde, 46920 è blu
• saturation: 8 bit: 254 è colorato, 0 è meno saturo, toni di grigio
Nota: è possibile assegnare un colore in css usando la forma hsl(Hue, Saturation, Lightness), o hsla, aggiungendo
il canale alpha. In questa forma Hue varia da 0 a 360, poiché è un angolo; s ed l sono percentuali
16
Ingredienti – AJAX e CORS (Cross-origin
Resource Sharing
• Come faccio a inviare i miei comandi?
• Via AJAX! Non ci sono problemi di sicurezza X-origin, visto che
il bridge espone l’header
Access-Control-Allow-Origin: *
per accendere la lampadina numero 1 occorre mandare all’indirizzo:
http://indirizzoBridge/apikey/lights/1/state
questo pacchetto in PUT:
{
“on”: true
}
17
Ingredienti – CORS, secondo cucchiaio
• Come trovare l’indirizzo del bridge nella rete locale?
• via U-PnP (ma non è il nostro caso)
• Con una GET a questo indirizzo:
https://www.meethue.com/api/nupnp
Ovviamente il server risponde con le intestazioni CORS e con un pacchetto del tipo
[{"id":"iddelbridge","internalipaddress":"192.168.0.5"}]
A questo punto occorre registrare la propria applicazione con una chiamata POST nei
30 secondi successivi alla pressione del pulsante sul bridge da parte dell’utente, per
motivi di sicurezza
18
DocumentFragment
• Un DocumentFragment è un nodo document non collegato a ciò che viene
renderizzato nel browser. E’ il candidato ideale per svolgere operazioni “dietro le
quinte” utilizzando dei nodi che non devono essere mostrati.
Una volta che sia stata letta la lista delle lampadine disponibili, sarà possibile quindi
creare dei div (o un elemento a piacere) con almeno la classe “light”, oppure
addirittura un element <light>, visto che DocumentFragment può contenere XML*** e
che i selettori funzionano lo stesso, quindi:
var light = document.createElement('light');
è perfettamente lecito.
Prima di appendere al DF, si possono aggiungere vari attributi – tra cui l’id - al nodo, in
modo da facilitare i selettori
19
*** XML is crap. Really. There are no excuses. XML is nasty to parse for humans, and it's a disaster to parse even for
computers. There's just no reason for that horrible crap to exist - Torvalds, Linus (2014-03-06)
MutationObserver
Per modificare lo stato di una o più lampadine contemporaneamente è sufficiente
modificare gli attributi corrispondenti sull’insieme di nodi selezionato.
Come fare a intercettare i cambiamenti di attributo?
L’API MutationObserver consente di monitorare i cambiamenti di struttura di un nodo
target, attributi compresi.
new MutationObserver(function(mutations){…});
La funzione di callback viene invocata come un gestore d’eventi ogni volta che sul nodo
target avviene una delle mutazioni monitorate.
Il medesimo observer può essere applicato a più nodi; l’array mutations può essere
iterato ottenendo per ogni elemento l’elemento su cui è stato applicato
20
localStorage
Non è strettamente necessario per il funzionamento, ma è un buon posto in cui salvare
i dati relativi al bridge per non doverli richiedere ogni volta (in particolare la chiave
relativa all’applicazione)
Ovviamente occorre fidarsi del sito ospitante
21
Resta da fare
• Scrivere un polyfill per MutationObserver (usando MutationEvent)
• Estendere il concetto a oggetti diversi dalle lampadine
• Estensione CSSOM?
• Bookmarklet per youtube o altri siti?
• Generare gli eventi per i cambiamenti di stato delle lampade
• Permettere la modifica di più attributi contemporaneamente
• Permettere la modifica a più lampade contemporaneamente (barando)
• Usare un browser headless (phantomjs) per il caso generale
• Test! Test! Test!
22

Weitere ähnliche Inhalte

Was ist angesagt?

Web base-03-js-numeri stringearray
Web base-03-js-numeri stringearrayWeb base-03-js-numeri stringearray
Web base-03-js-numeri stringearrayStudiabo
 
High Performance Web Apps con PHP e Symfony 2
High Performance Web Apps con PHP  e Symfony 2High Performance Web Apps con PHP  e Symfony 2
High Performance Web Apps con PHP e Symfony 2Giorgio Cefaro
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPGiorgio Cefaro
 
Linux Kernel, driver e compilazione
Linux Kernel, driver e compilazioneLinux Kernel, driver e compilazione
Linux Kernel, driver e compilazioneFulvio Corno
 
Linux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compattaLinux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compattaAlessandro Selli
 
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazioneBookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazioneInformamuse srl
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Alessandro Loffredo
 
PostgreSQL: Prima configurazione
PostgreSQL: Prima configurazionePostgreSQL: Prima configurazione
PostgreSQL: Prima configurazioneEnrico Pirozzi
 
8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema8 Linux Comandi Di Sistema
8 Linux Comandi Di SistemaMauro Ferrigno
 
PostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryPostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryEnrico Pirozzi
 
A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...
A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...
A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...Massimiliano Leone
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumateMarco Buttolo
 
Post gresql su_raspberry
Post gresql su_raspberryPost gresql su_raspberry
Post gresql su_raspberryMarco Buttolo
 
Clink
ClinkClink
Clinkh4f
 
Architettura dei Calcolatori Subroutines80x86
Architettura dei Calcolatori Subroutines80x86Architettura dei Calcolatori Subroutines80x86
Architettura dei Calcolatori Subroutines80x86Majong DevJfu
 
Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazioneDaniele Costarella
 
Angelo Impedovo, Linux Day 2016, Programmazione Parallela in openCL
Angelo Impedovo, Linux Day 2016, Programmazione Parallela in openCLAngelo Impedovo, Linux Day 2016, Programmazione Parallela in openCL
Angelo Impedovo, Linux Day 2016, Programmazione Parallela in openCLAngelo Impedovo
 
Network configuration - IPTables firewall
 Network configuration - IPTables firewall Network configuration - IPTables firewall
Network configuration - IPTables firewallFulvio Corno
 

Was ist angesagt? (20)

Web base-03-js-numeri stringearray
Web base-03-js-numeri stringearrayWeb base-03-js-numeri stringearray
Web base-03-js-numeri stringearray
 
Ap Camp 2011
Ap Camp 2011Ap Camp 2011
Ap Camp 2011
 
High Performance Web Apps con PHP e Symfony 2
High Performance Web Apps con PHP  e Symfony 2High Performance Web Apps con PHP  e Symfony 2
High Performance Web Apps con PHP e Symfony 2
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
 
Linux Kernel, driver e compilazione
Linux Kernel, driver e compilazioneLinux Kernel, driver e compilazione
Linux Kernel, driver e compilazione
 
Linux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compattaLinux Capabilities - ita - v2.1.5 - compatta
Linux Capabilities - ita - v2.1.5 - compatta
 
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazioneBookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015
 
PostgreSQL: Prima configurazione
PostgreSQL: Prima configurazionePostgreSQL: Prima configurazione
PostgreSQL: Prima configurazione
 
8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema
 
Socket python
Socket pythonSocket python
Socket python
 
PostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryPostgreSQL: Point in time recovery
PostgreSQL: Point in time recovery
 
A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...
A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...
A short introduction about UML UserModeLinux and UML-Handler tool --- speech ...
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumate
 
Post gresql su_raspberry
Post gresql su_raspberryPost gresql su_raspberry
Post gresql su_raspberry
 
Clink
ClinkClink
Clink
 
Architettura dei Calcolatori Subroutines80x86
Architettura dei Calcolatori Subroutines80x86Architettura dei Calcolatori Subroutines80x86
Architettura dei Calcolatori Subroutines80x86
 
Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazione
 
Angelo Impedovo, Linux Day 2016, Programmazione Parallela in openCL
Angelo Impedovo, Linux Day 2016, Programmazione Parallela in openCLAngelo Impedovo, Linux Day 2016, Programmazione Parallela in openCL
Angelo Impedovo, Linux Day 2016, Programmazione Parallela in openCL
 
Network configuration - IPTables firewall
 Network configuration - IPTables firewall Network configuration - IPTables firewall
Network configuration - IPTables firewall
 

Andere mochten auch

Care and Feeding of Social Media Team on Your Campus
Care and Feeding of Social Media Team on Your CampusCare and Feeding of Social Media Team on Your Campus
Care and Feeding of Social Media Team on Your CampusJ.D. Ross
 
Sri Prabha Art and Abstract Paintings
Sri Prabha  Art and Abstract PaintingsSri Prabha  Art and Abstract Paintings
Sri Prabha Art and Abstract PaintingsSri Prabha Art
 
виноградов моу школа 25
виноградов моу школа 25виноградов моу школа 25
виноградов моу школа 25DIANA1908
 
солдатенкова моу школа 25
солдатенкова моу школа 25солдатенкова моу школа 25
солдатенкова моу школа 25DIANA1908
 
Chris Goehner
Chris GoehnerChris Goehner
Chris Goehnerbwright84
 
Права человека через призму новейших технологий моу школа 25
Права человека через призму новейших технологий моу школа 25Права человека через призму новейших технологий моу школа 25
Права человека через призму новейших технологий моу школа 25DIANA1908
 
Plannig and models’ building
Plannig and models’ buildingPlannig and models’ building
Plannig and models’ buildingGisélia Piteira
 
STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES
STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES
STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES Gisélia Piteira
 
Vs juventus
Vs juventusVs juventus
Vs juventuscdvligai
 
11 класс урок 1слайдов 44
11 класс урок 1слайдов 4411 класс урок 1слайдов 44
11 класс урок 1слайдов 44DIANA1908
 
публичный отчет за 2010/2011 учебный год
публичный отчет за 2010/2011 учебный годпубличный отчет за 2010/2011 учебный год
публичный отчет за 2010/2011 учебный годDIANA1908
 
Sri prabha Mixed Media Art
Sri prabha Mixed Media ArtSri prabha Mixed Media Art
Sri prabha Mixed Media ArtSri Prabha Art
 
Sri Prabha Mixed Media Artwork Cosmos Series
Sri Prabha Mixed Media Artwork Cosmos SeriesSri Prabha Mixed Media Artwork Cosmos Series
Sri Prabha Mixed Media Artwork Cosmos SeriesSri Prabha Art
 
10 класс урок 1 слайдов 59
10 класс урок 1 слайдов 5910 класс урок 1 слайдов 59
10 класс урок 1 слайдов 59DIANA1908
 
Kağıt endüstirisi
Kağıt endüstirisiKağıt endüstirisi
Kağıt endüstirisiliveturk
 

Andere mochten auch (19)

Angles -1
Angles -1Angles -1
Angles -1
 
Care and Feeding of Social Media Team on Your Campus
Care and Feeding of Social Media Team on Your CampusCare and Feeding of Social Media Team on Your Campus
Care and Feeding of Social Media Team on Your Campus
 
Sri Prabha Art and Abstract Paintings
Sri Prabha  Art and Abstract PaintingsSri Prabha  Art and Abstract Paintings
Sri Prabha Art and Abstract Paintings
 
виноградов моу школа 25
виноградов моу школа 25виноградов моу школа 25
виноградов моу школа 25
 
Platonic Solids -2
Platonic Solids -2Platonic Solids -2
Platonic Solids -2
 
солдатенкова моу школа 25
солдатенкова моу школа 25солдатенкова моу школа 25
солдатенкова моу школа 25
 
Chris Goehner
Chris GoehnerChris Goehner
Chris Goehner
 
Права человека через призму новейших технологий моу школа 25
Права человека через призму новейших технологий моу школа 25Права человека через призму новейших технологий моу школа 25
Права человека через призму новейших технологий моу школа 25
 
Plannig and models’ building
Plannig and models’ buildingPlannig and models’ building
Plannig and models’ building
 
STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES
STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES
STRAIGHT, SEMI-STRAIGHT AND SEGMENTLINES
 
Vs juventus
Vs juventusVs juventus
Vs juventus
 
11 класс урок 1слайдов 44
11 класс урок 1слайдов 4411 класс урок 1слайдов 44
11 класс урок 1слайдов 44
 
публичный отчет за 2010/2011 учебный год
публичный отчет за 2010/2011 учебный годпубличный отчет за 2010/2011 учебный год
публичный отчет за 2010/2011 учебный год
 
Edges, faces and vertices
Edges, faces and verticesEdges, faces and vertices
Edges, faces and vertices
 
Sri prabha Mixed Media Art
Sri prabha Mixed Media ArtSri prabha Mixed Media Art
Sri prabha Mixed Media Art
 
Sri Prabha Mixed Media Artwork Cosmos Series
Sri Prabha Mixed Media Artwork Cosmos SeriesSri Prabha Mixed Media Artwork Cosmos Series
Sri Prabha Mixed Media Artwork Cosmos Series
 
10 класс урок 1 слайдов 59
10 класс урок 1 слайдов 5910 класс урок 1 слайдов 59
10 класс урок 1 слайдов 59
 
Prisms and Pyramids
Prisms and PyramidsPrisms and Pyramids
Prisms and Pyramids
 
Kağıt endüstirisi
Kağıt endüstirisiKağıt endüstirisi
Kağıt endüstirisi
 

Ähnlich wie J huery

Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPCAndrea Dottor
 
phpday 2006 - SEA case study
phpday 2006 - SEA case studyphpday 2006 - SEA case study
phpday 2006 - SEA case studyGaetano Giunta
 
From Scratch To Network - User mode linux
From Scratch To Network - User mode linuxFrom Scratch To Network - User mode linux
From Scratch To Network - User mode linuxMajong DevJfu
 
Drupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e DrupalDrupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e DrupalDrupalDay
 
Azure IoTHub - Roboval 2018
Azure IoTHub - Roboval 2018Azure IoTHub - Roboval 2018
Azure IoTHub - Roboval 2018Andrea Tosato
 
Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2Fabio Mora
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLAndrea Della Corte
 
Continous Delivery & HQ Code
Continous Delivery & HQ CodeContinous Delivery & HQ Code
Continous Delivery & HQ CodeDaniele Mondello
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaXPeppers
 
4 - Introduzione al Web (1/2) - 16/17
4 - Introduzione al Web (1/2) - 16/174 - Introduzione al Web (1/2) - 16/17
4 - Introduzione al Web (1/2) - 16/17Giuseppe Vizzari
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationLezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationAndrea Della Corte
 

Ähnlich wie J huery (20)

Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPC
 
phpday 2006 - SEA case study
phpday 2006 - SEA case studyphpday 2006 - SEA case study
phpday 2006 - SEA case study
 
Infrastructure as Data
Infrastructure as DataInfrastructure as Data
Infrastructure as Data
 
From Scratch To Network - User mode linux
From Scratch To Network - User mode linuxFrom Scratch To Network - User mode linux
From Scratch To Network - User mode linux
 
Drupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e DrupalDrupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e Drupal
 
Packet Sniffing
Packet SniffingPacket Sniffing
Packet Sniffing
 
Docker & DevOps
Docker  & DevOpsDocker  & DevOps
Docker & DevOps
 
Azure IoTHub - Roboval 2018
Azure IoTHub - Roboval 2018Azure IoTHub - Roboval 2018
Azure IoTHub - Roboval 2018
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2Tanti "piccoli rilasci" con Symfony2
Tanti "piccoli rilasci" con Symfony2
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
 
Continous Delivery & HQ Code
Continous Delivery & HQ CodeContinous Delivery & HQ Code
Continous Delivery & HQ Code
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastruttura
 
4 - Introduzione al Web (1/2) - 16/17
4 - Introduzione al Web (1/2) - 16/174 - Introduzione al Web (1/2) - 16/17
4 - Introduzione al Web (1/2) - 16/17
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationLezione 6: Remote Method Invocation
Lezione 6: Remote Method Invocation
 

J huery

  • 1. jHuery Facciamo luce sul DOM – usi e abusi di tecnologie web
  • 2. Chi sono (Quello sulla destra) Committer – Dojo Toolkit Responsabile area AmI, Ricercatore – ISIN, DTI, SUPSI Cofondatore – Tesseract SAGL nicola.rizzo@supsi.ch nicola.rizzo@gmail.com 2
  • 3. jHuery - nota • Avrei voluto sviluppare jQwerty, una libreria per la gestione dell’input da tastiera, ma… 3
  • 4. 4
  • 5. Ingredienti – 1 / 2 • Lampadine Philips Hue + bridge • Un browser moderno (per quanto riguarda l’implementazione attuale) • XMLHttpRequest • CORS (due cucchiai) • DocumentFragment • MutationObserver • localStorage • jQuery*(dojo, altra libreria o solo querySelector e querySelectorAll) * non strettamente indispensabile; ho scelto jQuery per il gioco di parole e per la notorietà, ma in ogni caso non è una dipendenza 5
  • 6. Ingredienti (demo) – 2 / 2 • tag video • canvas • un filmato :-) 6
  • 7. Ingredienti (altro) – 3 / 2 • gestione moduli e dipendenze • lib di pub-sub • css / sass / less… • un framework di test 7
  • 8. DOM (Document Object Model) doc nodo nodo nodo nodo nodo 8
  • 9. Selezione elementi DOM • Utilizzando dei selettori CSS è immediato ottenere gli elementi corrispondenti: per esempio jQuery(‘.light’); restituisce tutti gli elementi con classe “light”. jQuery però ha un secondo parametro facoltativo, a che cosa serve? http://api.jquery.com/jQuery/ 9
  • 10. Contesto • Il secondo parametro è un “contesto”, un nodo o un oggetto dal quale far partire il selettore Dato il frammento: <div class=“light”></div> <div id=“context”> <div class=“light”></div> <div class=“light”></div> </div> … var context = document.getElementById(‘context’); jQuery(‘.light’, context); selezionerà solo i due div contenuti in context 10
  • 11. HOME (Home Object ModEl) home kitchen light light room room home kitchen light light room room 11
  • 12. L’idea • Se fosse possibile rappresentare la propria casa con come un nodo DOM, potremmo scrivere: … var jHuery = (function(){ var homNode = hom.getRootNode(); return function(selector){ return jQuery(selector, homNode); }; })(); ... partial application 12
  • 13. Risultato desiderato // accende tutte le luci della cucina jHuery(‘kitchen light’).attr(‘on’, ‘true’); è possibile? Notare, non ho usato classi ma nomi di tag 13
  • 14. Philips Hue • Sono lampadine led RGB colorate wireless comandabili • Il bridge è da collegare al router di casa con un cavo di rete: invia e riceve informazioni verso e dalle lampadine • Sul bridge gira un web server** che espone delle uri REST per l’esecuzione dei comandi da un qualsiasi client, anche da un browser (documentazione su http://developers.meethue.com ) ** ma avevi detto “niente server”! intendevo che non l’avremmo sviluppato noi :P 14
  • 15. Spazio CIE Le lampadine Hue non usano RGB per definire il proprio colore; è possibile utilizzare le due coordinate x, y per arrivare ai colori del diagramma a destra. E’ possibile convertire in modo più o meno (in)esatto una terna RGB in CIE (x, y). 15
  • 16. Hue + saturation Un altro modo possibile per assegnare un colore è dato dalla coppia • hue: 16 bit: 0 e 65535 sono rosso, 25500 è verde, 46920 è blu • saturation: 8 bit: 254 è colorato, 0 è meno saturo, toni di grigio Nota: è possibile assegnare un colore in css usando la forma hsl(Hue, Saturation, Lightness), o hsla, aggiungendo il canale alpha. In questa forma Hue varia da 0 a 360, poiché è un angolo; s ed l sono percentuali 16
  • 17. Ingredienti – AJAX e CORS (Cross-origin Resource Sharing • Come faccio a inviare i miei comandi? • Via AJAX! Non ci sono problemi di sicurezza X-origin, visto che il bridge espone l’header Access-Control-Allow-Origin: * per accendere la lampadina numero 1 occorre mandare all’indirizzo: http://indirizzoBridge/apikey/lights/1/state questo pacchetto in PUT: { “on”: true } 17
  • 18. Ingredienti – CORS, secondo cucchiaio • Come trovare l’indirizzo del bridge nella rete locale? • via U-PnP (ma non è il nostro caso) • Con una GET a questo indirizzo: https://www.meethue.com/api/nupnp Ovviamente il server risponde con le intestazioni CORS e con un pacchetto del tipo [{"id":"iddelbridge","internalipaddress":"192.168.0.5"}] A questo punto occorre registrare la propria applicazione con una chiamata POST nei 30 secondi successivi alla pressione del pulsante sul bridge da parte dell’utente, per motivi di sicurezza 18
  • 19. DocumentFragment • Un DocumentFragment è un nodo document non collegato a ciò che viene renderizzato nel browser. E’ il candidato ideale per svolgere operazioni “dietro le quinte” utilizzando dei nodi che non devono essere mostrati. Una volta che sia stata letta la lista delle lampadine disponibili, sarà possibile quindi creare dei div (o un elemento a piacere) con almeno la classe “light”, oppure addirittura un element <light>, visto che DocumentFragment può contenere XML*** e che i selettori funzionano lo stesso, quindi: var light = document.createElement('light'); è perfettamente lecito. Prima di appendere al DF, si possono aggiungere vari attributi – tra cui l’id - al nodo, in modo da facilitare i selettori 19 *** XML is crap. Really. There are no excuses. XML is nasty to parse for humans, and it's a disaster to parse even for computers. There's just no reason for that horrible crap to exist - Torvalds, Linus (2014-03-06)
  • 20. MutationObserver Per modificare lo stato di una o più lampadine contemporaneamente è sufficiente modificare gli attributi corrispondenti sull’insieme di nodi selezionato. Come fare a intercettare i cambiamenti di attributo? L’API MutationObserver consente di monitorare i cambiamenti di struttura di un nodo target, attributi compresi. new MutationObserver(function(mutations){…}); La funzione di callback viene invocata come un gestore d’eventi ogni volta che sul nodo target avviene una delle mutazioni monitorate. Il medesimo observer può essere applicato a più nodi; l’array mutations può essere iterato ottenendo per ogni elemento l’elemento su cui è stato applicato 20
  • 21. localStorage Non è strettamente necessario per il funzionamento, ma è un buon posto in cui salvare i dati relativi al bridge per non doverli richiedere ogni volta (in particolare la chiave relativa all’applicazione) Ovviamente occorre fidarsi del sito ospitante 21
  • 22. Resta da fare • Scrivere un polyfill per MutationObserver (usando MutationEvent) • Estendere il concetto a oggetti diversi dalle lampadine • Estensione CSSOM? • Bookmarklet per youtube o altri siti? • Generare gli eventi per i cambiamenti di stato delle lampade • Permettere la modifica di più attributi contemporaneamente • Permettere la modifica a più lampade contemporaneamente (barando) • Usare un browser headless (phantomjs) per il caso generale • Test! Test! Test! 22

Hinweis der Redaktion

  1. …ho avuto qualche problema con la tastiera svizzera :-)
  2. breve carrellata di ciascun elemento, a braccio andrà bene; hue starter kit, 180 euro Demo a mano QUI
  3. Due chiacchiere qui ce le posso anche spendere, no?
  4. certo, altrimenti non sarei qui a raccontarla :-)
  5. Ah, hai mentito, avevi detto senza web server? Io intendevo che non lo avremmo dovuto implementare ;-)
  6. International Commission on Illumination; raccontare da dove ho rubato la matrice dei pesi. Per fortuna la libreria per il calcolo matriciale l’avevo già scritta anni fa!
  7. Qui potrebbe già starci una prova :-)
  8. Ovviamente non è finita qui, se l’utente dà il permesso, si deve registrare l’applicazione al bridge
  9. Parlare della peculiarità del DocumentFragment, se serve
  10. Event, initEvent e dispatchEvent; initEvent necessario su IE, che non supporta il costruttore Event ma usa document.createEvent