Friday, June 09, 2006

Addio alla neutralità della rete, ovvero il pizzo ai telefonici

(foto by ksubramz, a Flickr user)





Le grosse compagnie di telecomunicazioni americane, come AT&T, vogliono mettere in discussione il cosiddetto principio di neutralità della rete (vedi post). Cercando di capire perché la neutralità della rete è così importante, tale da coinvolgere nella discussione i vertici di Google, Tim Berners Lee, e tante altre voci importanti che si schierano per difenderla, ho cercato una definizione sintetica che riporto qui:

(fonte punto-informatico.it)

La violazione del principio di neutralità avviene quando un ISP "favorisce" l'accesso a certi content-provider, gli editori digitali che vendono contenuti multimediali con Internet, attraverso la riscossione di tariffe extra. Allo stesso modo, gli ISP potrebbero negare parità di trattamento a tutti quei fornitori di servizi (operatori VoIP, IPTV e via dicendo) non disposti a pagare pedaggi.

Naturalmente, se le telco americane fanno qualcosa di sbagliato per gli utenti, quelle europee cosa fanno? Le imitano. E, manco a dirlo, chi c'è in prima linea a cercare di fottere il consumatore?

In Europa la commissaria per la società dell'informazione, Viviane Reding, si è espressa a favore della neutralità di Internet. Nei giorni scorsi i colossi europei delle telecomunicazioni, tra i quali spuntano Telecom Italia e Deutsche Telekom, hanno iniziato a fare pressione sulle istituzioni europee per avviare un dibattito sulla questione.

Wednesday, June 07, 2006

Mashup con le mappe di Google

(per la serie google-maps)


Mashup
Google Maps fornisce una API javascript che consente di costruire un'applicazione web che incapsula un componente GMap2, fornendo così all'utente mappe interattive con foto satellitari. Queste applicazioni che mixano insieme elementi provenienti da servizi web diversi si chiamano mashup, sono molto web 2.0, ed il loro numero è in crescita sul web a conferma di un trend che si sta consolidando.
Tra i mashup basati su Google Maps citiamo:
http://www.placeopedia.com/
http://www.panoramio.com/


Ciao mondo con Google Maps API
Il primo passo è quello di collegarsi all'URL http://www.google.com/apis/maps/ e ottenere una chiave. Infatti, l'utilizzo di Google Maps prevede che voi incorporiate nella vostra pagina HTML un tag script che importa tutto il Javascript necessario per far funzionare le mappe nel vostro sito. Per maggiori informazioni sulle condizioni d'uso e su come ottenere la chiave visitate il sito Google http://www.google.com/apis/maps/signup.html. Per creare una chiave dovete fornire la URL della directory Web che conterrà la vostra applicazione. Quindi, se la vostra applicazione sarà raggiungibile dalla URL http://foo.bar/mydir/index.html allora dovrete utilizzare http://foo.bar/mydir per creare la chiave.

Una semplice pagina web che mostro qui visualizza una mappa dotata di controlli pan e zoom, una minimappa di overview nell'angolo in basso e i bottoni per la visualizzazione delle foto satellitari. Inoltre registra un ascoltatore che ad ogni drag della mappa stampa su una console le nuove coordinate del centro, ed un altro ascoltatore che al click su un punto associa il popup di un messaggio a schermo. Il codice è riportato di seguito.



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps JavaScript API Example</title>
<script src="http://maps.google.com/maps?file=api&amp;v=2&key=ABQIAAAAbhj-186VADZlDiZlpmGsnhQlY8WJo1SwYVJ9qIhz_Dm_G3sGrhRMXGaAErINNDXYAcJkaLzil5Vm4Q"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[

function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GOverviewMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(42.0, 9.5), 5);
GEvent.addListener(map,'click',onClick);
GEvent.addListener(map,'moveend',function(){
GLog.write('new map center is\n '+map.getCenter());

});

}
}




function onClick(overlay,latlng){
alert("Ciao Mondo! Sei in "+latlng.lat()+","+latlng.lng());
}

//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 500px; height: 300px"></div>
</body>
</html>

Thursday, June 01, 2006

Il seminario fantasma sul P2P

The image “http://static.flickr.com/45/149374612_f030b6d826_m.jpg” cannot be displayed, because it contains errors. Aula Y

(Foto by Mark Moxon)


Il mio seminario sul P2P è poi saltato per una serie, diciamo così, di disguidi. Sperando di far cosa gradita a chi suo malgrado era lì, e anche a chi si era perso per le aule, segnalo che le slide in formato pdf, ppt e odp sono reperibili presso il folder http://www.esnips.com/web/me2you al quale potete anche registrarvi via RSS tramite http://www.esnips.com/feed/cfbd2d7b-8271-47de-a791-ae94ef6907a1/rss_2.0



Wednesday, May 31, 2006

Web 3.0 anzi Web k.0 (c) per k=3,4,...,M con M grande a piacere (c)



Web 3.0 (c) anzi Web k.0 (c) per k=3,4,...,M con M grande a piacere (c)
. E lo ripeto. Forse comprerò questo marchio, dato che Web 2.0 è stato comprato da O'Reilly, il quale ha contestato per vie legali l'utilizzo della parola Web 2.0 alla no-profit IT@Cork. Alla faccia del sapere aperto e della libera circolazione delle idee.

Saturday, May 27, 2006

Grillo, il Berlusconi del Web2.0?

The image “http://www.beppegrillo.it/archives/fotografie/beppe-grillo-33.jpg” cannot be displayed, because it contains errors.

La television la g'a' una forza de leon!!!
La discesa in campo di Berlusconi, di 13 anni fa venne salutata, annunciata e appoggiata dagli *artisti* delle sue TV, con fresco entusiasmo e spontaneo trasporto direbbero loro, con impeto e ardimento dico io. "Questa volta io voto per un amico" disse Vianello durante una trasmissione sportiva, senza che nessuno glielo chiedesse naturalmente.
Ieri, collegandomi per la decima volta in un giorno al mio bloglines, vedo una news sul blog di Grillo, la apro e vedo il faccione di Dario Fo ed un suo articolo-spottone-elettorale ospitato nel blog del comico. Niente contro Fo, e niente contro Grillo fino a questo punto, ma ho provato la stessa sensazione di 13 anni fa di fronte al fatto che un signore che ha un seguito importante, un pubblico numeroso, una comunità che attende di consumare contenuti da quel canale, a un certo punto imponga, non solo un suo punto di vista od una sua opinione (ci mancherebbe, è il suo blog), uno spottone elettorale senza troppi problemi. La politica si preoccupa troppo di tenere sotto controllo la TV. E' troppo vecchia la nostra classe dirigente per capire che il web è il media del presente e non del futuro, quindi non se ne occupa, a parte Fo naturalmente. Per fortuna non se ne occupa dico io, perché se se ne occupasse chissà che sfacelo. Ma intanto mi rimane il dubbio, non è che dopo nani e ballerine da Arcore la prossima cultura da mass-media (o mess-media) dominante sarà quella del Grillo parlante?

Thursday, May 25, 2006

Web services REST con Python e Twisted in un secondo

(Foto by Very Good With Computers)


C'era bisogno di inventare i Web service in Soap così complicati, così interoperabili solo a parole, così pesanti da implementare, da testare e da mettere in moto? Forse no, c'è REST; c'è sempre stato; leggere questo per credere. In poche parole, qualsiasi applicazione web può essere progettata a partire dai dati e dalle 4 operazioni fondamentali che ci permettono di leggerli, crearli, modificarli e cancellarli. Manco a dirlo GET, POST, PUT e DELETE. I dati sono ad esempio ordini, descrizioni anagrafiche, prenotazioni, e questi possono essere in XML, oppure no. A che ci serve XML se poi la nostra applicazione usa solo come client HTML e Javascript? Molto meglio usare oggetti Javascript direttamente serializzati in formato JSON. Inoltre, Javascript e Python hanno in comune costrutti come questi:

a={“x”:32 , “y”:25}

b=[23,33, “I'm a string”]

c=[[34,35,36],[44, “s”]]

Queste espressioni sono valide sia in Python che in Javascript, e questo suggerisce che scrivendo il server in Python possiamo sviluppare web application basate su Ajax in tempo zero.


Vediamo un caso pratico. Costruiamo un web service che permetta di gestire una lista di utenti in modo che possiamo vedere la lista degli utenti, creare un nuovo utente, vedere i dettagli di un utente e cancellare un utente dalla lista. Per fare questo ci bastano due URL ed i quattro verbi dell'HTTP.


http://myserver/listUsers

da usare solo con GET


http://myserver/user?name=davide


POST crea un utente il cui name è davide

GET visualizza i dettagli di davide

PUT modifica l'utente davide

DELETE cancella davide dalla lista



Di seguito il codice che richiede, come ovvio, Twisted. Per testare le GET e POST potete usare un form HTML, mentre per PUT e DELETE dovrete usare Ajax o un altro client che vi consenta di usare questi metodi.

from twisted.internet import reactor
from twisted.web import server, resource
from twisted.web.static import File

user1={"name":"john", "surname":"smith", "age":23, "email":"john@foo.bar"}
user2={"name":"davide", "surname":"carboni", "age":35, "email":"davide@foo.bar"}
user3={"name":"stefano", "surname":"sanna", "age":32, "email":"stefano@foo.bar"}

users=[user1,user2,user3]

class Root(resource.Resource):
isLeaf=False
def render_GET(self, request):
return "Arkanoid?"





class ListUsers(resource.Resource):
isLeaf=True
def render_GET(self, request):
userList=[us['name'] for us in users]
return str(userList)




class User(resource.Resource):
isLeaf=True
def render_GET(self, request):
name=request.args['name'][0]
record=filter(lambda(x): name==x['name'], users)[0]
return str(record)



def render_POST(self,request):
record=eval(request.content.read())
#ATTENZIONE, L'UTILIZZO DI EVAL SU UN DATO TRASMESSO DALL'
#UTENTE E' UNA FALLA DI SICUREZZA. OCCORRE UTILIZZARE UN
#PARSER AD-HOC COME SIMPLEJSON

users.append(record)
return 'http://localhost/user?name=%s' % (record['name'])


def render_PUT(self,request):
name=request.args['name'][0]
newrecord=eval(request.content.read())
#ATTENZIONE, L'UTILIZZO DI EVAL SU UN DATO TRASMESSO DALL'
#UTENTE E' UNA FALLA DI SICUREZZA. OCCORRE UTILIZZARE UN
#PARSER AD-HOC COME SIMPLEJSON

oldrecord=filter(lambda(x): name==x['name'], users)[0]

for key in oldrecord:
oldrecord[key]=newrecord[key]

return "OK"

def render_DELETE(self,request):
name=request.args['name'][0]
record=filter(lambda(x): name==x['name'], users)[0]
users.remove(record)
return "OK"



if __name__ == "__main__":
root=Root()
root.putChild("user",User())
root.putChild("listUsers",ListUsers())
root.putChild("d",File("."))
site = server.Site(root)
reactor.listenTCP(8000, site)
reactor.run()