Feliz navidad y próspero 2016!

mobo

Felices fiestas!

Queridos amigos, celebréis lo que celebréis, os deseo a todos unas felices fiestas, que espero que podáis compartir con vuestros familiares y amigos.

Adios 2015

Despido un año que en mi caso personal ha sido bastante divertido y
positivo. Nuevos SDKs y tecnologías, nuevos retos profesionales, grandes
eventos donde hemos podido aprender y compartir mucho además de seguir
desvirtualizando a muchos, etc.

Nuevas tecnologías

El lanzamiento de Windows 10 con la plataforma
universal Windows ha llegado con fuerza con gran cantidad de novedades,
APIs y herramientas. Además, el imparable crecimiento de la plataforma Xamarin
con novedades en desarrollo y herramientas (Test Recorder, Inspector,
Test Cloud, etc) han otorgado un año muy divertido con muchas
posibilidades.

El nacimiento de una nueva comunidad

Ante tanta cantidad de novedades Xamarin, entre ejemplos y eventos, junto a Marcos Cobeña y Josué Yeray decidimos crear SVQXDG, comunidad de desarrolladores Xamarin de Sevilla.

SVQXDG

SVQXDG

Tras varios meses de vida, con algun evento y varias quedadas a sus
espaldas, el crecimiento de la comunidad e interés sigue en aumento
progresivo.

La evolución de otra comunidad

CartujaDotNet, comunidad de desarrolladores .NET de Sevilla, evoluciona con nuevo dominio más simple cartuja.net y con grupo en meetup
para facilitar la colaboración entre todos los miembros de la
comunidad. Ha sido un año interesante para la comunidad con varios
eventos, un Hackathon y también múltiples quedadas.

Grandes eventos de comunidad

En cuanto a eventos, ha sido un año con enormes eventos. Por un lado destacar los grandes eventos por volumen y éxito como la DotNet Conference o el Hel10 Windows.
Por quizás ser muy reciente o por lo especial por la combinación de
buen rollo, disfraces y sobretodo por la gran ayuda aportada, también
destacaría Talks4Kids.

Gran comunidad!

Gran comunidad!

MVP Summit

El MVP Summit
es una oportunidad disponible para los MVPs de Microsoft para poder
asistir a Redmond donde poder tener sesiones técnicas sobre novedades,
visitar el campus o charlar con miembros de equipo entre otras
oportunidades. Este año he podido realizar la visita y sin duda ha sido
una enorme experiencia.

MVP Summit 2015

MVP Summit 2015

Nuevos retos profesionales

Por último, ha sido un año de cambios. Hace varios meses comencé un
nuevo reto profesional bastante apasionante a la par que divertido en Plain Concepts.

Para el 2016!

Para el próximo año os deseo a todos salud, trabajo y que sea un gran
año que os permita cumplir todos vuestros objetivos y sueños. Para el
próximo año sólo pido poder continuar con inquietudes, aprendiendo y
compatiendo. Ah, y seguir “desvirtualizando” a muchos de vosotros!

Felices fiestas!

[Xamarin.Forms] Probando Gorilla Player, viendo cambios de UI al vuelo!

Introducción

Xamarin.Forms es un toolkit que crea una abstracción sobre la interfaz de usuario de Android, iOS y Windows Phone permitiendo desarrollarla una única vez con código C# o Extensible Application Markup Language (XAML).

Con la llegada de Xamarin 4 se alcanza la versión
2.0 del toolkit añadiendo soporte a UWP, nuevos gestos y entre las
novedades más destacables cabe mencionar importantes mejoras en rendimiento
en layouts, listados y la posibilidad de compilar XAML. Estas mejoras
aumentan las posibilidades de una opción que permite una cantidad
elevada de código compartido incrementando la productividad y por
extensión reduciendo costes.

El problema

Se sigue echando en falta un diseñador gráfico que permita ver en
tiempo real de forma sencilla, rápida y efectiva cualquier cambio por
pequeño que sea sin necesidad de compilar y desplegar la aplicación.

Nace Gorilla Player

Los chicos de UXDivers se marcaron como objetivo lanzar un Toolkit (Grial UI Kit)
que permitiera la creación de interfaces ricas y atractivas con
facilidad para cualquier desarrollador Xamarin. Durante el desarrollo de
Grial los tiempos de implementación de la UI se dispararon. Gran parte
de ese incremento se debío a los tiempos de compilación. Al ser un
producto con foco en la parte visual cada cambió por mínimo que fuera
tomaba minutos antes de ser visualizado. Todo esto llevó a pensar en una
solución alternativa para evitar compilar, lo cual dió origen a Gorilla Player.

Cambios de UI al vuelo!

El objetivo principal de Gorilla Player es permitir ver
cualquier cambio visual en layouts, estilos o imágenes de forma
inmediata sin necesidad de compilar. Entre las opciones que ofrece:

  • Add-in para Xamarin Studio.
  • Aplicación Player para dispositivos o emuladores.
  • Posibilidad de ver cualquier cambio de layout, estilos o imágenes al vuelo.
  • Posibilidad de utilizar datos de prueba.
  • Posibilidad de sincronizar con múltiples dispositivos de manera
    simultánea. De esta forma podemos ver el mismo cambio en diferentes
    dispositivos o plataformas.
  • Notifica de errores en el marcado (XAML).

Instalando Gorilla Player

La instalación de Gorilla es sencilla tanto en Windows como Mac.

OSX

Tras la descarga del paquete bastará con arrastrar el icono de Gorilla Player a la carpeta de aplicaciones:

Instalar Gorilla Player

Instalar Gorilla Player en OSX

Windows

En Windows contaremos con el clásico asistente de instalación:

En Windows

En Windows

Terminada la instalación tendremos la siguiente pantalla de
configuración donde podremos elegir si instalar el add-in de Gorilla
Player y los proyectos de ejemplo además de poder cambiar rutas.

Instalado add-in y ejemplos

Instalado add-in y ejemplos

NOTA: Para evitar problemas es recomendable
asegurar que Xamarin Studio permanece cerrado durante la instalación. En
caso contrario, el add-in no se instalará.

Llegados a este punto necesitaremos una conexión a internet para
validar nuestras credenciales. Utilizaremos el correo electrónico con el
que nos registramos en Gorilla Player junto a la contraseña recibida
por correo electrónico.

 

Iniciando sesión

Iniciando sesión

Un vez realizada la autenticación tendremos Gorilla en funcionamiento y todo casi preparado para trabajar. En todo momento tendremos acceso rápido a la documentación online o al Walkthrough donde se detallan los pasos básicos para tenerlo todo listo.

Walkthough

Walkthough

Gorilla 07Gorilla Player en dispositivos

Deseamos ver los cambios en XAML al vuelo en un dispositivo o
emulador (o dispositivos / emuladores pueden ser múltiples de manera
simultánea) por lo que el siguiente paso será, añadir el Player.

Abrimos la solución del proyecto del Player y desplegamos en dispositivo o emulador.

Gorilla tratará de realizar la conexión de forma automática. En caso
de no poder establecerla debemos realizarla a mano introduciendo la
dirección IP del servidor.

NOTA: El puerto por defecto que utiliza Gorilla es el 8080.

Gorilla Player en emulador Android

Gorilla Player en emulador Android

Una vez establecida la conexión tenemos todo lo necesario para previsualizar los cambios en nuestro dispositivo o emulador.

NOTA: Podemos repetir el proceso por cada dispositivo o emulador extra en el que deseamos probar la aplicación.

Probando cambios

Nos lanzamos de pleno a probar la actualización al vuelo de cambios
en XAML. Podemos utilizar cualquier aplicación Xamarin.Forms, para este
ejemplo utilizaremos la misma proprocionada en la instalación de
Gorilla, MyCoolCompanyApp.

Abrimos un archivo XAML de nuestro proyecto y comenzamos a editar,
cualquier cambio que guardemos se verá reflejado de manera inmediata en
el Player sincronizado:

Cambios al vuelo!

Cambios al vuelo!

Probando con datos de prueba

Podemos utilizar datos de prueba para poder ver resultados cercanos
al resultado final en nuestra UI de forma muy sencilla. Podemos asociar
datos de prueba con XAML de las siguientes formas:

  • Utilizando un archivo JSON.
  • Utilizando la clase JsonData.
  • Utilizando objetos planos.

Comenzamos tratando la primera opción. Definimos un archivo JSON
en la raíz del proyecto donde tenemos definidas nuestras vistas XAML
donde el contenido serán cada unas de las propiedades que desearemos
bindear.

Archivo JSON con los datos de prueba:

{
    "MyPeople.xaml": [
    { "Name": "Casy Niman", "City": "HOBART", "Department":"Accounts", "Age":58, "Followers":267,  "Photo":"friend_thumbnail_93.jpg" },
    { "Name": "Gorge Tach", "City": "NEWCASTLE", "Department":"Design", "Age":29, "Followers":127, "Photo":"friend_thumbnail_55.jpg" },
    { "Name": "Cristina Maciel", "City": "HOBART", "Department":"Mobile Dev.", "Age":32, "Followers":80, "Photo":"friend_thumbnail_31.jpg" },
    { "Name": "Simon Deuva", "City": "MELBOURNE", "Department":"Media", "Age":58, "Followers":420, "Photo":"friend_thumbnail_34.jpg" }
    ]
}

Uso en la interfaz de usuario:

<ListView>
     <ListView.ItemTemplate>
          <DataTemplate>
               <ViewCell>
                    <Label Text="{Binding Name}" VerticalOptions="Center" Grid.Column="1" />
                    <Label Text="{Binding Age}" VerticalOptions="Center" Grid.Column="2"/>
                    <Image Source="{Binding Photo}" HorizontalOptions="Center" Grid.Column="3"/>
               </ViewCell>
          </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

El BindingContext de la vista esta enlazado al fichero JSON. Podemos
utilizar para realizar el proceso el nombre de la vista o bien la ruta
al archivo.

La otra posibilidad que tenemos de utilizar datos de prueba es mediante la clase JsonData.

<ContentPage
       xmlns:common="clr-namespace:UXDivers.Artina.Player;assembly=UXDivers.Artina.Player.Common">
    <ContentPage.Resources>
        <ResourceDictionary>
            <common:JsonData x:Key="People">
                [
             { "Name": "Casy Niman", "City": "HOBART", "Department":"Accounts", "Age":58, "Followers":267,  "Photo":"friend_thumbnail_93.jpg" },
             { "Name": "Gorge Tach", "City": "NEWCASTLE", "Department":"Design", "Age":29, "Followers":127, "Photo":"friend_thumbnail_55.jpg" },
             { "Name": "Cristina Maciel", "City": "HOBART", "Department":"Mobile Dev.", "Age":32, "Followers":80, "Photo":"friend_thumbnail_31.jpg" },
             { "Name": "Simon Deuva", "City": "MELBOURNE", "Department":"Media", "Age":58, "Followers":420, "Photo":"friend_thumbnail_34.jpg" }
                ]
            </common:JsonData>
        </ResourceDictionary>
    </ContentPage.Resources>
    <ContentPage.Content>
            <ListView ItemsSource="{Binding Source={StaticResource People}, Path=Obj}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                                <Label Text="{Binding Name}" VerticalOptions="Center" Grid.Column="1" />
                                <Label Text="{Binding Age}" VerticalOptions="Center" Grid.Column="2"/>
                                <Image Source="{Binding Photo}" HorizontalOptions="Center" Grid.Column="3"/>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    </ContentPage.Content>
</ContentPage>

la clase JsonData nos permite definir una estructura de datos
utilizando un archivo JSON. Su uso es tan sencillo como definir la
estructura deseada como recurso asignádole un identificador y
referenciar más tarde al recurso vía identificador donde deseamos
acceder a cualquier dato de la estructura.

La tercera opción disponible es utilizar objetos. En XAML podemos
definir un objeto y luego referenciarlo desde un elemento de UI. Podemo
definir una estructura como la siguiente:

x:Array x:Key="Data"
        Type="{x:Type sys:String}">
     <sys:String>Hello</sys:String>
     <sys:String>World!</sys:String>
</x:Array>

Y enlazar con facilidad:

<ListView ItemsSource="{StaticResource Data}">
     <ListView.ItemTemplate>
          <DataTemplate>
               <ViewCell>
                    <Label Text="{Binding .}"/>
               </ViewCell>
          </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

Un ejemplo de uso:

Datos de prueba

Datos de prueba

Gestión de estilos

Desde la llegada de Xamarin.Forms 1.3 tenemos la posibilidad de
utilizar estilos para gestionar con facilidad la apariencia de nuestra
interfaz de usuario. En este caso lo normal es trabajar con
ResourceDictionary que puede estar tanto a nivel de elemento visual,
como de página como de aplicación (en otro archivo App.xaml).

Gorilla Player permite trabajar con:

  • Estilos implícitos, explícitos y herencia.
  • Permite que esten definidos en el mismo archivo o diferentes.
  • Colores tanto con nombres directos como valores hexadecimales.
  • Previsualizar imágenes locales.
Cambios en estilos

Cambios en estilos

Detección de errores en marcado

Por último, y no por ello menos importante, cabe resaltar el feedback proporcionado en errores
de marcado. En caso de definir una propiedad de forma incorrecta,
cerrar mal algun elemento XAML, establecer una propiedad inválida, etc.
el Player nos indicará el tipo de error y otros detalles.

Errores en XAML

Errores en XAML

Más información

[Xamarin] Probando Continuous Coding

Introducción

Xamarin lanzó una nueva herramienta para aplicaciones iOS, Android, Mac y WPF llamada Xamarin Inspector que nos permite acelerar el desarrollo permitiendo:

  • Ver
    el árbol visual de elementos de la interfaz. En OSX además se puede ver
    una visualización 3D con capas con los diferentes elementos visuales
    que componen la interfaz.
  • Poder seleccionar elementos y modificar propiedades.
  • Poder ejecutar evaluaciones de expresiones C# con REPL (Read-Eval-Print Loop).

Entre
todas las opciones la última es increíblemente interesante ya que
permite realizar múltiples pruebas en tiempo real sin necesidad de
realizar recompilaciones del proyecto, proceso que conlleva un tiempo en
el que no podemos continuar nuestro desarrollo. Esto mismo debió pensar
Frank A. Krueger que ante la posibilidad de poder utilizar ensamblados dinámicos se ha lanzado a crear Continuous Coding anteriormente conocido como Live Coding.

Continuous Coding

La
propuesta de Continuous Coding es reducir al máximo el ciclo de
compilar y ejecutar permitiendo en tiempo real evaluar el código tanto
de la lógica como por puesto a nivel de UI. Poder contruir la interfaz al vuelo
viendo directamente los resultados de cada línea aplicada además de
poder enlazar la misma con la lógica y el backend segun vamos
escribiendo.

Suena a mágico, ¿verdad?

En eso consiste Continuous Coding actualmente disponible en C# para Xamarin en Android e iOS.

Preparando el entorno

El paso inicial de todos es instalar Xamarin Inspector.

Podemos instalar la herramienta tanto en Windows como en OSX de forma sencilla.

Instalando Xamarin Inspector
Instalando Xamarin Inspector

El siguiente paso será instalar el add-in de Continuous Coding para Xamarin Studio.

NOTA: Actualmente solo soportado en Xamarin Studio.

En
Xamarin Studio seleccionamos Archivo -> Gestor de complementos. Una
vez en la galería de complementos, seleccionamos la opción de
repositorios.

Repositorios
Repositorios

Añadimos un nuevo repositorio utilizando la siguiente URL:

https://raw.githubusercontent.com/praeclarum/Continuous/master/Continuous.Client.MonoDevelop/AddinRepo
Repostorio añadido
Repostorio añadido

Utilizando Continuous coding

Creamos una nueva aplicación, para este ejemplo crearemos una aplicación Xamarin.Forms.

Nuevo proyecto Xamarin.Forms
Nuevo proyecto Xamarin.Forms

Debemos añadir una referencia desde los proyectos iOS y Android al paquete NuGet de Continuous.

NuGet Continuous
NuGet Continuous

A continuación, añadiremos:

#if DEBUG
new Continuous.Server.HttpServer(this).Run();
#endif

En puntos de inicialización de la App. En el caso de iOS AppDelegate.FinishedLaunching y en el caso de Android Activity.OnCreate son lugares idóneos.

NOTA: this es el contexto en Android. En iOS puede ser cualquier cosa.

En el caso de utilizar el emulador de Android tendremos que hacer un forward del puerto utilizado por Continuous:

Llegados a este punto tenemos todo lo necesario para usar Continuous
Coding. Ejecutamos la App en depuración como lo haríamos normalmente.
Tenemos el panel de Continuous Coding disponible en Ver -> Paneles
-> Continuous Coding.

Panel Continuous Coding
Panel Continuous Coding

Podemos enviar Snippets de código utilizando el botón Set Type o la combinación de teclado Ctrl+Shift+Return. En caso de desar que todo lo que vamos editando vaya actualizándose en tiempo real debemos usar el botón Refresh del panel o la combinación de teclas Ctrl+Shift+C.

Podéis ver a continuación a Continuous Coding en acción.

Continuous en acción!
Continuous en acción!

El sencillo ejemplo mostrado anteriormente lo podéis encontrar en GitHub:

Ver GitHub

One more thing

James Montemagno,
evangelista de Xamarin, se lanzó este verano con un nuevo formato
llamado Motz Codes Live basado en Hangouts de 30-60 minutos tratando
diferentes aspectos relacionado con el desarrollo de aplicaciones con
Xamarin. En el último de ellos junto a Frank A. Krueger realizaron un recorrido bastante completo por Continuous:

Más información

[Material] Reconnect(); Sevilla

El evento

El pasado 10 de Diciembre, en el WorkINCompany, tenía lugar el Reconnect(); en Sevilla
donde con diferentes sesiones técnicas se repasaban las novedades
principales presentadas en el Connect(); 2015. El Connect es un evento
anual para desarrolladores donde pudimos conocer de primera mano la
estrategia sobre el futuro de herramientas de desarrollo y servicios de
Microsoft. Novedades en Azure, desarrollo de aplicaciones web, Windows
10 y desarrollo de apps multiplataforma para Android, iOS y Windows.

Connect(); 2015

Connect(); 2015

Durante una divertida mañana vimos novedades en:

  • Herramientas y servicios de Microsoft.
  • Desarrollo de aplicaciones con ASP.NET & .NET Core.
  • Desarrollo móvil para iOS, Android y Windows de la mano de Xamarin.
  • Desarrollo de apps utilizando Universal Windows Platform.
Jose María Aguilar hablando de ASP.net 5 y MVC 6

Jose María Aguilar hablando de ASP.net 5 y MVC 6

Un servidor hablando sobre las principales novedades de Xamarin 4

Un servidor hablando sobre las principales novedades de Xamarin 4

El material

Comenzamos el evento con una keynote repleta de novedades. Repasamos las nuevas releases en herramientas y servicios:

En la sesión de Xamarin vimos:

  • Repaso de desarrollo en Xamarin
  • Novedades principales en Xamarin.Forms 2.0
  • Un vistazo a Xamarin Inspector
  • Realizando pruebas de comportamiento de UI con Test Recorder
  • Xamarin Insights

También tuvimos una sesión sobre UWP donde repasamos
las claves para crear aplicaciones destinadas a varias familias de
dispositivos Windows como PCs, tabletas o teléfonos:

En cuanto a las demos técnicas realizadas, las tenéis disponible en GitHub:

Ver GitHub

Quisiera terminar añadiendo algunos agradecimientos a Plain Concepts por patrocinar y hacer posible el evento además de permitirme participar; gracias a Jose María Aguilar por participar y por supuesto, muchas gracias a todos los asistentes.

Más información

[Material] Talks4Kids 2015: Consejos Heisenberg para conseguir Apps Windows 10 con 99% de pureza

 

ChildrenEl evento

Todos los eventos de comunidad son especiales ya por el sencillo
hecho de compartir, comunicar y hacer networking entre todos. Sin
embargo, en ocasiones hay eventos que marcan. Lo pueden hacer por muchas
razones, un evento grande de comunidad donde compartir y aprender
mucho, el primer evento de una nueva comunidad, uno donde por temática o
novedad te encuentras especialmente ilusionado. Hay muchos motivos.

El pasado 4 de Diciembre, en Microsoft Ibérica, tenía lugar el Talks4Kids. Evento de comunidad con sesiones técnicas relacionadas con tecnologías Microsoft pero diferente por varios motivos.

Por un lado, el evento era solidario buscando ayudar en la cantidad de lo posible a la fundación Theodora
en su gran labor alegrando la estancia en hospitales tanto a pacientes
como a sus familiares sobretodo en estas fechas señaladas. Nos complace
de lleno saber que gracias a patrocinadores, ponentes y asistentes
conseguimos aproximadamente unas 190 visitas de los doctores sonrisa.

Por otro lado, lanzamos un reto sencillo y directo. Si llegábamos a una cifra mínima de recaudación, todos los ponentes saldríamos disfrazados. Y vaya si lo hicimos…

Momento "Di mi nombre"

Momento “Di mi nombre”

Entre el distentido climax logrado gracias a la visita de un doctor sonrisa en la keynote, los
momentos claves de aparición de cada ponente disfrazado, los
irremediables momentos llenos de risas, la cercanía en las sesiones y el
compañerismo absoluto, logramos uno de los eventos de comunidad más destacables del año.

Gran evento, gran comunidad!

Gran evento, gran comunidad!

El material

En cuanto al material del evento, participé con una sesión sobre desarrollo Windows 10 donde asociando en todo momento con el ya mítico personaje de la serie de ficción “Breaking Bad” vimos:

  • El ciclo de vida en aplicaciones Windows 10.
  • Ejecución de modo extendido.
  • Tareas de fondo, nuevos triggers.
  • Application Trigger.
  • Comunicación entre Apps.
  • App Services.

Tenéis disponible la presentación utilizada a continuación:

En cuanto a las demos técnicas realizadas, las tenéis disponible en GitHub:

Ver GitHub

Quisiera terminar añadiendo algunos agradecimientos a
todos aquellos que han hecho posible el evento y toda la ayuda lograda.
Comienzo agradeciendo a todos los patrocinadores que apoyaron al
evento, en especial en mi caso particular, a Plain Concepts por no dudar ni un segundo en colaborar además de permitirme participar; gracias a todos los ponentes por su compromiso, sesiones y por no dudar en disfrazarse o realizar lo necesario; a Microsoft por dejarnos sala y toda la ayuda necesaria y por supuesto, muchas gracias a todos los asistentes y los que no pudieron pero ayudaron.

One mor thing…

Todas las sesiones del evento fueron grabadasy estarán disponibles en Channel 9.

Más información

[Evento CartujaDotNet] Reconnect(); 2015

DateEl evento

El pasado 18 de noviembre Microsoft celebró en Nueva York el Connect(); 2015,
evento anual para desarrolladores donde pudimos conocer de primera mano
la estrategia sobre el futuro de sus herramientas de desarrollo y
servicios, Microsoft Azure, desarrollo de aplicaciones web y desarrollo
de apps multiplataforma para Android, iOS y Windows.

Ante tal cantidad de interesantes novedades desde CartujaDotNet hemos decidido tomar buena nota, contar con un grupo de profesionales, miembros de la comunidad, para realizar el Reconnect, evento donde analizaremos de la forma más práctica posible los aspectos más importantes que se pudieron ver en el Connect.

Reconnect(); //2015
Reconnect(); //2015

Durante esta jornada veremos novedades en:

  • Herramientas y servicios de Microsoft.
  • Desarrollo de aplicaciones con ASP.NET & .NET Core.
  • Desarrollo móvil para iOS, Android y Windows de la mano de Xamarin.
  • Desarrollo de apps utilizando Universal Windows Platform.

La agenda

Contaremos con la siguiente agenda:

9:15 – 9:30 Registro.
9:30 – 10:30 Keynote. Javier Suárez, Josué Yeray y Marcos Cobeña.
10:30 – 11:30 ASP.NET 5 & MVC 6 (RC 1). Jose María Aguilar.
11:30 – 12:00 Descanso & Networking.
12:00 – 13:00 Universal Windows Platform. Javier Suárez y Josué Yeray.
13:00 – 14:00 Desarrollo móvil con Xamarin. Javier Suárez, Josué Yeray y Marcos Cobeña.
14:00 – 14:15 Cierre.

La fecha

El evento tendrá lugar el próximo Jueves, 10 de Diciembre de 9:15h a 14:15h. Tendremos cuatro sesiones de 1:00 hora de duración cada una.

Si
a pesar de todo el contenido de la agenda te parece poco, contaremos
también con alguna sorpresa y regalo a sortear entre los asistentes.

¿Te apuntas?

Más información