Home    About me    Publications    Blog    Undergrad memories

Fabio Ruini's blog

'cause Italians blog better

Archivio per dicembre, 2007

La zappa sui piedi

DISCLAIMER: ciò che segue rappresenta l’equivalente pokeristico del famoso detto, proveniente dalla cultura popolare, “darsi la zappa sui piedi”.

Pocket jacks

Serata poker al Rileys. Quattordici partecipanti, solito freeze-out con buy-in di £10+1 e solita struttura dei premi, con rimborso della spesa (meno il rake) al terzo classificato e discreta vincita per i primi due classificati.

Io inizio a giocare tranquillo e discretamente conservativo. Le carte girano abbastanza bene e qualsiasi cosa mi capiti per le mani la gioco come da manuale. Davvero una serata di gran bel poker (peccato che i villani al tavolo con me non siano in grado di rendersene conto, ma va beh…). Arrivo al primo break, dopo un’ora di gioco, avendo quasi raddoppiato le mie chips di partenza. Tutto questo senza neppure un all-in, nè lanciato nè tantomeno chiamato. Al rientro dopo il break, gioco bene un altro paio di mani e mi ritrovo ad essere saldamente il chip leader del tavolo. Con l’aumentare dei buii crescono parallelamente anche le defezioni, ma io rimango ben saldo nella mia posizione. Si arriva al tavolo finale e mi ritrovo ad avere il secondo stack complessivo. Dopo qualche mano, faccio la prima giocata un po’ azzardata della serata. Dal bottone, chiamo un piccolo rilancio di tre volte il BB con in mano un pessimo A4 offsuit. Siamo a giocare in tre, dato che anche il grande buio (nonchè il chip leader), chiama. Il flop è A22. Non male, ma si tratta di vedere dov’è la mia mano in relazione a quella degli altri. Il chip leader fa check, imitato da colui che aveva fatto l’apertura pre-flop. Tocca a me, che mi diletto in una sorta di continuation bet, puntando circa metà del piatto. Il grande buio chiama, l’altro folda. La mia domanda: “c’è qualche asso in giro?” è rimasta senza risposta. Il turn è un’altra carta bassa. Il mio avversario fa check ed io vado con un’altra chiamata informativa. Punto ancora la metà circa del piatto, forse qualcosa di meno. Fatto sta che sono ancora chiamato. Cazzo. Inizio a credere che abbia un asso anche lui e che lo stia giocando piano. E se lo ha, di sicuro è migliore del mio. Il river è un 8, del tutto innocuo. Ancora check da parte sua, mentre io, avendo drammaticamente realizzato in ritardo di essere pot-committed, butto nel piatto anche le ultime fiches rimaste nel tentativo di farlo foldare, convincendolo che ho un kicker migliore del suo (da notare anche la sottigliezza della mia mossa: metto le fiches lentamente nel piatto, senza chiamare l’all-in, che prontamente segnala un giocatore accanto a me…). Lui chiama di nuovo. Io sto già alzandomi per andare a casa, quando lui gira QK. E io divento, seppur di poco, il chip leader del tavolo finale (ma dopo quest’altra sudata fredda non giocherò mai più un bad ace per un bel po’ di tempo).

Passano ancora un po’ di mani e rimaniamo soltanto in 6, tra cui un paio di giocatori con ben più di un piede nella fossa. A questo punto capita che io sia under the gun e mi ritrovi serviti pocket jacks. La mano è problematica per definizione. Decido di fare la mia giocata classica, nonostante la posizione sfavorevole: una puntata stronca-avversari. Sparo sul piatto 4000 delle mie 11000 chips, con i buii che erano a 400/800. In sostanza, per non avere problemi di sorta mi va benissimo limitarmi a rubare i buii. Il tizio di prima mi rilancia all-in. Tutti foldano. Sta di nuovo a me. Escludo che stia bluffando, dato che con la mano che ho raccontato prima si deve essere convinto che almeno un minimo di valore le mie puntate ce l’hanno. Di sicuro ha qualcosa anche lui. Una coppia o un paio di carte molto alte, come AK o AQ. Però perchè all-in? Evidentemente non si sente imbattibile e vuole che io foldi. Ma, purtroppo per lui (o meglio, per me), non sono un giocatore che si accontenta di arrivare in zona premio. Io sono contento quando vinco spaccando in due il tavolo e leggendo la paura negli occhi di tutti quelli che sono seduti lì intorno a me. I 10 pounds di buy-in li spendo volentieri per farmi una bella serata di poker: se poi metto in tasca qualcosina, tanto meglio, ma non è quello l’obiettivo. Detto ciò, i miei pocket jacks sono una mano più che dignitosa per tentare il colpo del KO. Chiamo il suo all-in e scopro i miei jacks. Lui scopre le sue due donne, che resistono fino alla fine. E’ andata male…

Share

Qt Graphics View Framework: usare le OpenGL per il rendering

Le OpenGL non hanno un gran bisogno di presentazioni. Si tratta molto semplicemente delle API più utilizzate per la grafica bi e tridimensionale.

OpenGL Logo

Con le Qt4, nell’ambito del Graphics View Framework, è possibile appoggiarsi con estrema facilità alle OpenGL per ottimizzare il rendering dei propri oggetti grafici. Il procedimento è semplicissimo. Su Mac, utilizzando qmake ed XCode, è necessario innanzitutto creare un file progetto (qmake -project) e quindi modificarlo aggiungendo la riga:

QT += opengl

Dopodichè, creando il progetto XCode tramite la procedura standard (qmake -spec macx-xcode nomefile.pro), si troveranno già linkati tre nuovi framework:

  • QtOpenGL.framework
  • OpenGL.framework
  • AGL.framework

A questo punto utilizzare il renderizzatore OpenGL è semplicissimo. E’ sufficiente infatti includere QGLWidget nel file dove definiamo la nostra QGraphicsView:

#include < QGLWidget >

e quindi richiamare la funzione setViewport() nella maniera che segue:

graphView_object_name->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

Tutto qua. L’impressione che ho immediatamente avuto dopo aver eseguito questo processo è che la simulazione girasse più svelta. Per capire se si trattasse soltanto di una mia allucinazione o se invece ci fosse un fondo di verità, ho deciso di fare un piccolo test, mettendo a confronto due versioni della stessa simulazione che sfruttavano rispettivamente il renderizzatore delle Qt e quello delle OpenGL.

I risultati ottenuti (evoluzione di 50 generazioni, singolo seed) parlano chiaro:

  • renderizzatore standard Qt: 7 minuti e 37 secondi;
  • renderizzatore openGL: 6 minuti e 25 secondi

Con il renderizzatore OpenGL attivato, in buona sostanza, la mia simulazione ha impiegato il 16% del tempo in meno per essere portata a termine. Il che è un ottimo risultato. Punto.

Share

(L)ODE a te

ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.

Logo ODE (Open Dynamics Engine)

Oggi ho scoperto che sarà con ogni probabilità ODE, acronimo di Open Dynamics Engine, il software che mi accompagnerà lungo la mia tesi di PhD. Più precisamente, lo farà a partire da quando la mia simulazione dovrà diventare tridimensionale e dovrà avere a che fare con le dure leggi fisiche del mondo reale. Per ovvi motivi non posso perdere troppo tempo studiandomi ODE adesso, ma un’occhiata veloce ce l’ho data più che volentieri. E devo dire che sembra decisamente interessante.

Se volete un esempio di quello che si può fare con questo engine, date un’occhiata al filmato qui sotto. Si tratta della replica di uno dei robottini che stanno attualmente girando su Marte nell’ambito dela missione MER, e che viene fatto navigare all’interno di un ambiente simile a quello vero. Da notare il ribaltamento finale del veicolo. E da sottolineare soprattutto il fatto che l’autore del filmato in questione è un ragazzo che studia qui come undergraduate.

Share

… e Giannino si sposa, e Giannino si sposa!

Comunità italica in festa, oggi, in quel di Plymouth. La “Pizza-connection” ha infatti chiamato una mobilitazione di massa per salutare il buon Giannino, che domani se ne ritorna in patria per gli ultimi giorni di scapola libertà della sua vita. Il prossimo sabato, infatti, in un qualche sperduto posto del Piemonte, converrà a giuste nozze con la sua bella. E farà ritorno a Plymouth, immogliettato e depresso (oltre che presumibilmente calvo e ingrassato), soltanto il prossimo gennaio.

Wedding - international logo

Un salutino un po’ organizzato era quantomeno d’obbligo. Ma noi abbiamo fatto di più. Abbiamo organizzato una fantastica sushata. In realtà mi sto prendendo i meriti del pranzo, quando tutto quello che ho fatto è stato accompagnare gli chef (veri) da Tesco e pulire/tagliare i gamberoni. Oltre che ammazzarmi di vino bianco, con qualche decina di minuti di anticipo rispetto a quando il primo pezzettino di sushi sarebbe stato pronto. Ma l’importante è il pensiero, no?

Proprio per questo motivo, da parte di tutta la pizza/sushi connection, auguroni Gianni!!!

Certo è che l’alcool in corpo non si abbina particolarmente bene al poker. Scappato di corsa dal pranzo per andarmi a sedere al tavolo verde (solito torneo settimanale della UPSU), ho chiuso con un misero 52esimo posto. Sto ancora ripensando alla mano che ha rovinato la mia partita e questa volta non riesco a dare una risposta alla classica questione del dopo-sconfitta: sono stato un coglione o ho giocato bene?

La situazione. Buii a 100/200, 8 persone al tavolo che è decisamente tight. Gli stack sono tutti più o meno simili, compresi tra 1500 e 2000, a parte un giocatore fortemente short-stacked ed uno ben al di sopra della media (nonchè abbastanza loose) di small-blind. Io sto giocando, uniformemente al tavolo, in maniera abbastanza tight. Ho perso una mano in apertura, check-raisato da un avversario su una mia continuation bet, ma ne ho vinta una poco dopo con un bluff stupendo (anche se veramente da pazzi) che ha spedito a casa qualcosa come 4 avversari su un board con 9, K, A (ed io, giusto per la cronaca, ero lì con Q5). Il bluff l’ho mostrato. Forse è stato un errore, ma era davvero stato troppo bello. Fatto sta che, dopo poco più di una decina di mani dal fattaccio, mi trovo UTG con una coppia di 8. Sono indeciso, perchè non so davvero cosa fare. Di solito, con una middle pair, rilancio forte cercando di aggiudicarmi il piatto subito. Decido di farlo anche questa volta, nonostante sia il primo a parlare, buttando sul piatto 600: un ammontare che, per come si stava sviluppando il gioco, ero sicuro avrebbe spaventato il tavolo. Come previsto, tutti foldano, a parte però il big blind, che raisa all-in, con circa 500 chips meno di me. Per tutta una serie di motivi, sono convinto che lui non abbia una gran punto. Ha recentemente perso alcune brutte mani e mi sembra decisamente in tilt, oltre che fermamente convinto del fatto che io sia un imperterrito bluffatore. Fatto sta che decido di chiamarlo. In effetti sono in vantaggio: coppia di 8 contro A10 offsuit. Decisamente due brutte carte, le sue, per andare all-in.

88 vs A10 (correct)

Fatto sta che al flop esce immediatamente un 10, e la situazione si ribalta a favore del mio avversario. Le rimanenti carte non portano con sè nessun 8, ma soltanto una flebile speranza di colore (tre carte di cuori in tavola tra flop e turn, più quella che ho in mano io), stroncata dalla brutalità con cui viene girato il river. Io mi ritrovo con poche fiches e devo oltretutto passare immediatamente per le forche caudine dei buii. Cerco la mano per l’all-in della disperazione, che chiamo con Q10 suited, ma che perdo contro QA. E me ne torno a casa. Dove ancora questo dubbio mi assilla. L’ho giocata bene o no quella coppia di 8?

Share

A quarter of century ago

Attacco di nostalgia pura, leggendo l’articolo comparso oggi sul sito del Corriere. E’ dura da accettare, ma bisogna farsene una ragione. Sono passati qualcosa come 25 anni (tanti quanti sono trascorsi dal mio venire al mondo ad oggi) dall’immissione sul mercato dello storico Commodore 64.

Commodore 64

Per ovvi motivi anagrafici, l’epoca del C64 l’ho attraversata soltanto di striscio. Giochicchiandoci ogni tanto a casa di amici e senza capire cosa diavolo c’entrasse un mangianastri con un computer. Ma rimane una macchina che ha segnato un’epoca, nonchè, a tutt’oggi, il personal computer più venduto della storia. Un record destinato a rimanere tale, dato che non mi sembra proprio si intravedano all’orizzonte computer in grado di rimanere sulla scrivania di qualcuno, se non come oggetti di antiquariato, per più di dieci anni.

PS: nel caso vi venisse voglia di emulare lo storico computer con la C sul vostro Mac, allora un buon punto di partenza è questo.

Share

Christmas pudding

Premessa: il sottoscritto ricade alla perfezione in quella categoria cosiddetta delle “bocche buone”. Già cultore delle “abbuffate di/da maiale” (marchio registrato) quando si trovava in patria, dal momento in cui è approdato in quel di Plymouth la sua capacità di ingurgitare qualunque cosa, partendo dal can-microwave-food fino ad arrivare a porzioni di fish & chips che voi umani non potreste immaginarvi, è divenuta quasi leggendaria. Trattasi sicuramente, a tutt’oggi, di uno dei suoi più riconosciuti tratti distintivi.

Ebbene, oggi anche lui si è dovuto arrendere ed ha dovuto ammettere la propria inferiorità di fronte ad una pietanza. Pietanza, perchè chiamarlo piatto sarebbe francamente eccessivo. Dalla triste esperienza odierna fuoriesce soltanto un consiglio, da tramandare ai posteri a imperitura memoria. Mai, bambini, mai. Non fate mai l’errore di provare il Christmas Pudding della tradizione inglese.

Christmas pudding

PS: luogo del crimine, il Gog and Magog al Barbican. Dove questa mattina, a partire da mezzogiorno in punto, si è consumato (lo so che è il 7 dicembre oggi, lo so), il pranzo di Natale della Postgraduate Society. Devo ammettere che il resto delle portate (antipasto di pesce e piattone con tacchino, patate, piselli, un affare tipo ciambella che non sono riuscito a decifrare e altre amenità) non erano male. Ma questo pudding, mamma mia…

Share

Leopard, XCode e la visibility (questa sconosciuta)

La settimana scorsa ho aggiornato il mio Mac a Leopard. Avrei voluto dedicarci un post, ma alla fine, tra una cosa e l’altra, non l’ho fatto. Contrariamente a quanto hanno detto la maggior parte dei recensori, non ho visto tutta questa differenza tra Tiger e Leopard. Certo, le novità balzano all’occhio e non sono per niente male. Su tutte Quicklook (ottimo, soprattutto con l’aggiunta di plugin di terze parti per visualizzare un più ampio spettro di files), Time Machine (ora, davvero, ci si può dimenticare di qualsiasi software di backup e sentirsi sempre ragionevolmente al sicuro) e Spaces (che non è un’innovazione e lo sappiamo, ma è stato implementato davvero molto molto bene). La restante miriade di modifiche di più basso livello aggiunge molte nuova funzionalità talvolta utili, talvolta no. Per ovvi motivi, non posso invece analizzare le modifiche di bassissimo livello apportate al codice. Quello che posso dire è che l’OS mangia un po’ più RAM rispetto a prima, è più lento nel boot, ma come reattività rimane ottimo. A mio avviso, nel complesso Leopard va considerato come un aggiornamento, un buon aggiornamento di Tiger. Non come un prodotto rivoluzionario. Detto questo, probabilmente vale tutti i soldi dell’acquisto.

L’installazione di Leopard ha portato con sè l’aggiornamento del mio amato XCode alla versione 3.0. E’ stata ovviamente la prima applicazione che ho testato e, seppur con qualche problemino iniziale, ha preso a funzionare regolarmente nel giro di pochi minuti. Quelli necessari per reinstallare ex-novo le Qt e provare a ricompilare il simulatore sul quale sto lavorando.

XCode 3.0 icon

Unico problemino, in fase di compilazione ottengo qualcosa come 1700 warning. Millesettecento, avete letto bene. Tutti legati a presunti problemi di “visibilità”. Ho indagato un po’ la questione, trovando questo capitolo contenuto all’interno della C++ Runtime Environment Programming Guide. Al quale darò al più presto un’occhiata.

In chiusura, giusto per restare in campo informatico, una nota a margine riguardo alle succitate Qt. Vi siete mai chiesti come fare per inserire il valore di una variabile all’interno di un campo di testo (che sia una finestra di dialogo o altro)? Semplice, si ricorre alla programmazione nel buon vecchio C-style. La sintassi da utilizzarsi (in realtà, credo una delle tante) è infatti:

tr( “Cannot open %1″ ).arg( fileName)

Che storia, eh?

Share

Vendetta doveva essere…

… e vendetta fu. Anche se non completa (quarto classificato), la performance di ieri sera al Rileys mi ha lasciato decisamente soddisfatto.

Poker software

Questa volta i partecipanti sono sedici, suddivisi su due tavoli. Solito buy-in di £10+1, per un montepremi che inizia ad essere interessante: a premio i primi 3 classificati, rispettivamente con £90, £50 e £20.

Il sottoscritto, dopo la deludentissima performance dello scorso mercoledì, si chiude a riccio. Sono insolitamente tranquillo (complici forse le due pinte di birra scolate a stomaco pressochè vuoto) e decido di giocare tight. Durante i primi due giri del tavolo entro in gioco solo una volta, di big blind, con jack e 8 offsuit. Il flop è favorevole, con due sette e un jack. C’è il rischio del tris, ma è poco plausibile. Più probabile che contro di me (due avversari) ci sia qualcuno con il jack e un kicker più alto del mio pessimo otto. Sono fuori posizione, quindi dopo il flop punto qualcosina giusto per evitare che siano gli altri a farlo. L’avversaria alla mia sinistra (quella pesciolona maledetta che la volta scorsa mi aveva spedito a casa chiamando il mio spropositato raise after-flop con quattro quinti di scala ad incastro) folda, mentre vengo chiamato dall’altro giocatore. Carta bassa al turn e solito ritornello: piccola puntata mia e pronta chiamata. Al river altra carta bassa. Faccio check, imitato dal mio avversario. Che gira AJ e porta a casa, come previsto, il piatto. Poco male, era preventivabile. Meno l’intervento del giocatore alla mia destra, che guarda con sufficienza le mie fiches e mi dice qualcosa tipo “oh però! Stasera stai andando un sacco meglio rispetto all’altra volta!”. Sorrido, ma metto sul conto e aspetto la situazione buona per fargli rimangiare quanto detto. Che arriva poco dopo. Io di grande buio e lui di piccolo, fortemente short-stacked. Tutti foldano, lui limpa dentro, io rilancio e lui chiama ancora. Non ho assolutamente nulla in mano. Lui fa una puntata di rito al flop e io, guardando con disprezzo lui e le sue fiches, conticchiandole con sufficienza, gli sorrido e gli sparo un bel “your all-in, please”. Lui folda e io gli sventolo sotto il naso la mia mano vergognosa, ridendo fragorosamente. Non mi parlerà più per tutta la serata, ma vuoi mettere la soddisfazione?

Per il resto, io continuo a giocare tight, vedendo vari pescioloni uscire dal gioco. Il livello medio dei partecipanti è veramente triste. Gente incazzata come bestie perchè ha perso con AJ off-suit e non riesce a farsene una ragione. Un’altra casalinga disperata (sempre quella della volta scorsa), che si volta per dire alla sua amica di fare attenzione perchè un tizio al nostro tavolo ha fatto check dopo aver completato il full al turn. E tutti a farmi i complimenti dopo che ho chiamato l’all-in di un China (un tipo strano, sulla sessantina, con tanto di cappello da babbo natale in testa…) con AQ suited (per la cronaca, vinto contro la sua coppia di re grazie a due assi usciti nel flop). Non dovete farmi i complimenti, ho fatto una chiamata marginale e mi è andata di culo. Niente, non c’è verso di farglielo capire. E d’altronde, dopo la figura della volta scorsa non posso certo atteggiarmi da esperto.

Nota di merito per due giocate che ho fatto e che mi sono piaciute da morire. Nella prima sono di piccolo buio. Tutti foldano, mentre il giocatore alla mia destra chiama. Io ho in mano coppia di 7 e sento che l’unico modo che ho a disposizione per vincere è farli foldare entrambi. Rilancio a 800 (con buii a 100/200) e come previsto faccio mio il piatto. Al tavolo finale, una mezzoretta più tardi, ancora una situazione simile. Questa volta ho in mano coppia di 9. Un tipo rilancia di due volte il big bling in middle position, lo small-blind chiama e io, di grande buio sorprendo tutti andando all-in. Tutti e due foldano e io mostro la mia coppia di nove. Destino vuole che alla mano successiva io mi ritrovi con AK offsuit. Un tipo chiama, un altro rilancia di tre volte il piatto e io mi risparo ancora all-in, ben sapendo che sarei stato chiamato più facilmente che non alla mano precedente. Il giocatore alla mia sinistra, short-stacked, che all’inizio della mano aveva semplicemente fatto call, va all-in ma con molte meno chips del sottoscritto. Non mi spaventa, probabilmente sospetta un mio bluff o comunque ha una mano degna dell’all-in della disperazione, presumibilmente peggiore della mia. Il problema arriva invece dall’autore del raise iniziale, chip leader del momento, che non si accontenta della possibilità di andare a vedere con cosa ho chiamato il mio secondo all-in consecutivo e senza esitare chiama a sua volta. Si scoprono le mani: QQ per lui, JQ suited per l’altro (mano del tutto marginale, oltretutto dominata dalla coppia di donne del suo avversario), AK offsuit per me.

AK vs QQ vs JQ

Le statistiche dicono che io e il chip leader siamo più o meno alla pari, con un ovvio e leggero vantaggio per lui che al flop non ha bisogno di colpire niente. Oltretutto, la donna già uscita gli toglie un out. Peccato che sul tavolo escano solo carte basse. E io chiuda la contesa al quarto posto. Comunque più che onorevole. Questa volta l’importante era rimediare la figuraccia della volta scorsa, da mercoledì prossimo inizierò a pensare anche ai soldini da pelare a questo branco di pesci…

Share

Eugenio

Si avvicina il momento di tornare a casa. E scopro che c’è una piccola sopresa nel mio zoo rotegliese. O meglio, un nuovo inquilino. Tale Eugenio, di professione gatto, raccattato da mia sorella, fuori dal bar, lo scorso weekend. E portato samaritanamente a casa, nutrito e ripulito. Lui, da buon gatto qual è, ha ringraziato scagazzandole sul letto. Ma va beh, sono cose che capitano. Non ci formalizziamo per così poco, vero? Certo che Eugenio, disturbi digestivi a parte, pare decisamente carino:

Eugenio (1)

Eugenio (2)

Share

La moltiplicazione dei masteristi…

… non avviene mediante masterizzazione! Ah, ah, ah. Grasse risate. Se non è humour inglese questo, ditemi voi cosa lo è!

Russian Multiplication

Ok, stronzate a parte, post veloce veloce per segnalare che si sono raddoppiati i masteristi nelle mie grinfie. Ora sono due, entrambi francesi. Quello nuovo, per la cronaca, non ha un nome da maggiordomo, ma un banalissimo Franck (sì, con la “ck”). Ma mi aspetto che sia ugualmente servizievole. Anche perchè ammetto che se prima avevo preso la cosa con deciso entusiasmo, ora inizia un po’ a preoccuparmi. Perchè se devo passare le giornate a seguire questi due tizi, io quand’è che lavoro? Va beh, speriamo che il loro livello di autonomia sia abbastanza elevato. Oggi sono stato un’oretta a far vedere il mio lavoro a François, che sembra carico e sicuro di sè. Al momento lo lascio fare. Vuole sviluppare tutto in Java, nonostante io gli abbia suggerito di passare a C++, vuoi per il fatto che così posso dare un’occhiata anche al suo codice, vuoi perchè non conosco Java e non penso che sia così performante quando lo si utilizza per sviluppare algoritmi evolutivi. Ma lui è sicuro, dunque, come dicevo prima, lasciamolo fare. E che al limite si scotti da solo.

Chiudo, infine, con una notizia che aspettavo da tempo immemore. Il report per euCognition è stato ufficialmente chiuso. Dopo l’ennesimo giro di revisioni, il tutto è stato stampato in PDF e sottomesso a chi di dovere. Alias, David Vernon. I curiosi, che quando ho pubblicato la versione pre-revisione del paper sono stati decisamente pochi, possono togliersi la loro voglia cliccando qui sotto:

Share

« Pagina precedentePagina successiva »