Visualizzazione post con etichetta javascript. Mostra tutti i post
Visualizzazione post con etichetta javascript. Mostra tutti i post

Integrazione Twitter in Koego

Per chi ancora non lo sapesse, non esiste solo Google analytics come tool per l'analisi Web di un sito. So che molti sono ormai "addicted" agli applicativi del colosso di Mountain View, ma è bello poter sperimentare anche altri sistemi. Nulla vieta poi di provarli entrambi per verificare personalmente le differenze d'utilizzo in base alle proprie esigenze (inutile concentrarsi troppo su quelle numeriche per minimali differenze).

Report Twitter su KoegoKoego è un prodotto che sta crescendo sempre più: offre un sistema di reportistiche avanzate realizzate in jQuery, che permettono di comparare facilmente molti elementi (pageview, visite, keyword gruppate, ecc) ed avere tutto quel che ci serve con notevole semplicità e a portata di pochissimi click.
I dati vengono prelevati inserendo del codice javascript nel proprio sito, come avviene per tutti i tools di Web Analytics. Inutile dilungarsi in altre descrizioni, il modo migliore per conoscere quest'ottimo servizio (di cui sentirete ancora parlare) è senz'altro quello di provarlo :-)

[JS] php.js: porting javascript di svariate funzioni PHP

Tramite il bloggatore mi è capitato sottomano questa interessante libreria che propone il porting di numerose funzioni PHP per javascript.
Ad una superficiale analisi gli svantaggi consistono nella pesantezza della libreria stessa (quasi 240 KB!) e la interdipendenza fra alcune funzioni che potrebbero render difficile l'utilizzo di una sola parte della libreria.
Intanto me la tengo nel cassetto, potrebbe sempre servire :-)


Technorati tags: ,

Powered by ScribeFire.

[Mootools] ToolTip per MT 1.2.0

Ho trovato questo bello script su Hotajax per creare dei tooltip con la libreria MooTools 1.1.
Peccato stessi usando la versione 1.2.0 e quindi non andasse bene: Firebug segnalava che setHTML non era una funzione e Fx.Styles era indefinito.

Per farlo funzionare bisogna copiarsi la funzione setHTML da MT 1.1:
/* MODIFICATO per TOOLTIP */
setHTML: function(html){
this.innerHTML = html;
return this;
},
e infine cambiare Fx.Styles con Fx.Morph alla riga 49 del codice dello script del tooltip:

this.fx = new Fx.Morph(this.tooltip,this.options);
E' tutto!

Technorati tags: ,
Powered by ScribeFire.

[Prototype] Modifica al bookmarklet cerca API

In riferimento a quest'articolo raccogli link su Prototype e Scriptaculous, ho leggermente modificato l'API Search Bookmaklet; per cercare le API sul sito Prototype.org, in modo tale che si clicca su Annulla o si clicca su OK senza aver specificato alcunchè, non ci ritroviamo una pagina bianca con null e non ricerchiamo valori nulli nel sito:
javascript:p=prompt('Cerca nelle API di Prototype'); if(p && p.toLowerCase() != "null" && p.toLowerCase() != "") { p=p.replace(/\./g, '/'); window.location='http://prototypejs.org/api/'+p.toLowerCase();} else www;
Controllo innanzitutto che p non sia nullo e che la stringa non sia vuota o diversa da null. In caso contrario faccio scatenare volontariamente un errore javascript nell'else in modo da lasciarmi nella pagina corrente senza far avvenire nulla.


[JS] Cos'è JSON?

Javascript, Ajax, Prototype sono tutti argomenti nuovi e interessantissimi per me e devo colmare questi vuoti per riuscire a capire e a contribuire allo sviluppo di Visual Path.
Nel leggere il tutorial di Prototype mi sono imbattutto per l'ennesima volta sull'acronimo JSON e per quel che ne sapevo, costituisce una particolare notazione usata per lo scambio di dati. Vediamo di approfondire un po'.

Definizione e descrizione

JSON (JavaScript Object Notation) è un formato leggero per lo scambio di dati, di facile lettura ed interpretazione sia per gli uomini sia per i computer.
E' basato su un sottoinsieme di Javascript.
JSON è un formato testuale completamente indipendente dal tipo di linguaggio utilizzato anche se utilizza convenzioni sintattiche familiari ai programmatori C++, Java e Javascript.

JSON è basato su due strutture:

  • Una collezione di coppie nome/valore. In vari linguaggi ciò viene realizzato come un oggetto, un array, un hash table e così via.
  • Una lista ordinata di valori, che nei vari linguaggi si realizza con un array, un vettore, una sequenza e così via.

In JSON:

  • un oggetto è un set di coppie nome/valore non ordinato. Tale oggetto viene definito all'interno di parentesi graffe, in cui ogni nome viene seguito da i due punti mentre le coppie nome/valore sono separate da virgole.
  • un array è ordinato come una collezione ordinata di valori. Il suo contenuto viene definito fra parentesi quadre dove i valori vengono separati da una virgola;
  • Un valore può essere una stringa fra virgolette, un numero, un valore booleano, null o un oggetto. Queste strutture possono essere innestate.
  • Una stringa è una collezione di zero o più caratteri Unicode, racchiusi fra virgolette, in cui si utilizzano i backslash come caratteri di escape.
Fonte: www.json.org

JSON e PHP



Ecco un esempio di script che sfrutta la funzione json_encode, disponibile di default dalla versione 5.2 di PHP.


/* JSON: ritorno rappresentazioni */

class foo {
private $a;
public $b = 1;
public $c;
private $d;
static $e;

public function test() {
// http://it2.php.net/manual/en/function.get-object-vars.php
var_dump(get_object_vars($this));
}
}

$test = new foo;
echo "Oggetto: ".json_encode($test)."
";
// un oggetto -> {"b":1,"c":null} si noti che le variabili private e // statiche non vengono codificate

[JS] Packer

Packer di Dean Fdwards è un servizio web che permette di ridurre le dimensioni di corpose librerie come Prototype e JQuery.
Da una breve prova di questo servizio su Prototype 1.6.0.1 otteniamo il seguente risultato (tra parentesi le percentuali di compressione):
  • Prototype NON compresso: 121.1 KB;
  • Prototype compresso (con riduzione della lunghezza delle variabili): 73.0 KB (39.7%);
  • Protoype compresso in base 62: 46 KB (62%);
Non male :-) Esiste anche il porting di questo script per PHP, Perl, .NET.
Qualcuno ne conosce di migliori? Fate un fischio ;-)

[JS] Risorse per Prototype e Script.aculo.us

Prototype 1.6.0

Scriptaculous

Libri su Amazon

[JS / PHP] Dump di un oggetto/array

Per un debugging veloce di un oggetto o un array, in PHP tornano sempre utili le classiche funzioni print_r e var_dump.

Binny V A ci mette a disposizione una funzione in PHP e una in javascript per il dumping degli oggetti e degli array.
Per quanto concerne la parte PHP abbiamo:


/********************************************
* Version : 1.01.B
* Author : Binny V A(binnyva (at) hotmail (dot) com : http://www.geocities.com/binnyva)
********************************************/
function dump($data) {
if(is_array($data)) {
print "<pre>-----------------------\n";
print_r($data);
print "-----------------------</pre>";
} elseif (is_object($data)) {
print "<pre>==========================\n";
var_dump($data);
print "===========================</pre>";
}
else {
print "=========> ";
var_dump($data);
print " <=========";
}
}

Mentre per la parte javascript:

function dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;

//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j<level+1;j++) level_padding += " ";

if(typeof(arr) == 'object') { //Array/Hashes/Objects
for(var item in arr) {
var value = arr[item];

if(typeof(value) == 'object') { //If it is an array,
dumped_text += level_padding + "'" + item + "' ...\n";
dumped_text += dump(value,level+1);
} else {
dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
}
}
} else { //Stings/Chars/Numbers etc.
dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
}

[Javascript] Trasformare dinamicamente un documento XML in HTML attraverso XSL

Visto il post di ieri riguardo alle trasformazioni XSL in PHP, oggi altro breve post su come effettuare tali trasformazioni con javascript attraverso un codice cross-browser.
Cominciamo con la funzione deputata al caricamento sincrono del documento XML e relativo documento di stile XSL:


function loadDocument(fileName)
{
/* a seconda che il borwser sia IE o Firefox, si crea un oggetto
* MSXML2.DOMDocument oppure un Document object nativo per Firefox. */
var xmlDoc = window.ActiveXObject ? new ActiveXObject("MSXML2.DOMDocument.3.0") : document.implementation.createDocument("","",null);
xmlDoc.async = false;
xmlDoc.load(fileName);
return xmlDoc;
}
Vediamo la funzione che effettua la trasformazione XSL del documento XML:

function getTransformedHTML(xmlDoc, xslDoc) {

var html = "";

/* Implementazione per Firefox */
if (window.XSLTProcessor)
{
var xsltProc = new XSLTProcessor(); // creazione di un'istanza del processore XSLT
xsltProc.importStylesheet(xslDoc); // importazione del foglio di stile
var fragment = xsltProc.transformToFragment(xmlDoc, document);
html = new XMLSerializer().serializeToString(fragment); // serializzazione del codice HTML in una stringa prima di aggiugnerla alla pagina
}
else if (window.ActiveXObject) /* Implementazione IE */
{
html = xmlDoc.transformNode(xslDoc);
}
return html;
}

Ammettiamo ora di avere una pagina HTML di appoggio che includa le funzioni precedentemente illustrate in uno script esterno e un foglio di stile CSS per abbellire la presentazione.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<script type="text/javascript"
src="StaticXSLT.js"></script>
<link id="Link1" rel="stylesheet" href="cart.css" type="text/css" />
</head>
<body>
<a href="javascript:GenerateCart();">Aggiungi al carrello</a>
<br /><br />
<span id="cart" ></span>
</body>
</html>
Cliccando sul link "Aggiungi al carrello", si richiamerà la funzione GenerateCart() che caricherà il documento XML effettuando la trasformazione XSL e mettendo l'output risultante nel elemento con id cart. La funzione GenerateCart() (presente nell oscript incluso nella pagina HTML) è così composta:

function GenerateCart()
{
var xmlDoc = loadDocument("cart.xml");
var xslDoc = loadDocument("cart.xsl");
document.getElementById("cart").innerHTML = getTransformedHTML(xmlDoc, xslDoc);
}

Word replacing: servizio web e codice JS

Via Infowwweb (blog che mi pare molto attivo sebbene abbia appena iniziato, lo seguirò via google reader quando ho tempo...) scopro un servizio carino, Word Replacer, il quale permette la sostituzione di alcune parole di una pagina Web riproponendo infine il risultato finale con le sostituzioni, facendo il deep linking delle varie risorse web (immagini, css, js, ecc).

Diamo uno sguardo alla pagina di Google "pre Word Replacer":

Google_before

Ecco qui di seguito il form di Word Replacer che permette la sostituzione delle parole. Si noti che è possibile inserire entità HTML (come &egrave;) e alcuni tag HTML, precisamente quelli che non richiedono il corrispondente tag di poichè, ad uno sguardo veloce, mi è sembrato venisse eseguito l'escaping del carattere backslash di chiusura dei tag, quindi non credo ci siano minacce XSS.

Word Replacer_1219145262466

E infine il risultato finale (il quale viene mantenuto in cache dal servizio Web per non so quanto tempo a dire il vero, non viene detto nulla a riguardo). Non badate alla correttezza grammaticale della frase con quel "però" in fondo, che ho messo per vedere se riconosceva le entità HTML

Google_after

Altri modi per modificare una pagina

Se volessimo solamente apportare delle modifiche al design e al contenuto della pagina senza che questa sia attiva (ovvero non è possibile sottomettere form, cliccare sui link e via discorrendo), possiamo recarci sulla pagina da modificare e inserire nella barra degli indirizzi del browser i lseguente codice javascript:

javascript:document.body.contentEditable='true'; document.designMode='on'; void 0 

Il codice funziona con Firefox, non l'ho testatto su IE 7. Per averlo sempre a disposizione conviene trascinarlo nella barra dei segnalibri al di sotto della barra degli indirizzi.

Infine vi è GreaseMonkey, un'estensione per Firefox che consente attraverso del codice Javascript di modificare le pagine Web. Non ho alcuna esperienza nell'uso di questa estensione, potete consigliarmi buoni tutorial lasciando un commento, grazie :)

[CRM] Vulnerabilità XSS in vTiger 5.04-

Scorrendo il forum italiano dedicato a vTiger, incappo in un post che presenta delle vulnerabilità XSS per l'ultima versione (e non solo) di questo CRM. La prima riguarda la variabile parenttab, che si riferisce al modulo di riferimento per una sottosezione. Ad esempio Vendite > Opportunità ha come parenttab Vendite per l'appunto. Ecco un esempio di esecuzione di codice arbitraria:

http://www.sito.com/vtiger/index.php?module=Accounts&action=index&parenttab=Sales"<script>alert('ciao')</script>

L'altra falla di sciurezza riguarda l'autenticazione: mentre per il campo username caratteri particolari come le parentesi angolari, vengono convertiti nelle rispettive entità HTML, ciò non accade per il campo password. Esempio:

// da inserire nel campo password nella pagina di login
"<script>alert('ciao')</script>

L'ultima falla riguarda il mancato controllo sul valore che si può assegnare alla variabile query_string, che non ho ancora ben capito quando viene utilizzata. Ad ogni modo essendo una variabile presente in ogni header di qualsiasi tema di default per vTiger, qualsiasi pagina può utilizzare tale codice:

http://www.sito.com/vtiger/index.php?action=index&module=Home&query_string="<script>alert('ciao')</script>
Per risolvere tali falle, fare riferimento al post linkato per patchare il codice.

[Link] Raccolta di cheet sheet

Qui di seguito una raccolta di "bigini" online :)

Raccoglitori di cheet sheet e altro materiale

Ecco una lista di ottimi siti web che raccolgono liste di memorandum in formato PDF in merito a svariati argomenti:

"Where is bug": hacking and learning game

Segnalo un'iniziativa lanciata da NeCoSi:

NeCoSi di Geekplace.org, collaboratore di Oilproject.org e Shannon.it, ha sviluppato un giochino per mettere alla prova le vostre capacità “non convenzionali”.
Le prove da superare sono abbastanza varie, ed il tempo vola. Attenti a non trascorrere notti insonni…
Vi segnaliamo quindi molto volentieri Where is Bug e, già che ci siamo, vi proponiamo anche la presentazione/spot scritta dagli stessi autori del gioco:
Una gara contro voi stessi… una sfida contro il tempo… Chi arrivera’ primo? Chi riuscira’ a sopravvivere fino alla fine? Prepara lo snffer, il tuo editor preferito e carica i plugin che pensi possano servirti sul browser.
Ci saranno livelli di semplice reverse engineering, di steganografia, di sql-injection, di semplice spoofing, ed altro ancora.
Wib, il gioco che ti insegna a pensare come un hacker. Non fare il lamer, sfoga qui la tua voglia di bucare!
Una piattaforma per testare le proprie abilità. Non ci sono enigmi, solo bug da individuare e sfruttare.

Grazie per l'attenzione.

Buon gioco ;)

[javascript] Mostrare/Nascondere del testo

Nel breve tempo libero rimasto in questo finesettimana, ho deciso che le aree di appunti riguardanti Windows e Linux andavano risistemate.

Problema

Allo stato attuale, queste due aree vengono gestite come delle FAQ, in cui al click sul collegamento interno di una domanda si viene redirettati nella zona in cui risiede la risposta.

Ma con il tempo la pagina diventa caotica e l'ordine è presieduto solo dai collegamenti alle risposte, mentre il contenuto viene sbattutto nella pagina un poco alla volta.

Soluzione

La soluzione sta nel mostrare il testo di risposta ad una domanda immediatamente al di sotto della domanda stessa, permettendo di farlo apparire e di nasconderlo nuovamente al click del collegamento sulla domanda stessa.

Il codice:

 /* credits: http://www.webmasterworld.com/forum91/441.htm
* Mostra o nasconde una porzione di testo contenuta in tag DIV al click di un collegamento
* ipertestuale.
* E' sufficiente porre:

<div id="script" style="display: none">
....content...
<p><a onclick="showhide('script'); return(false);" href="#">Testo da cliccare</a></p>
*/
function showhide(id){
if (document.getElementById){
obj = document.getElementById(id);
if (obj.style.display == "none"){
obj.style.display = "";
} else {
obj.style.display = "none";
}
}
}

Come si può vedere il codice della risposta va messo all'interno di tag <div>, specificando come stile display: none per mantenerle nascoste fintanto che non si clicca sul collegamento della domanda.

Il collegamento della domanda specifica la funzione da attivare al click del mouse sul collegamento (trovate i dettagli e la fonte nei commenti nel codice qui sopra).

Per vedere in azione il codice, ecco una demo. Testato con successo sulle ultime versioni di Firefox, Opera e Internet Explorer in Windows.

[Javascript]Aggiungere ai favoriti una pagina

Ho cercato in lungo e in largo uno script cross browser per aggiungere una pagina tra i favoriti,ma la panacea di tutti mali non c'è. O almeno io non l'ho trovata.

Così notando che la finestrella dei segnalibri in Firefox e Opera si apre cliccando semplicemente su un link che abbia un attributo "rel" di valore "sidebar",ho reso ultrasemplice lo script che andrò a presentare.

EDIT: ho poi scoperto che un link siffatto in Firefox apre la pagina nella sidebar come intuitivamente si poteva pensare (questa discussione sembra indicare che addirittura non ci sia una funzione adeguata) ,per IE nessun problema mentre Opera mette un flag sull'apertura della pagina nella sidebar,che si può facilmente togliere.

Le fonti a cui mi sono ispirato (le migliori che sia riuscito a trovare) sono:

Lo script

Mettere un riferimento allo script sottostante nell'header della pagina:

// scegli tu titolo e URL
function bookmarksite(title,url){
if (window.sidebar) { // firefox
window.sidebar.addPanel(title, url, "");
} else if(document.all){ // ie
window.external.AddFavorite(url, title);
}
}

// usa quelli presenti
function bookmarksite(){
var title = document.title;
// Blogger - Replace with <$BlogItemTitle$>
// MovableType - Replace with <$MTEntryTitle$>

var url = document.URL;
// Blogger - Replace with <$BlogItemPermalinkURL$>
// MovableType - Replace with <$MTEntryPermalink$>
// WordPress - <?php bloginfo('url'); ?>
if (window.sidebar) {// firefox
window.sidebar.addPanel(title, url, "");
} else if(document.all) {// ie
window.external.AddFavorite(url, title);
}
}


Creare poi un link del genere:



<a href="#" title="Metti tra i preferiti questa pagina!" onclick="if(document.all) bookmarksite();" rel="sidebar">

In pratica richiamiamo la funzione bookmarksite solo se si tratta di Internet Explorer. Notare che ad ogni modo,la funzione bookmarksite() può funzionare anche per Firefox. Una DEMO qui.

A mio avviso è il metodo più semplice per ottenere ciò che vogliamo ottenendo compatibilità con i 3 maggiori browser (IE - Firefox - Opera). non ho potuto sperimentarlo su Safari (dove immagino non andrà). Se qualcuno volesse farmi sapere una funzione per adattarlo al Mac ne sarei felice :) Lasciate pure un commento qui sotto o scrivetemi una mail!

Script offuscati

In merito all'articolo di Mister6339 su Delfinsblog,volevo suggerire un tool online per fare l'unescape automatico di quegli script poco limpidi che capita di vedere per il Web,come questo presente in certi siti.
Basta recarsi su Text Unescape Utility,incollare il solo testo per cui si necessita l'unescape e cliccare su Unescape. Apparirà qualcosa di interessante:


a = 'abcdef';
b = '06acd3e61cd8465ce2';
c = '3c7363726970743e747061747a7a203d204d6174682e616273284d6174682e73696e284d6174682e636f73284d6174682e50492929293b3c2f7363726970743e0a';
h = f1(c);
d = d.toString().substring(2,15);
e = new Array();

for (i = 0; i<13; i++) {
e[i] = d.charAt(i);
}

f = 'è[&%.;]({{?!!èéòç°#ì[§]~`ù';
f = f2(f);
g = 'e23e528fb8df1cef618cb5e11c3a62868fe9143b7493cd74736df92c426facbed1e54a85a5d5cfed12315a95aa296075b8cffa366541a0d9081d5e8862a0b3ec294a8376c9f9648ebad6173c2c96c9d913456e5bc2f7103f68939091e4fd738ec1ee214c4a31';
g = f3(g);

function f4(var) {
yln32s = 0;
for(i = 0; i < 6; i++) {
qhlpq2z = a.substring(i, i+1);
if (var == (i + 10)) {
yln32s = qhlpq2z;
}
}
if (yln32s < 10) {
yln32s = "" + var;
}
return yln32s;
}

function f3(var) {
yln32s = 0;
for(i = 0; i < 6; i++) {
qhlpq2z = a.substring(i, i+1);
if (var == qhlpq2z) {
yln32s = 10 + i;
}
}
if (yln32s < 10) {
yln32s = eval(var);
}
return yln32s;
}

function f3(yln32s) {
temp2 = -1;
temp = 144693;
for (pj75fw = 0; pj75fw < yln32s.length; pj75fw = pj75fw + 2) {
temp2++;
if (temp2 > 12) {temp2 = 0;}
temp = temp + 43;
if (temp > 145716) {temp = 0;}
kjhluyu = (temp % (eval(e[temp2]) + 1));
kjhluyu = kjhluyu + (temp % 255);
z299zip = yln32s.substring(pj75fw, pj75fw + 2);
z299zip = f4(z299zip, temp2, kjhluyu);
z299zip = '%' + z299zip;
document.write(unescape(z299zip));

}
return 0;
}

function f4(var, ddb, ddc) {
var = var.toLowerCase();
var = f3(var.substring(0, 1)) * 16 + f3(var.substring(1, 2));
var = var - e[ddb] - ddc;
if (var < 0) {var = 255 + var;}
var = f4(Math.floor(var / 16)) + f4(var % 16);
return var;
}

function f2(m5dawy) {
m5dawy = escape(m5dawy);
return m5dawy;
}

function f1(b) {
for(i = 0; i < b.length; i = i + 2) {
tem = b.substring(i, i + 2);
tem = '%' + tem;
document.write(unescape(tem));
}
return 'eval("jrqb9yyz = escape(f)")';
}
Ma questo non basta a sapere cosa faccia questo script: di fatto la serie di funzioni richiamate all'interno di questo codice su alcune lunghe stringhe (ma non casuali) al suo inizio,effettuano ulteriori unescape che ora non ho il tempo di verificare.
Sembra evidente che ci sia dietro qualcosa di non proprio cristallino :-D

(X)HTML valido: attenti agli scripts javascript

Nel caso ci teniate a rendere valido il vostro codice (X)HTML,fate attenzione agli scripts javascript nelle pagine: senza le opportune cautele,le "&" ( e commerciali) verranno mal interpretate,cioè come l'inizio di entità. Per evitare errori,basta includere il codice degli script in blocchi CDATA come nell'esempio qui sotto:



Un po' di links

In questi giorni sono a Pisa quindi ,informaticamente parlando,non ho combinato molto,da qui la penuria di post :)
Ad ogni modo mi è capitato di scartabellare un po' i miei feed e dopo aver realizzato che tante volte sono più le notizie che cancello di quelle che realmente mi interessano,ho deciso di postare un po' di links che mi interessano e di rimuovere qualcuno dal blogroll. Uno di questi per es. è Napolux,poichè i tempi di attesa per post tecnici sono finiti. La rimozione del feed avverrà tra un mese esatto se non ci saranno post interessanti.

Links:

script.aculo.us 1.8

Ultimamente mi sto dedicando proprio a qusta libreria divertendomi con i suoi vari effetti grafici gradevoli. Il blog di Thomas Fuchs,autore della libreria,annuncia la nuova versione di scriptaculous con le seguenti features:

  • Prototype 1.6 (lastest trunk version)
  • Complete rewrite of Ajax.InPlaceEditor and Ajax.InPlaceCollectionEditor
  • Full CSS inheritance in Effect.Morph
  • New core effect: Effect.Tween
  • Sound: play mp3 files for sound effects; uses native playback on IE and available plugins whereever possible
  • Performance improvements
  • Tons of bugfixes
Insomma ha corretto errori,introdotto nuovi effetti,capacità di eseguire effetti sonori. Bene bene :)

Il wiki di Scriptaculous in PDF

m3nt0r ha trasformato il wiki di Scriptaculous in PDF e CHM. Pian piano tra libri e quant'altro sto costruendo anch'io la mia libreria di esempi.

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger