Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly,...

50

Transcript of Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly,...

Page 1: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della
Page 2: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Chi sono?Riccardo Govoni -- [email protected]

Prima lavoravo qui Adesso lavoro qui

Il mio capo e' questo qui Comunque sempre con questo qui

Page 3: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Disclaimer

Il contenuto di questa presentazione riflette le opinioni personali dell'autore, le quali possono differire dalle posizioni del datore di lavoro.

Il contenuto di questa presentazione risente delle opinioni soggettive dell'autore.

Page 4: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Che c'entra Javascript con ilLinux Day?

Page 5: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della
Page 6: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Dove lo trovo?

In un browser. Quindi ovunque.Ma non solo.

Page 7: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Perche' ?Perche' il browser ha smesso da un pezzo di essere un visualizzatore di pagine.

Ma e' piuttosto un contenitore di applicazioni.

Javascript e' in linguaggio correntemente in uso per questo scopo. Nel cloud computing ci sei gia' dentro, volente o nolente.

Page 8: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Linguaggio

Page 9: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Javascript ha avuto un'infanzia difficile

Se non e' chiaro, e' colpa dei browser. 1995: Brendan Eich, Livescript, poi Javascript1996 : Netscape Navigator 2, IE 3, JScript1997 : EcmaScript standard2000 : EcmaScript 1.3 ~ Javascript 1.5...... Netscape, Firefox, IE, Opera, Safari, Chrome ......2008 : Javascript 1.8

Page 10: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

... e ogni browser agisce a modo suoJavascript vive principalmente in un browserOgni browser implementa gli standard ( HTML, CSS, et al.. ) a modo suo.

Le capacita' percepite di Javascript, e del browser in cui vive, sono un miscuglio di mille diversi fattori.

http://www.joelonsoftware.com/items/2008/03/17.html

Page 11: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Linguaggio

Javascript e' un linguaggio di scripting, principalmente orientato allo sviluppo client, debolmente tipizzato, dinamico, che supporta programmazione procedurale, basata su prototipi e funzionale.

In pratica:

In realta' e' un accrocchio il cui standard non sempre viene rispettato che vive in un mondo di browser in cui ognuno fa quello che gli pare.

Page 12: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Linguaggio di scripting

Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della compilazione. <html> <body> <script>alert("hello world!");</script> </body></html>

Page 13: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Ok, un esempio meno banale. Number.prototype.even = function() this % 2 == 0; function $(id) document.getElementById(id); function rowGenerator(table) { var i = 0; while ( i < table.rows.length ) { if (Number(i++).even()) { yield table.rows[i] } } yield false; } function Colorizer(color) { return function(table) { g = rowGenerator($(table)); while (row = g.next()) { row.style.backgroundColor = color; } } } var blueRowsFor = Colorizer('#0000FF'); blueRowsFor('myTable');

Page 14: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Eh ?? Un passo alla volta

Javascript e' fondamentalmente procedurale e non parallelo.Un'istruzione alla volta, da cima a fondo.

<script> function stampa(messaggio) { document.write("<p>" + messaggio + "</p>"); } stampa("Yodel!");</script>

Page 15: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Questo e' un oggetto

{ }

Page 16: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Con il ripieno.

{ nome: 'Leonardo', cognome: 'Da Vinci', parla: function() { return "blah"; } inventa: function(strumenti) { /* usa strumenti */ }}

Page 17: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Se poi gli dessimo anche un nome...

var leo = { nome: 'Leonardo', cognome: 'Da Vinci', parla: function() { return "blah"; } inventa: function(strumenti) { /* usa strumenti */ }} leo.parla();> blah

Page 18: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

E che me ne faccio di un oggetto?

Number.prototype.even = function() this % 2 == 0;

In Javascript posso aprire un oggetto come una cozza e metterci il ripieno che voglio.

In Javascript non ci sono classi. Ma solo oggetti ed i loro prototipi. Pensa ad una catena di dipendenze.

Page 19: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Functions

function $(id) document.getElementById(id); var adder = function(a, b) { return a + b; };var somma = adder;somma(3,5);> 8var eventHandler = function(event) { ... }for (var b in allMyButtons) { b.addEventListener('click', eventHandler);}

Javascript supporta la programmazione funzionale:partials, currying, lambda, high-order functions. Ci puoi fare map/reduce!

Page 20: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Partials & Closures

function Aggiungitore(a) { return function(b) { return a+b; }}var aggiungi5a = Aggiungitore(5); // una partial function!var result = aggiungi5a(10); // 15var result2 = aggiungi5a(6); // 11

Le funzioni sono oggetti come gli altri. Possiamo usarli come valore di ritorno da un metodo. Javascript supporta le closures e quindi possiamo avere i partials! Yay!

Page 21: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Pythonic Generators

function rowGenerator(table) { var i = 0; while ( i < table.rows.length ) { if (Number(i++).even()) { yield table.rows[i] } } yield false; }

Javascript (dalla versione 1.8) ha i generatori come in Python! E tante altre belle cosine (iteratori, list comprehension ...).

Peccato che praticamente solo Firefox supporta questi costrutti. Son tutti fermi alla versione 1.5 !

Page 22: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Mettendo tutto insieme ... Number.prototype.even = function() this % 2 == 0; function $(id) document.getElementById(id); function rowGenerator(table) { var i = 0; while ( i < table.rows.length ) { if (Number(i++).even()) { yield table.rows[i] } } yield false; } function Colorizer(color) { return function(table) { g = rowGenerator($(table)); while (row = g.next()) { row.style.backgroundColor = color; } } } var blueRowsFor = Colorizer('#0000FF'); blueRowsFor('myTable');

Page 23: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Facendo finta che sia una libreria...<html>... <body> <table id='myTable'>...</table> <script>blueRowsFor('myTable');</script> </body></html>

Finalmente! Possiamo manipolare il contenuto della pagina web. E abbiamo un sacco di strumenti potenti per farlo.

(ok, per l'esempio mostrato bastava molto meno)

Page 24: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

DOM & CSS

Page 25: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

La potenza e' nulla senza controllo ?Come posso interagire con il browser ?

DOM : la struttura della pagina web. Tabelle, paragraphi, box, liste etc...

CSS : l'aspetto della pagina web. Colori, posizioni, layout, fonts, rendering etc ...

Eventi: qualunque cosa succede sulla pagina. Movimenti del mouse, scrolling, clicks, resize, keypress.

E un milione di incoerenze tra i vari browser. Quindi ??

Page 26: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Librerie

Page 27: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Obiettivo: fornire un'astrazione decente sopra alle minuzie del linguaggio e alle incompatibilita' dei browser.

Un po' come le glibc, o le GTK a seconda della libreria.

Se volete imparare javascript, studiatevi i sorgenti di una di esse ( jQuery ).

Page 28: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Esempio di jQuerySe dovete scegliere una libreria, scegliete questa. Il resto non conta.

$('.panel').is(':visible'). hide('fast').next('.panel').is(':hidden').eq(0). show('slow');

$.ajax({ url: "test.html", success: function(html){ $("#results").append(html); }});

$("p").click(function () { $(this).slideUp(); });

Page 29: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Demo!

Page 31: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

JParallax, e come cavolo fa?

http://webdev.stephband.info/parallax.html

<ul id="parallax"> <li></li> <li></li></ul><script>$('#parallax').parallax();</script>

e un pizzico di css positioning in base alla posizione del mouse.

Page 33: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Rhizosphere, e come cavolo fa ?User Interface Manager in 30Kb, 100% Javascript :

Drag'n'Drop, Selection, Layout, Filtering, Model Agnostic http://code.google.com/p/rhizosphere/

DIV CSS Positioning, Hiding & Smoothing function:

$('.model'). css('display', filtered ? 'none' : ''). .css('position', 'absolute') .css('top', '130px') .css('left', '200px');

Page 35: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

280 Slides. E come cavolo fa?Applicazione per presentazioni ~ PowerPoint, Keynote.

Basata su ObjectiveJ, un linguaggio ibrido basato su Javascript e ObjectiveC, trasformato in Javascript all'interno del browser da un processore scritto anch'esso in Javascript, e Cappuccino, un framework tipo Cocoa. Molto Mac-ish.

280 Slides tecnicamente e' una pagina web tanto quanto un articolo di Wikipedia: HTML, JS, richieste HTTP ... ma sfido chiunque a definirla tale.

Page 36: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Engines

Page 37: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Chi fa andare tutta la baracca ?Esiste una valanga di engine javascript: Mozilla: SpiderMonkey, TraceMonkey, RhinoSafari : SquirrelFish (Extreme)Chrome : V8Internet Explorer : NonMiRicordo Opera : Futhark Flash : Tamarin

I benchmark? non sempre contano ( obsoleti, opinabili e/o non imparziali, l'engine javascript e' solo una parte del browser ).

Quasi tutti si stanno muovendo verso la compilazione on-the-fly.

Page 38: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Canvas

Page 39: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Niente giochi ? Niente mp3 ?<canvas> e' un elemento HTML, programmabile in Javascript, che offre una superficie di disegno 2D.

Introdotto da Apple per i widget della dashboard, poi adottato da Firefox, disponibile in Opera 9 ... ovviamente non supportato da Internet Explorer. Per fortuna c'e' : http://code.google.com/p/explorercanvas/

Page 40: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Esempietto<script type="application/x-javascript">function draw() { var canvas = document.getElementById("canvas"); if (canvas.getContext) { var ctx = canvas.getContext("2d"); ctx.fillStyle = "rgb(200,0,0)"; ctx.fillRect (10, 10, 55, 50); ctx.fillStyle = "rgba(0, 0, 200, 0.5)"; ctx.fillRect (30, 30, 55, 50); }}</script><canvas id="canvas" width="150" height="150"></canvas>

Page 41: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Esempione ( di 8Kb)

Mov o YouTube

C'e' anche Super Mario Kart, e per i nostalgici, Wolfenstein 3D ! http://blog.nihilogic.dk/search?q=supermario

Page 42: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Ottimizzazione

Page 43: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

OttimizzazioneOra avete la vostra bella applicazione, ma contiene 300 file javascript e va leeeeeentaaa. Che si fa?

HTTP Caching & GZippingJavascript MinificationImage SpritingStatic Domain PipeliningDelayed FetchContent Reordering ( http://stevesouders.com/cuzillion/ )Parallel Js Fetching

Richiederebbe una lezione a parte ...

Page 44: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

(Dis)Connectivity?

Page 45: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Connectivity : AjaxE' talmente comune che non va nemmeno piu' di moda. Oggi l'anomalia e' quando una applicazione fa richieste HTTP tradizionali, al posto di sole chiamate Ajax.

One Page Applications:1 solo load iniziale, poi tutto Ajax emanipolazione del DOM.

Es.: GMail ( ma Lotus & Outlook Web Access lo facevano da una vita, o quasi )

E' un design che genera una carriola di nuove grane.

Page 46: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Ajax in JQuery

$('.button').click(function() { $.ajax({ url: "test.html", success: function(html){ $("#results").append(html); } });});

Page 47: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Disconnectivity : Un progetto open source, per estendere il browser con la capacita' di lavoro offline e l'integrazione con il desktop.

In pratica:un miniserver locale per servire i contenuti offline (immagini, pagine web, etc)un database sqllite per lo storageun modello multithread per operazioni asincroneuna libreria javascript per coordinare il tutto

http://gears.google.com

Page 48: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Disconnectivity : Gears

In piu' : Integrazione con il DesktopGeolocation

Chi lo usa?

Google Docs, ZohoWriter, WordPress , ... L'anello di giunzione tra una applicazione web ed una classica applicazione desktop ?

Page 49: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della

Ebbasta!

Ma dobbiamo ancora parlare di un sacco di cose!

e il debugging? e FireBug ? e Javascript Serverside ? e LightBox ? e Processing.js ?

Grazie!

Page 50: Javascript - LD08 - imolug.org · Linguaggio di scripting Interpretato, o compilato on-the-fly, dall'engine in uso. In ogni caso lo sviluppatore non ha lo step intermedio della