1103 lines
22 KiB
HTML
1103 lines
22 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en-us">
|
|
|
|
<head>
|
|
<link href="http://gmpg.org/xfn/11" rel="profile">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
|
|
|
<!-- Enable responsiveness on mobile devices-->
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
|
|
|
|
<title>
|
|
|
|
Capire il Machine Learning (parte 1) · Caught in the Net
|
|
|
|
</title>
|
|
|
|
<!-- CSS -->
|
|
<link rel="stylesheet" href="/public/css/poole.css">
|
|
<link rel="stylesheet" href="/public/css/syntax.css">
|
|
<link rel="stylesheet" href="/public/css/hyde.css">
|
|
|
|
<!-- Icons -->
|
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/public/apple-touch-icon-144-precomposed.png">
|
|
<link rel="shortcut icon" href="/public/favicon.ico">
|
|
|
|
<!-- RSS -->
|
|
<link rel="alternate" type="application/rss+xml" title="RSS" href="/atom.xml">
|
|
</head>
|
|
|
|
|
|
<body class="theme-base-09">
|
|
|
|
<div class="sidebar">
|
|
<div class="container sidebar-sticky">
|
|
<div class="sidebar-about">
|
|
<h1>
|
|
<a href="/">
|
|
Caught in the Net
|
|
</a>
|
|
</h1>
|
|
<p class="lead"></p>
|
|
</div>
|
|
|
|
<nav class="sidebar-nav">
|
|
<a class="sidebar-nav-item" href="/">Home</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/about/">About</a>
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/archive/">Archive</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/contattami/">Contact me</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/feed.xml">RSS</a>
|
|
<a class="sidebar-nav-item" href="http://francescomecca.eu:3000/explore/repos">Personal Git</a>
|
|
<span class="sidebar-nav-item" href="" >Powered by Jekyll and Hyde</span>
|
|
</nav>
|
|
|
|
<p>© 2016. CC BY-SA 4.0 International </p>
|
|
</div>
|
|
</div>
|
|
|
|
<h3 class="masthead-title">
|
|
<a href="/" title="Home">Caught in the Net</a>
|
|
|
|
|
|
</h3>
|
|
|
|
<div class="content container">
|
|
<div class="post">
|
|
<h1 class="post-title">Capire il Machine Learning (parte 1)</h1>
|
|
<span class="post-date">10 Nov 2016</span>
|
|
<p>Questo è il primo di una serie di post che hanno l'obbiettivo di fornire una breve e generale introduzione al mondo del machine learning e delle intelligenze artificiali piú in generale.
|
|
Mi auguro che questa breve introduzione al mondo dell'apprendimento automatico sia una sorta di vaccino contro il sensazionalismo mediatico e la disinformazione che negli ultimi anni fanno da contorno al progresso in questo settore.</p>
|
|
|
|
<h2 id="non-c-39-risultato-senza-algoritmo">Non c'è risultato senza algoritmo</h2>
|
|
|
|
<p>Nelle scienze informatiche un algoritmo è un insieme di istruzioni che partendo da uno stato iniziale (input) permette di arrivare ad uno stato finale (output) attraverso una serie di step logici.
|
|
Ogni algoritmo utilizza una logica propria e specifica per il problema di cui si occupa.
|
|
Nel caso del machine learning l'algoritmo non viene progettato in base al tipo di problema bensí vengono utilizzati algoritmi generici adattabili attraverso dei parametri.
|
|
L'algoritmo di machine learning analizza i vari parametri e i dati che riceve "in pasto" al fine di raggiungere lo stato di output ottimale.
|
|
L'output ottimale è la migliore approssimazione di un risultato teorico che si raggiunge nella fase di "training".</p>
|
|
|
|
<h2 id="la-macchina-impara">La macchina impara</h2>
|
|
|
|
<p>Nella fase di allenamento o di apprendimento, il "training", si possono adottare due tecniche differenti: apprendimento con supervisione ( <strong>supervised learning</strong> ) e apprendimento senza supervisione ( <strong>unsupervised learning</strong> ).</p>
|
|
|
|
<h4 id="supervised-learning">Supervised Learning</h4>
|
|
|
|
<p>Immaginiamo di dover valutare il prezzo di un'automobile usata senza essere esperti in materia.
|
|
Noi abbiamo questi dati:</p>
|
|
|
|
<table><thead>
|
|
<tr>
|
|
<th>PREZZO ORIGINALE</th>
|
|
<th style="text-align: center">Km percorsi</th>
|
|
<th style="text-align: center">stato di usura</th>
|
|
<th style="text-align: right">PREZZO FINALE</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>50 000</td>
|
|
<td style="text-align: center">120 000</td>
|
|
<td style="text-align: center">lieve</td>
|
|
<td style="text-align: right">40 000</td>
|
|
</tr>
|
|
<tr>
|
|
<td>30 000</td>
|
|
<td style="text-align: center">150 000</td>
|
|
<td style="text-align: center">notevole</td>
|
|
<td style="text-align: right">8 000</td>
|
|
</tr>
|
|
<tr>
|
|
<td>20 000</td>
|
|
<td style="text-align: center">80 000</td>
|
|
<td style="text-align: center">lieve</td>
|
|
<td style="text-align: right">15 000</td>
|
|
</tr>
|
|
<tr>
|
|
<td>20 000</td>
|
|
<td style="text-align: center">120 000</td>
|
|
<td style="text-align: center">notevole</td>
|
|
<td style="text-align: right">...</td>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
<p>Dalla tabella possiamo dedurre la caratteristica fondamentale del <strong>supervised learning</strong>: abbiamo due vettori (serie di dati) di input (prezzo originale) e di output (prezzo finale) che hanno una correlazione certa e valida.</p>
|
|
|
|
<p>Possiamo dedurre intuitivamente quale sarà il prezzo dell'ultima auto se analizziamo i dati precedenti.
|
|
Questo è quello che succede nel caso del <strong>supervised learning</strong>.
|
|
Un algoritmo di machine learning che utilizza il <strong>supervised learning</strong> estrapolerà la relazione fra i vari dati e in questo modo potrà ottenere un determinato output partendo dai dati di input.
|
|
Possiamo capire già da ora che nel caso ci fossero dati che "inquinano" il nostro data set, come ad esempio il colore dell'auto, l'algoritmo non sarà capace di fare un'analisi corretta.</p>
|
|
|
|
<p>La precisione della soluzione dipende dalla quantità di dati e dall'influenza che questi hanno nella situazione reale.</p>
|
|
|
|
<h1 id="unsupervised-learning">Unsupervised Learning</h1>
|
|
|
|
<p>Nel caso di unsupervised learning ci troviamo di fronte agli stessi dati ma senza la possibilità di conoscere il prezzo finale.</p>
|
|
|
|
<table><thead>
|
|
<tr>
|
|
<th>PREZZO ORIGINALE</th>
|
|
<th style="text-align: center">Km percorsi</th>
|
|
<th style="text-align: right">stato di usura</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>50 000</td>
|
|
<td style="text-align: center">120 000</td>
|
|
<td style="text-align: right">lieve</td>
|
|
</tr>
|
|
<tr>
|
|
<td>30 000</td>
|
|
<td style="text-align: center">150 000</td>
|
|
<td style="text-align: right">notevole</td>
|
|
</tr>
|
|
<tr>
|
|
<td>20 000</td>
|
|
<td style="text-align: center">80 000</td>
|
|
<td style="text-align: right">lieve</td>
|
|
</tr>
|
|
<tr>
|
|
<td>20 000</td>
|
|
<td style="text-align: center">120 000</td>
|
|
<td style="text-align: right">notevole</td>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
<p>Non siamo capaci di stabilire il prezzo finale attraverso l'unsupervised learning, ma possiamo stabilire dei pattern fra i vari dati.
|
|
Non c'è nessun tipo di feedback (il prezzo finale) che possa aiutarci a capire se il risultato sia giusto ma possiamo analizzare le notevoli relazioni fra i dati.</p>
|
|
|
|
<h1 id="machine-learning-e-intelligenza">Machine Learning e intelligenza</h1>
|
|
|
|
<p>Concentriamoci sul <strong>supervised learning</strong>.
|
|
Nel caso della vendita dell'automobile, abbiamo un semplice problema con una soluzione lineare di questo tipo:
|
|
<em>prezzo finale</em> = <em>prezzo originale</em> + <em>km percorsi</em> + stato di usura</p>
|
|
|
|
<p>Ovviamente ogni incognita nella nostra equazione influisce diversamente sul prezzo finale e quindi possiamo riscriverla come:
|
|
<em>prezzo finale</em> = A *<em>prezzo originale</em> + B *<em>km percorsi</em> + C * stato di usura</p>
|
|
|
|
<p>Se pensiamo ad un algoritmo possiamo ragionare in questo modo:</p>
|
|
<div class="highlight"><pre><code class="language-" data-lang="">funzione: calcola_prezzo_auto:
|
|
parametri: prezzo_originale, km_percorsi, stato_usura
|
|
variabili: prezzo_finale = 0
|
|
|
|
prezzo finale = prezzo_originale * 0.804246
|
|
prezzo finale = prezzo_finale + km_percorsi * -0.000125
|
|
prezzo finale = prezzo_finale + stato_usura * -2500
|
|
|
|
</code></pre></div>
|
|
<p>I valori di quelle costanti, stabilite casualmente nell'esempio, sono chiamate <em>pesi</em> e servono a stimare il prezzo finale.
|
|
Una volta stabiliti i pesi, il nostro algoritmo di supervised learning applica questi pesi ai dati originali e ne valuta l'errore:</p>
|
|
|
|
<table><thead>
|
|
<tr>
|
|
<th>PREZZO ORIGINALE</th>
|
|
<th style="text-align: center">Km percorsi</th>
|
|
<th style="text-align: center">stato di usura</th>
|
|
<th style="text-align: center">PREZZO FINALE</th>
|
|
<th style="text-align: right">PREZZO STIMATO</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>50 000</td>
|
|
<td style="text-align: center">120 000</td>
|
|
<td style="text-align: center">lieve</td>
|
|
<td style="text-align: center">40 000</td>
|
|
<td style="text-align: right">374888</td>
|
|
</tr>
|
|
<tr>
|
|
<td>30 000</td>
|
|
<td style="text-align: center">150 000</td>
|
|
<td style="text-align: center">notevole</td>
|
|
<td style="text-align: center">8 000</td>
|
|
<td style="text-align: right">16000</td>
|
|
</tr>
|
|
<tr>
|
|
<td>20 000</td>
|
|
<td style="text-align: center">80 000</td>
|
|
<td style="text-align: center">lieve</td>
|
|
<td style="text-align: center">15 000</td>
|
|
<td style="text-align: right">13492</td>
|
|
</tr>
|
|
<tr>
|
|
<td>20 000</td>
|
|
<td style="text-align: center">120 000</td>
|
|
<td style="text-align: center">notevole</td>
|
|
<td style="text-align: center">...</td>
|
|
<td style="text-align: right">10988</td>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
<p>Una volta valutato l'errore e la distanza dal prezzo finale, l'algoritmo di machine learning modifica i pesi di conseguenza e ripete la procedura fino ad arrivare al risultato che piú si avvicina ai dati iniziali.
|
|
<img src="/wp-content/uploads/2016/reteneurale1.jpg" alt="rete1">
|
|
Ci sono varie funzioni che stimano l'errore e permettono di correggere i pesi o metodi che restringono lo spazio di ricerca fino a convergere alla soluzione, ovvero i pesi cercati.</p>
|
|
|
|
<h2 id="reti-neurali">Reti Neurali</h2>
|
|
|
|
<p>Ora, come possiamo immaginare, il prezzo di un'auto ha molti fattori che si aggiungono a quelli elencati nell'esempio.
|
|
Non solo, ma molti problemi non hanno una soluzione lineare, ovvero una soluzione che si puó semplicemente esprimere attraverso una funzione che aggiunge e moltiplica i valori una sola volta.</p>
|
|
|
|
<p>Possiamo arricchire l'esempio dell'automobile immaginando di avere più set di pesi e di ripetere il procedimento più volte:</p>
|
|
<div class="highlight"><pre><code class="language-" data-lang="">|---------------------------------------------------|
|
|
| PREZZO_ORIG * peso A1 -----> |
|
|
| KM_PERCORSI * peso B1 -----> |
|
|
| STATO_USURA * peso C1 -----> |
|
|
| PREZZO FINALE STIMATO 1|
|
|
|---------------------------------------------------|
|
|
|
|
| --------------------------------------------------|
|
|
| PREZZO_ORIG * peso A2 -----> |
|
|
| KM_PERCORSI * peso B2 -----> |
|
|
| STATO_USURA * peso C2 -----> |
|
|
| PREZZO FINALE STIMATO 2|
|
|
|---------------------------------------------------|
|
|
|
|
| --------------------------------------------------|
|
|
| PREZZO_ORIG * peso A3 -----> |
|
|
| KM_PERCORSI * peso B3 -----> |
|
|
| STATO_USURA * peso C3 -----> |
|
|
| PREZZO FINALE STIMATO 3|
|
|
|---------------------------------------------------|
|
|
</code></pre></div>
|
|
<p>E ora immaginiamo di combinare ogni PREZZO FINALE STIMATO in un'ultimo risultato:</p>
|
|
<div class="highlight"><pre><code class="language-" data-lang="">| --------------------------------------------------|
|
|
| PREZZO_1 * peso X -----> |
|
|
| PREZZO_2 * peso Y -----> |
|
|
| PREZZO_3 * peso Z -----> |
|
|
| PREZZO FINALE DEF |
|
|
|---------------------------------------------------|
|
|
|
|
</code></pre></div>
|
|
<p>Questa é, seppur molto basica, una rete neurale.
|
|
Proviamo a visualizzarla in un'immagine dove i box arancioni sono i nodi di input e i rossi sono i nodi "nascosti" e temporanei.</p>
|
|
|
|
<p><img src="/wp-content/uploads/2016/reteneurale2.jpg" alt="rete2"></p>
|
|
|
|
<p>In una rete neurale (<em>neural networks</em>) abbiamo:</p>
|
|
|
|
<ul>
|
|
<li><p>i neuroni: la funzione di stima e i set di pesi;</p></li>
|
|
<li><p>le catene: i collegamenti fra neuroni che permettono di valutare il prezzo più volte.</p></li>
|
|
</ul>
|
|
|
|
<p>Nel prossimo <a href="/pescewanda/2016/11/11/machine-learning-PARTE2">post</a> cercherò di approfondire il concetto di rete neurale con degli esempi di applicazioni concrete.</p>
|
|
|
|
</div>
|
|
|
|
<!--<div class="related">-->
|
|
<!--<related-posts />-->
|
|
<!--<h2>Related Posts</h2>-->
|
|
<!--<ul class="related-posts">-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/11/11/machine-learning-PARTE2/">-->
|
|
<!--Capire il Machine Learning (parte 2)-->
|
|
<!--<small>11 Nov 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/07/07/pres-berk/">-->
|
|
<!--A short talk about cryptography at the Berkman Klein Center-->
|
|
<!--<small>07 Jul 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/07/06/IM-services/">-->
|
|
<!--Phone messaging apps comparison-->
|
|
<!--<small>06 Jul 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/07/05/arduino_keyboard/">-->
|
|
<!--Arduino Uno as HID keyboard-->
|
|
<!--<small>05 Jul 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/05/16/lifehacks2/">-->
|
|
<!--Lifehacks (2)-->
|
|
<!--<small>16 May 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--</ul>-->
|
|
<!--</div>-->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h4>Similar Posts</h4>
|
|
<ul>
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/11/11/machine-learning-PARTE2/">Capire il Machine Learning (parte 2)
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/07/05/arduino_keyboard/">Arduino Uno as HID keyboard
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/05/15/genetic-alg/">Interpolation using a genetic algorithm
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/04/17/kpd-player/">Kyuss Music Player
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
</div>
|
|
<!--<link rel="alternate" type="application/rss+xml" title="Francesco Mecca RSS" href="/feed.xml">-->
|
|
|
|
</body>
|
|
</html>
|