[Xamarin.Forms] Nuevo CarouselView!

Introducción

Con el lanzamiento de Xamarin.Forms 4.3 nos llegan una gran variedad de novedades: CarouselView, RefreshView, HTML en Label, etc. Es un buen momento para profundizar en el uso de CarouselView.

Nuevo Carousel!

El CarouselView permite mostrar una colección donde se pueden desplazar los elementos haciendo deslizamientos (gestos de Swipe).

CarouselView está disponible en Xamarin. forms 4.3. Sin embargo, actualmente esta en fase experimental y solo se puede usar agregando la siguiente línea de código a la clase AppDelegate en iOS, o bien a la clase MainActivity en Android, antes de llamar a Forms.Init:

Forms.SetFlags("CarouselView_Experimental");

NOTA: El CarouselView esta disponible para Android, iOS y UWP.

Una parte muy interesante del nuevo CarouselView es que su implementación esta basada en CollectionView (se reutiliza una cantidad considerable de código). Sin embargo, los controles tienen casos de uso bastante diferentes. CollectionView se suele usar para mostrar un listado de datos, mientras que CarouselView se suele usar para resaltar información en una lista de longitud más limitada.

Comencemos viendo las propiedades fundamentales del control. El CarouselView obtiene su fuente de información utilizando la propiedad ItemsSource.

<CarouselView ItemsSource="{Binding Items}" />

La apariencia de cada elemento se puede definir utilizando la propiedad ItemTemplate:

<CarouselView ItemsSource="{Binding Items}">
     <CarouselView.ItemTemplate>
          <DataTemplate>
               <StackLayout>
                    <Frame>
                    ...
                    </Frame>
               </StackLayout>
          </DataTemplate>
     </CarouselView.ItemTemplate>
</CarouselView>

La propiedad CurrentItem, de tipo object, tiene asociado el elemento actual visible. Esta propiedad tiene un modo de enlace predeterminado de TwoWay y tiene un valor null cuando no hay datos. Por otro lado, también tenemos la propiedad Position, de tipo int, que es el índice del elemento actual.

Orientación

Llegamos a otra de las propiedades claves del control, ItemsLayout. Esta propiedad de tipo LinearItemsLayout, especifica el panel que se va a utilizar. Cuenta con varias propiedades que nos permiten modificar el comportamiento del mismo:

  • Orientation: Propiedad de tipo ItemsLayoutOrientation. Soporta layouts de forma horizontal o vertical.
  • SnapPointsAlignment: Especifica cómo se alinean los puntos de anclaje con los elementos (Start, Center, End).
  • SnapPointsType: Especifica el comportamiento de los puntos de anclaje al desplazarse (no anclar el elemento, etc).
  • ItemSpacing: Es el espacio entre cada elemento.
<CarouselView ItemsSource="{Binding Items}">
     <CarouselView.ItemsLayout>
          <LinearItemsLayout Orientation="Horizontal" />
     </CarouselView.ItemsLayout>
</CarouselView>

Sencillo, ¿verdad?.

Controlando el número de elementos visibles

El Carousel por defecto, muestra un elemento ocupando el ancho del control. Sin embargo, podemos modificar este comportamiento de varias formas.

Por un lado, contamos con la propiedad NumberOfSideItems, un entero que representa el número de elementos que se van a mostrar junto al elemento actual (por ejemplo, si indicamos 1 se mostrará un elemento a izquierda y otro a derecha del elemento actual).

<CarouselView ItemsSource="{Binding Items}"
     NumberOfSideItems="1">
</CarouselView>

Por otro lado, tenemos la propiedad PeekAreaInsets, en un valor de tipo Thickness que especifica la cantidad de espacio que puede ver de los elementos adyacentes. Es una opción ideal si se quiere mostrar de forma parcial un elemento para indicar al usuario que hay más contenido de una forma sencilla.

<CarouselView ItemsSource="{Binding Monkeys}"
     PeekAreaInsets="0,0,200,0">
</CarouselView>

EmptyView

EmptyView permite añadir una View a mostrar en caso de que el número de elementos enlazado sea cero o nulo.

Se soporta desde una sencilla cadena de texto:

<CarouselView ItemsSource="{Binding EmptyItems}"
EmptyView="No items." />

A una View tan compleja como sea necesario:

<CarouselView ItemsSource="{Binding Items}">
     <CarouselView.EmptyView>
          <StackLayout>
               <Label Text="No items."
                    FontAttributes="Bold" />
          </StackLayout>
     </CarouselView.EmptyView>
</CarouselView>

Desplazamiento

Poder desplazarnos entre elementos es una de las características del Carousel. Por lo tanto, tener el control sobre el desplazamiento es algo importante.

Podemos controlar si se puede hacer desplazamiento (Swipe) mediante la propiedad IsSwipeEnabled. También podemos saber cuando se hace drag con la propiedad IsDragging.

CarouselView cuenta con dos sobrecargas del método ScrollTo, usando índices u objetos para hacer scroll a una posición concreta:

carouselView.ScrollTo(3);

Eventos

Para detectar cuando se realiza desplazamiento, podemos usar el evento Scrolled:

carouselView.Scrolled += OnCarouselViewScrolled;

void OnCarouselViewScrolled(object sender, ItemsViewScrolledEventArgs e)
{
     Debug.WriteLine("HorizontalDelta: " + e.HorizontalDelta);
     Debug.WriteLine("VerticalDelta: " + e.VerticalDelta);
     Debug.WriteLine("HorizontalOffset: " + e.HorizontalOffset);
     Debug.WriteLine("VerticalOffset: " + e.VerticalOffset);
     Debug.WriteLine("FirstVisibleItemIndex: " + e.FirstVisibleItemIndex);
     Debug.WriteLine("CenterItemIndex: " + e.CenterItemIndex);
     Debug.WriteLine("LastVisibleItemIndex: " + e.LastVisibleItemIndex);
}

Contamos con información relacionada con índices (elemento actual, anterior, etc.) y de offsets (distancia transladada).

Además de detectar el cambio de scroll (por ejemplo, para animar y hacer una transición entre elementos, algo que veremos en otro artículo), nos interesa saber cuando se cambia el elemento actual. Para ello, contamos con PositionChanged:

carouselView.PositionChanged += OnPositionChanged;

void OnPositionChanged(object sender, PositionChangedEventArgs e)
{
     int previousItemPosition = e.PreviousPosition;
     int currentItemPosition = e.CurrentPosition;
}

Por supuesto, contamos con más propiedades y eventos, pero en este artículo nos hemos centrado en los básicos o más usados.

Manos a la obra!

Tras repasar las propiedades y eventos principales del control, vamos a crear un pequeño ejemplo:

<CarouselView 
     CurrentItem="{Binding CurrentPost, Mode=TwoWay}"
     ItemsSource="{Binding Posts}"
     ItemTemplate="{StaticResource PostItemTemplate}">
     <CarouselView.PeekAreaInsets>
          <OnPlatform x:TypeArguments="Thickness">
               <On Platform="iOS" Value="0, 0, 200, 0" />
               <On Platform="Android" Value="0, 0, 600, 0" />
     </OnPlatform>
     </CarouselView.PeekAreaInsets>
     <CarouselView.ItemsLayout>
         <ListItemsLayout
              Orientation="Horizontal"
              SnapPointsType="Mandatory"
              SnapPointsAlignment="Start"
              ItemSpacing="12"/>
     </CarouselView.ItemsLayout>
</CarouselView>

Hemos realizado un ejemplo de una App de viajes. Mostraremos las últimas noticias destacadas usando el CarouselView combinando “cartas” con video, etc.

El resultado es el siguiente:

Ejemplo usando CarouselView

Vamos a repasar las claves del ejemplo. Para mostrar dos elementos completos y una parte del tercero, utilizamos la propiedad PeekAreaInsets. Otro propiedad con un uso interesante en el ejemplo es la propiedad CurrentItem. Al hacer scroll y cambiar el elemento actual, notificamos el cambio en la ViewModel que actualizará a su vez la URL del video a reproducir actualizando la reproducción de fondo.

Puedes encontrar el código en GitHub:

Ver GitHub

¿Qué te parece el CarouselView?. Recuerda, puedes dejar cualquier feedback en los comentarios de la entrada.

Más información

Xamarin.Forms y Source Link

Introducción

Estas desarrollando, todo parece tener lógica pero…no funciona como esperas. Te preguntas, ¿que ocurre?, ¿que estoy haciendo mal?. En ocasiones, el error esta entre la silla y el teclado (en uno mismo) pero en ciertos casos puede ser algo externo a tu código. En el caso de desarrollar aplicaciones Xamarin.Forms, puede deberse a un bug en Xamarin.Forms. Como todo software, no esta exento de posibles bugs.

Bien, pero, ¿qué hacer en este caso?. Sincronizar el código fuente de Xamarin.Forms y hacer que tu App use directamente los proyectos en lugar de las librerías de NuGet es una opción pero…es un proceso tedioso.

¿Qué es SourceLink?

Source Link es una tecnología que permite depurar el código de librerías .NET desde NuGets. Se ha incluido soporte a Source Link en Xamarin.Forms y esto quiere decir que…puedes depurar código de Xamarin.Forms desde tu propio código usando directamente el paquete NuGet!.

Ahora podrás “ver más allá” ayudándote a resolver dudas o en caso de encontrar una issue en Xamarin.Forms, puedes dar información mucho más detallada.

¿Cómo funciona SourceLink?

Es sencillo. Tan pronto como se lance una excepción o navegas a un método de Xamarin.Forms, verás un cartel como el siguiente:

Source Link

Lo que ocurrirá es que se descargará automáticamente el código fuente desde GitHub y comenzará a depurar. Depurar, navegar entre el código, puntos de ruptura, etc. todo lo habitual funcionará como de costumbre.

NOTA: La descarga de archivos va a una cache.

Ahora el paquete de Xamarin.Forms cuenta con la referencia al repositorio oficial en Github y de esta forma permite al IDE saber qué debe descargar, etc.

¿Cómo lo uso con Xamarin.Forms?

En Visual Studio para Windows, Source Link lleva funcionando un tiempo. En el caso de Visual Studio para macOS se ha incluido soporte en la versión 8.3 Preview (gran trabajo chicos!).

Mientras depuras una App Xamarin.Forms, si navegas a algo que forme parte de Xamarin.Forms se descargará el código automáticamente y podrás depurar “más allá”.

Es un pequeño añadido en Xamarin.Forms pero bastante potente. Puede ayudar considerablemente a la hora de conocer mejor el framework, depurar, contribuir, etc.

¿Qué te parece esta opción?. Recuerda, cualquier comentario o pregunta es bienvenido!.

Más información

Xamarin.Forms en la web con WebAssembly y UNO

Introducción

Xamarin.Forms en la web. No es la primera vez que hablamos de ello. Dependiendo de con quien hables es una idea que trae malos recuerdos y piensa en algo horrible o piensa que es genial aprovechar la expansión de Xamarin.Forms, llegar a la web y aprovechar para reutilizar herramientas, código, etc.

En cualquier caso, en este artículo, vamos a conocer como llevar Xamarin.Forms en la web, vamos a ello!.

WebAssembly

¿Qué es?

WebAssembly es una nueva definición de bajo nivel de Abstract Syntax Tree (AST) representada en un formato binario. Puedes pensar en ello como un lenguaje ensamblador que los navegadores web pueden ejecutar. Esto quiere decir que sería posible compilar código escrito en muchos idiomas modernos en binarios que los navegadores web ejecutan de forma nativa.

¿Por qué Web Assembly?

WebAssembly está tratando de resolver los problemas existentes que dificultan la optimización del rendimiento de aplicaciones grandes, proporcionando acceso a lenguajes que producen binarios y mejorando la seguridad de ejecutar el código resultante.

También proporciona una forma para que cualquier lenguaje tenga un back-end de compilación (como LLVM) para llegar a la Web. Esto abre un camino para C, C ++, lenguajes basados ​​en .NET a través de Mono, Java y otros lenguajes. Proporciona opciones para los desarrolladores para llegar a la Web, reutilizando una librería (por ejemplo C++) sin tener que portarla a Javascript.

WebAssembly y .NET

Microsoft ha estado trabajando en WebAssembly y .NET utilizando  Mono desde hace un tiempo, y el progreso ha sido constante desde inicios de 2018.

Debido a consideraciones técnicas como la integración de Emscripten y su implementación sobre Javascript, AOT aún no está disponible. Se está trabajando actualmente en la integración AOT, pero la ruta actual para ejecutar código .NET en un entorno WebAssembly es a través del intérprete Mono. Se consiguen resultados bastante positivos, aunque obviamente el rendimiento mejorará considerablemente al usar AOT.

Uno Platform WebAssembly Renderers for Xamarin.Forms

Tras repasar que es WebAssembly, vamos a conocer cómo llevamos una App Xamarin.Forms a la web (usando WebAssembly).

Uno Platform

Uno Platform es un framework que permite desarrollar Apps para iOS y Android (Xamarin Stack) y para WebAssembly (Mono-Wasm runtime).

Uno Platform WebAssembly Renderers for Xamarin.Forms

Xamarin.Forms lleva soportando UWP desde el inicio, y Uno proporciona el conjunto de APIs UWP para funcionar en WebAssembly, asi que es un paso (lógico) más el ofrecer Renderers para habilitar Apps Xamarin.Forms UWP en WebAssembly.

Esto permite que las aplicaciones Xamarin.Forms se ejecuten en la Web.

¿Cómo llevar una App Xamarin.Forms a la Web?

Teniendo una solución Xamarin.Forms con un proyecto UWP, abrimos una línea de comandos y navegamos a la carpeta del proyecto.

Comenzamos instalando las plantillas de Uno:

dotnet new -i Uno.ProjectTemplates.Dotnet::1.46.230-dev.2723

NOTA: Una vez instaladas las plantillas, no será necesario volver a instalarlas.

Para crear un proyecto Wasm (reusará partes del proyecto UWP), ejecutamos:

dotnet new wasmxfhead

Al refrescar Visual Studio, veremos un nuevo proyecto:

Proyecto Wasm

Si lanzamos ese proyecto:

Monkey Conf

Estamos ante una sencilla App Xamarin.Forms con el objetivo de crear la página web del evento Monkey Conf. Reutilizamos el mismo XAML y código usado para la App UWP, pero corriendo en el navegador.

Puedes encontrar el código en GitHub:

Ver GitHub

Más información

[Material] dotNetMálaga 2019: Crear interfaces de usuario atractivas con Xamarin.Forms

El evento

El pasado 28 de Septiembre tenía lugar la dotNetMálaga 2019. Un gran día repleto de sesiones técnicas de tecnologías .NET, desde Xamarin, IA, Docker, etc.

dotNetMálaga 2019

Quisiera agradecer a todos los ponentes y asistentes por hacer posible el evento. Y por supuesto, mi enhorabuena a toda la organización por hacer que todo fluyese de forma tan natural.

El material

He tenido en placer de poder participar en el evento con una sesión acerca de Xamarin.Forms y formas de crear interfaces de usuario atractivas.

Crear interfaces atractivas visualmente con Xamarin.Forms

A continuación, la presentación utilizada:

En esta sesión vimos:

  • El uso de diccionario de recursos y temas.
  • Animaciones.
  • Transiciones.
  • Uso de SkiaSharp.
  • Lottie.
  • Visual.
  • Gradientes.
  • Nuevos controles (CollectionView, RefreshView).

Puedes encontrar todos los ejemplos en GitHub:

Ver GitHub

Hasta el año próximo!

Más información

[Xamarin.Forms] Ahora podemos usar contenido Html en Labels

Introducción

Uno de los controles habituales en cualquier aplicación Xamarin.Forms es el control Label. Al fin y al cabo, necesitamos mostrar texto de diversas formas. Es por eso, que es uno de los controles que recibe mejoras de forma constante. Recientemente hemos recibido espaciado entre carácteres, padding y soporte a contenido HTML.

Html como contenido

Antes que nada, HTML es potente y permite una cantidad de contenido diverso. No, no vas a poder añadir un video de YouTube como contenido. Se soportan etiquetas básicas como negritas, cabeceras, etc.

¿Cómo utilizar HTML como contenido?

Se ha añadido la propiedad TextType al Label. Con esta propiedad podemos indicar si queremos renderizar el texto directamente, Text, o como HTML.

Label htmlLabel = new Label() { TextType = TextType.Html };

De modo que, para establecer el contenido seguimos utilizando la propiedad Text:

htmlLabel.Text = "<h1>Hello World!</h1><br/>SecondLine";

Desde XAML, para utilizar HTML como contenido tenemos dos opciones:

  • Codificar la cadena HTML.
  • Usar CDATA.

Codificar la cadena, aunque es una opción, requiere trabajo extra:

<Label TextType="Html">
    <Label.Text>
        &lt;h1&gt;Hello World!&lt;/h1&gt;&lt;br/&gt;SecondLine
    </Label.Text>
</Label>

Usando CDATA:

<Label TextType="Html">
     <Label.Text>
          <x:String>
          <![CDATA[
          <h1>Hello world!</h1><br/>SecondLine
          ]]>
          </x:String>
     </Label.Text>
</Label>

El resultado:

Label con contenido HTML

¿Qué te parece esta nueva opción?. Recuerda, puedes dejar cualquier feedback o comentario en la entrada!.

Más información

[Xamarin.Forms] Un vistazo a RefreshView

Introducción

A día de hoy, estamos a acostumbrados (y cada vez más) a utilizar gestos para realizar acciones concretas en las aplicaciones móviles. Actualizar el contenido, cambiar de sección, etc. El objetivo final es diverso pero sin duda alguna, una de las acciones con gestos más utilizadas es el Pull To Refresh.

Pull to Refresh

Pull To Refresh

En diseño para dispositivos móviles, este efecto es el gesto que se realiza para la actualización de contenidos. Es decir, el pull to refresh es el gesto que se hace deslizando (normalmente) la parte superior hacia abajo para actualizar los contenidos.

Usando RefreshView

RefreshView llega como un nuevo control en Xamarin.Forms que permite hacer pull to refresh sobre cualquier contenido scrollable (ScrollView, ListView, CollectionView, etc.). El uso es muy sencillo:

<RefreshView>
     <ScrollView>
     </ScrollView>
</RefreshView>

Ya tendríamos lo suficiente para poder hacer pull to refresh sobre el contenido del ScrollView. En este artículo, voy a utilizar una aplicación antigua del tiempo que he actualizado para usar RefreshView además de CollectionView.

El comportamiento y apariencia de RefreshView se establece con algunas propiedades básicas:

  • BackgroundColor: Color de fondo del control.
  • RefreshColor: Color del indicador de carga.
  • IsRefreshing: Propiedad de tipo bool que indica si se esta refrescando el contenido o no. Si se establece a True se desencadena un refresco.
  • Command: Por supuesto, tenemos un comando para ejecutar la lógica de refresco en el contexto (ViewModel). Además de la propiedad Command contamos con CommandParameter.

De modo que nuestro RefreshView quedaría:

<RefreshView
     BackgroundColor="{StaticResource WhiteColor}"
     RefreshColor="{StaticResource AccentColor}"
     IsRefreshing="{Binding IsBusy}"
     Command="{Binding ReloadCommand}">
     <ScrollView>
     ...
     </ScrollView>
</RefreshView>

El resultado:

 

Usando RefreshView

Puedes encontrar el código del ejemplo en GitHub:

Ver GitHub

One more thing

En UWP contamos con un Platform Specific que permite especificar la orientación del pull to refresh:

refreshView.On<Windows>().SetRefreshPullDirection(RefreshPullDirection.BottomToTop);

Permite:

  • Desde arriba.
  • Desde abajo.
  • Desde la izquierda.
  • Desde la derecha.

¿Qué te parece RefreshView?. Recuerda, cualquier comentario es bienvenido!.

Más información

[Xamarin.Forms] RelativeSource Binding

Introducción

Estas usando un control enlazado a una colección (por ejemplo, un listado de peliculas) y en cada elemento cuentas con un botón para añadir la pelicula a favoritos. Por defecto, cada elemento tendra como contexto la pelicula de la colección enlazada al listado y añadir un comando en cada elemento no suena como la mejor idea pero…¿que hacemos en este caso?.

RelativeSource

Contábamos ya con otras soluciones para hacer Binding a un elemento visual (x:Reference) pero nos llega RelativeSource, la solución ideal en casos como el anterior.

RelativeSource es una extensión de marcado que se utiliza en casos de enlace particulares cuando intentamos vincular una propiedad de un objeto a otro de sus padres relativos. 

Veamoslo con un ejemplo sencillo. Vamos a trabajar con tareas:

public class TodoItem
{
     public string Name { get; set; }
     public string Description { get; set; }
     public bool IsDone { get; set; }
}

De modo que en la ViewModel contaremos con un listado de tareas:

Items = new ObservableCollection<TodoItem>
{
     new TodoItem
     {
          Name = "Create RelativeSource Demo"
     },
     new TodoItem
     {
          Name = "Buy Milk"
     },
     new TodoItem
     {
          Name = "Go for a walk"
     }
};

Y un comando:

public ICommand DeleteTodoItemCommand => new Command<TodoItem>(DeleteTodoItem);

NOTA: Fíjate que cada TodoItem no cuenta con un comando.

En la interfaz de usuario:

<ListView 
     ItemsSource="{Binding Items}">
     <ListView.ItemTemplate>
          <DataTemplate>
               <ViewCell>
                    <Grid>
                         <Grid.ColumnDefinitions>
                              <ColumnDefinition Width="*" />
                              <ColumnDefinition Width="80" />
                         </Grid.ColumnDefinitions>
                         <Label 
                              Grid.Column="0"
                              Text="{Binding Name}"/>
                         <Button 
                              Grid.Column="1"
                              Text="Delete" 
                              CommandParameter="{Binding}" 
                              Command="{Binding Source={RelativeSource AncestorType={x:Type viewModels:MainViewModel}}, Path=DeleteTodoItemCommand}"/>
                    </Grid>
               </ViewCell>
          </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

El resultado:

Usando RelativeSource

El comando hace uso de RelativeSource para acceder al ancestro de tipo MainViewModel y Path, el comando.

Puedes encontrar el código del ejemplo en GitHub:

Ver GitHubOtra extensión de marcada añadida que viene a solucionar ciertos casos. ¿Qué te parece el añadido?.

Recuerda, cualquier comentario o feedback es bienvenido en los comentarios de la entrada.

Más información

[Evento] Monkey Conf 2019

El evento

Y vuelve el evento técnico Xamarin que estabas esperando, Monkey Conf 2019!.

Monkey Conf 2019

Tras el éxito del evento del año pasado, regresamos con una nueva edición de la Monkey Conf. Volverá a ser un evento gratuito, en el que trataremos temas relacionados con desarrollo móvil, Xamarin, Xamarin.Forms, App Center, testing y más…

La fecha

Será el próximo Sábado, 30 de Noviembre de 09:30h a 18:30h (GMT+1). Tendremos dos tracks en paralelo con diferentes sesiones técnicas de 50 minutos de duración cada una. Además contaremos con regalos y sorpresas!.

¿Te apuntas?

NOTA: Las entradas del evento son gratuitas pero limitadas!

El lugar

El evento se celebrará en Liferay. Dirección detallada:

Paseo de la Castellana, 280, 28046 Madrid, Madrid

Oficinas de Liferay

Call 4 Papers

¿Has desarrollado una aplicación con Xamarin?, ¿quieres hablar acerca de como usas App Center?, ¿revisar las próximas novedades de Xamarin.Forms?, ¿un taller o mesa redonda?. El C4P del evento está abierto y estoy seguro que puedes hablar sobre algun tema que interese y ayude al resto!.

Más información

[Xamarin October Challenge] Best Practices

Introducción

Los retos (Challenges) han sido una de las gratas sorpresas en la comunidad de Xamarin en este año. No solo hemos tenido varios retos, además han sido recibidos y apoyados de una forma muy positiva.

¿Por qué no tener otro reto en el mes de Octubre?.

Nuevo Challenge

De esta forma nos llega de la mano de Claudio Sanchez el reto de Octubre basado en buenas prácticas. Hablamos de buenas prácticas en todos los ámbitos del desarrollo Xamarin: estructura del proyecto, DevOps, Testing, creación de APIs, etc.

¿Cómo funciona?

Como otros retos anteriores, la idea es llegar a contar con un artículo por cada día del mes. En esta ocasión todo esta centralizado en un repositorio en GitHub. En el repo puedes ver dos aspectos fundamentales:

  • Calendario de fechas: Donde ver cuales están libres y poder elegir cual prefieres ocupar.
  • Tabla de contenido: Un listado con temas y posibles ideas que puedes abordar.

¿Cómo participo?

Debes reservar un hueco!. Para hacerlo bastará con crear una issue en el repositorio:

Reservar hueco

Tras reservar el hueco, podrás escribir el artículo en un archivo de markdown y enviar una Pull Request al repositorio del reto. Por supuesto, también podrás publicar el artículo en tu blog.

Al final del reto, habrá un evento donde se repasarán todas las contribuciones, etc.

Suena divertido, ¿te animas a participar?.

NOTA: El artículo debe ser en ingles.

Más información

[Quedada Informal] CartujaDotNet & SVQXDG

Quedada múltiple

Desde CartujaDotNet, grupo de usuarios .NET de Sevilla y SVQXDG, grupo de desarrolladores Xamarin de Sevilla, vamos a realizar una quedada informal para charlar abiertamente sobre tecnologías Microsoft, Xamarin, herramientas utilizadas, intercambiar impresiones, etc. Además, se analizarán las próximas charlas ya planteadas hasta final de año y los eventos confirmados entre otros temas de interés. Al ser quedada de dos grupos diferentes creemos que es una gran oportunidad para conocer, intercambiar e interactuar entre ambos permitiendo a miembros de cada uno conocer a los del otro y tratar otros aspectos.

No hace falta confirmar asistencia, y por supuesto será gratuito.

¿Te apuntas?

A continuación tienes disponible la fecha, hora y lugar:

  • Día: 03 de Octubre (Jueves)
  • Horario:  19:00h
  • Lugar: En la Terraza del McDonald’s de Santa Justa

Más información