Historia de Velneo: ¿es una herramienta estable y con futuro?

15/02/2019
Artículo original

Fotografía del edificio corporativo vCenter de Velneo

Hace unas semanas lanzamos nuestro curso de creación de aplicaciones de gestión empresariales con Velneo. En su momento os explicamos el motivo de haber lanzado un curso sobre esta plataforma relativamente desconocida. Algunos nos habéis preguntado sobre si Velneo es flor de un día o es una plataforma con futuro. Vamos a tratar de contestarlo...

Para entender el presente, hay que conocer el pasado, como se suele decir. Y aunque Velneo quizá no te suene demasiado por ser un producto de nicho, muy especializado en desarrollo de aplicaciones de gestión, esta herramienta española no es nueva, ni flor de un día.

En realidad, estamos hablando de una tecnología que tiene a sus espaldas más de 20 años de investigación y know-how, y que ha derivado en lo que es ahora: una plataforma innovadora, de presente y futuro.

Velneo deriva de la antigua plataforma Velázquez Visual, que si tienes una cierta edad quizá te suene. Cuando se lanzó en los '90, las revistas especializadas de entonces le prestaron mucha atención debido a su innovación. Además se realizaron muchas presentaciones por toda España, entre las cuales destacan las que se realizaban el en SIMO TCI, junto con gigantes del sector como IBM o Microsoft.

En aquel contexto dominaban el mercado de desarrollo de software de gestión, herramientas y lenguajes de programación como la antigua Visual Basic, Visual FoxPro, COBOL, IBM RPG, AS y algunas otras reliquias de la informática orientadas a la programación de aplicaciones para empresas.

El sueño de un innovador

Foto de Juan Muñoz-Cobos

Velázquez Visual se concibió en aquel entonces, de la mano de su arquitecto Juan Muñoz-Cobos, un verdadero genio de la informática. Creó esta herramienta en su empresa, Atica Software, en la década de los '90 como una herramienta de las llamadas de vertical, o de nicho: para programar aplicaciones empresariales y "pasarlo bien". De hecho, su creador la llamó "Velázquez Visual" porque decía que el desarrollo con la plataforma era como "pintar" aplicaciones.

La figura de Juan Muñoz-Cobos merece capítulo aparte, pero solo decir que, con sus luces y sus sombras, su historia es la de David contra Goliat.

Una de las frases de Juan es "Programar es prever", algo que todo programador debería interiorizar para mejorar la calidad de su software.

Hoy en día Velneo tiene un potente equipo de analistas y programadores de C++ detrás, pero en aquella época la visión y el "emprendimiento" (perdonadme el palabro) de Muñoz-Cobos estaba muy adelantado a su tiempo. Un "loco" atrevido que sentó las bases de lo que hoy es una forma diferente de programar. Es un ejemplo de desarrollador x10 (o 20x en este caso).

Tecnología, evolución y usuarios

Velneo, al estar desarrollada en C++ y apoyándose en las bibliotecas Qt, no solo tiene un gran presente, sino también un futuro tecnológicamente sostenible. En agosto de 2018 el fabricante noruego de las bibliotecas Qt destacó a la plataforma como caso de éxito en su web.

Se lanzan dos versiones de Velneo al año para garantizar que la plataforma evoluciona a la par que las demandas tecnológicas del mercado.

Velneo tiene un gran equipo de personas trabajando en la herramienta desde el vCenter (el edificio corporativo de la empresa, que se ve en la primera foto de este artículo). La plataforma ha servido para desarrollar aplicaciones de gestión en todo tipo de empresas: desde muchas PYME hasta grandes multinacionales, como la farmacéutica Bayer, Siemens AG, o Heineken. La Administración Pública tampoco es ajena a sus bondades, y se utiliza en algunos organismos públicos dependientes del Ministerio del Interior en España, así como en organismos y empresas públicas de varias Comunidades Autónomas y Diputaciones.

En la Red podemos encontrar algunos testimonios directos de clientes, unos más antiguos que otros dada la progresión del producto. Todos destacan la estabilidad y la solidez de la base de datos de Velneo, y los otros aspectos como el refactoring, el despliegue en la nube y el hecho de que programas una vez para todos los principales sistemas operativos sin necesidad de complicarte ni de duplicar código.

Cientos de empresas de España e Hispanoamérica utilizan Velneo para gestionar sus procesos de negocio o los de sus clientes, creando aplicaciones que usan a diario miles de usuarios. Podemos encontrar aplicaciones Velneo en todo tipo de sectores: industrias de todo tipo, empresas constructoras, complejos de logística, consignatarios de buques, cadenas hoteleras... Según datos de la propia empresa, se estima que en la actualidad hay más de 450.000 usuarios de aplicaciones Velneo en 15.000 empresas, clientes de las más de 2.000 empresas y desarrolladores que han creado aplicaciones con Velneo en sus 25 años de historia.

Velneo hoy en día no se postula como una alternativa a las plataformas de enfoque generalista, sino como una herramienta diseñada para desarrollar software de gestión empresarial de forma rentable y en un tiempo menor que aquellas tecnologías "multi-propósito".

Si te preguntabas de dónde salía Velneo o si tiene futuro a largo plazo, esperamos que este breve artículo te ayude a salir de dudas.

Cómo cambiar los colores de la consola con Java y System.out.println

13/02/2019
Artículo original

Hoy toca un truco sencillo pero útil.

Cuando programamos en Java estamos acostumbrados a enviar mensajes por la consola para informar a los usuarios de lo que va a ocurriendo. Para ello la manera por defecto de conseguirlo es mediante el uso del método System.out.println.

Este método, en principio, no permite cambiar el color de lo que se emite por pantalla. Todo se ve con el color predeterminado que tengamos, generalmente blanco (o gris claro) sobre fondo negro, algo así:

Sin embargo, cuando estamos creando una herramienta de línea de comandos nos puede resultar muy útil emplear otros colores para destacar cosas. Por ejemplo, usar el color rojo cuando se produzca una excepción y queramos avisar de ello tras haberla controlado, o el verde para cuando se lleve a cabo una tarea con éxito.

Nota: este tipo de usos del color para marcar significados no es accesible y por tanto no son apropiados si queremos que los puedan usar usuarios con problemas de visión, como por ejemplo los daltónicos que no distinguen entre rojo y verde. Asegúrate de que además de los colores utilizas algo más en el propio texto (mayúsculas, símbolos...) para indicar que se trata de un evento especial.

La buena noticia es que existen una serie de códigos de escape ANSI que nos permiten controlar ciertos aspectos de la consola, entre ellos los colores utilizados.

Si definimos las siguientes constantes en nuestro código:

public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";

Podremos utilizarlas para controlar el color que queremos mostrar con System.out.println.

Además podemos definir esta constante:

public static final String ANSI_RESET = "\u001B[0m";

que nos permitirá dejarlo todo como estaba y volver a los colores por defecto.

Así, podemos escribir lo siguiente:

System.out.println(ANSI_RED + "Texto de color rojo" + ANSI_RESET);

y veremos el color rojo como esperábamos:

dejando además la consola en su estado predeterminado, justo a continuación.

Del mismo modo podemos definir una serie de constantes para establecer el color de fondo que queremos usar con el texto, así:

public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m";
public static final String ANSI_RED_BACKGROUND = "\u001B[41m";
public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m";
public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m";
public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m";
public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m";
public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m";
public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"

Con ellas podemos establecer también el color de fondo y combinarlas con las anteriores para el color del texto, así:

System.out.println(ANSI_GREEN_BACKGROUND + ANSI_BLUE + "Texto de color azul sobre fondo verde");
System.out.println("Como no lo he resetado sigue igual.");
System.out.println("¡Reseteo ahora!" + ANSI_RESET);
System.out.println("FIN");

obteniendo esto por pantalla:

Si te fijas, mientras no le mandes el código de control de "reset" no se vuelve a establecer el color por defecto, por lo que podrías ir enviando comandos no visibles para cambio de color sin necesidad de escribir nada, y usarlos simplemente para ir controlando el cambio de colores.

Te dejo estos ejemplos (con las constantes, que es lo que te interesa) funcionando dentro de este repl.it.  Pulsa sobre el botón verde del triángulo para ejecutarlo y ver debajo los resultados:

Una pega: no funciona en Windows... Por defecto.

Esto que te acabo de enseñar funciona perfectamente en Mac y en Linux. Pero si lo intentas usar con Java en una consola de Windows verás que no te funciona.

Por suerte existe una biblioteca Open Source llamada JANSI que utiliza la Java Native Interface (JNI) para obtener los mismos resultados de manera coherente en todos los sistemas operativos, incluido Windows.

Solo tienes que descargarla, agregarla a tu proyecto y usar sus métodos específicos en vez de las constantes anteriores. Te funcionará también en el sistema de las ventanas. Mira la documentación en Github y verás que es muy sencillo.

¡Espero que te resulte útil!

Google Docs lanza una interesante API para la automatización de tareas

12/02/2019
Artículo original

Google Docs lanza una interesante API para la automatización de tareas

Google ha anunciado en las últimas horas la disponibilidad para el público en general de una nueva API de Google Docs. Una interfaz de programación de aplicaciones que hará posible para los desarrolladores la automatización de numerosas tareas que, hasta ahora, solo podían llevarse a cabo manualmente.

Esta interesante API para Documentos de Google ha estado en desarrollo durante los últimos meses y podía probarse, desde abril del año pasado en que tuvo su hueco en Google Cloud Next '18, en su vista previa destinada a desarrolladores.

Una de las posibilidades más interesantes de la API de Google Docs: la creación automatizada de facturas o informes de ventas

Tres áreas son sus principales virtudes: en primer lugar, la creación de documentos masivos; en segundo, la gestión del flujo de trabajo; y por último, la creación de servicios de gestión de contenidos.

Y es que, como explican desde la compañía, muchas de las funciones más populares de Google Docs están disponibles en la API. "Te permite leer y escribir documentos de forma programática para que puedas integrar datos de diversas fuentes aprovechando la potencia de Google Docs", señalan desde Mountain View. A través de ella puden editarse documentos, así como manejar de varias maneras textos, insertar imágenes o crear listas, entre otras opciones.

Uno de los ejemplos que pone Google en el vídeo que ha publicado explicando las bondades de la API es la creación automatizada de facturas. Estas son, a fin de cuentas, documentos similares entre sí que se generan con cierta periodicidad a partir de datos como el número de pedido o referencias de productos. Toda esta información podía ser aportada mediante la API, a través de una fuente externa o incluso mediante hojas de cálculo de Google, si ya se utilizan.

En el periodo de vista previa, empresas como Mailchimp o Netflix le han encontrado utilidad a la API. Por ejemplo, la plataforma de contenido audiovisual la ha utilizado como para automatizar los procesos de sus ingenieros facilitando la labor de documentación y recopilación de datos.

Sheety, un servicio que te permite convertir una hoja de cálculo de Google en una API gratis y al instante

11/02/2019
Artículo original

Sheety, un servicio que te permite convertir una hoja de cálculo de Google en una API gratis y al instante

Cuando se están programando prototipos, pruebas rápidas para llevar a la práctica ideas, el desarrollador necesita agilidad. Los procesos deben ser lo más livianos posibles para que el esbozo de producto esté preparado para ser puesto a prueba en el menor tiempo posible. Y soluciones como Sheety lo hacen más fácil.

Esta fantástica herramienta web tiene un único fin: convertir cualquier hoja de cálculo de Google en una API al instante. Y lo hace, además, gratis. Una sencilla forma de alimentar una página web, una aplicación o una interfaz con información que reuniremos en una hoja de cálculo. Difícil que sea más sencillo.

Cómo usar Sheety

Sheety

Lo primero que debe hacerse es publicar la hoja de cálculo deseada en la web. Para ello, basta acceder al menú Archivo > Publicar en la web. Dado este primer paso, lo segundo que debemos hacer será seleccionar una pestaña y, a continuación, seleccionar .csv como formato de exportación.

Una vez hecho esto, pegaremos la URL obtenida en el campo para tal efecto ubicado en la página principal de Sheety y presionaremos el botón que nos dará la API. ¡Listo! No tiene mayor misterio. Y además, según prometen desde este servicio gratuito, los cambios que se vayan realizando en la hoja de cálculo se actualizarán en la API en tiempo real.

La idea es sencilla y, sobre todo, útil. Es una forma imaginativa de sustituir una base de datos interna de una web o campos de registro de información que tiene, como plus, el potencial de la aplicación de Google, ya que por ejemplo podremos añadir colaboradores a la hoja de cálculo.

Naturalmente, y como bien señalan sus responsables, la intención es que estos usos se realicen con prototipos y en pruebas. Para proyectos en serio, que manejen datos sensibles o tienen grandes números de acceso, no sería recomendable esta forma de hacer funcionar la web.

Trusted Web Activity: el punto de inflexión para que los desarrolladores puedan distribuir sus Progressive Web App en Google Play

11/02/2019
Artículo original

Trusted Web Activity: el punto de inflexión para que los desarrolladores puedan distribuir sus Progressive Web App en Google Play

Maximiliano Firtman, fue el primero que lanzó la noticia de la inminente posibilidad que las Progressive Web App puedan ser distribuidas en Google Play Store como apps de primer nivel. Es decir, que las PWA sean integradas con todas las funcionalidades que gozan en el navegador pero ejecutadas desde una APK y distribuidas a través de la tienda de aplicaciones.

Tal como comenta Maximiliano en su artículo en medium, desde que en Mayo del 2018 en el Chrome Summit se presentarán las Trusted Web Activity se abría la puerta a un integración sin complejos de las PWA en Android. Es decir, utilizando todas las capacidades integradas de Chrome 72. Más allá de un limitado Webview o una ChromeTab con aspecto de navegador.

¿Por qué queremos ver las PWA en Google Play Store?

PWA amplían las posibilidades de las web apps normales acercandonos a este concepto hasta ahora sólo visto en las apps nativas

Posiblemente una de las ventajas de las Progressive Web App frente a las apps nativas es que no requieren instalación, pero continuamos con la obsesión de hacer app todo lo que el usuario maneja. Estamos en la década de las apps en contraposición a la web. Empujados por todo el marketing para ser descubierto en la tienda, las estadísticas de retención y, claro está, ciertas capacidades nativas que abren el abanico de posibilidad más allá de abrir un enlace o tener un acceso directo a una PWA en el móvil. Así que inevitablemente tenemos que estar presente en las tiendas de aplicaciones, en este caso en Google Play.

Cualquiera de nosotros que trabaje en la industria del desarrollo de aplicaciones móviles ha visto la insistencia de nuestros jefes o clientes por tener una app. Una forma de diferenciarse y de en cierta forma retener al usuario. Enviando notificaciones push o teniendo al usuario geolocalizado y, sobre todo, siempre logueado en nuestra plataforma para que pueda interactuar con ella, sin tener que esperar a que se registre de nuevo en el navegador o no pierda la sesión.

PWA amplían las posibilidades de las web apps normales acercandonos a este concepto hasta ahora sólo visto en las apps nativas:

  • Podemos acceder offline o incluso cuando la conectividad es pobre
  • Podemos mantener fidelizado a los usuarios a través de notificaciones push
  • En contraposición a las web normales, podemos utilizarlas a pantalla completa y ser enlazadas con un acceso directo en la pantalla de inicio.
  • La nueva información puede ser sincronizada aunque la app esté cerrada, gracias a los service workers
Service Worker Progressive Web App

El punto de inflexión técnico pasa por las Trusted Web Activity

Si alguna vez has desarrollado una aplicación Android te sonarán los Webview. Este componente permite abrir páginas web incrustadas dentro de las apps. Más tarde llegaron las Chrome Custom Tab que tenían la capacidad de retener la sesión del usuario comportándose como una pestaña más del navegador, pero con aspecto de browser.

Pero todo eso no era suficiente, ya que seguiamos teniendo muchas limitaciones, como si de una página web se tratase, sin caché entre sesiones, ni tener ninguna de las ventajas de una PWA siendo incapaz de funcionar offline, por ejemplo.

Así que el equipo de Chrome empezó a desarrollar las Trusted Web Activities, lo que permitiría manejar las apps webs en full screen y consever la caché y servicios en background como los imprescindibles service worker de las Progressive Web App.

Aquí tenéis un vídeo de la presentación en el pasado Chrome Web summit.

Una Trusted Web Activity ejecuta un Chrome a pantalla completa dentro de una app Android, sin la interfaz visible dejando de parecer un navegador. Esta poderosa capacidad necesita, por supuesto, que el desarrollador de la app valide las URLs que se van abrir verificando su legitimidad. Todo ello a través de los Digital Assets Links.

Ya que una TWA tiene acceso a todas las funcionalidades de Chrome, podemos ir mucho más allá en el uso de que le dábamos hasta ahora a las WebView en Android. Algunas de las principales características son las web push notifications, la sincronización background, el autorelleno de formularios, Media Source Extension o las Sharing API.

Todo el contenido de una TWA debe cumplir, por supuesto, las mismas políticas para desarrolladores que hasta ahora para una app normal. Además de alcanzar ciertos criterios de rendimiento utilizando Lighthouse como herramienta de referencia: con al menos una puntuación de 80.

Progressive Web App

Opciones para desarrollar una Progressive Web App como “WebAPK”

A día de hoy tenemos dos posibilidades para integrar una Progressive Web App dentro de una APK Android.

  • Como primera opción si no tenemos extensos conocimientos de Android, podemos usar el esqueleto desarrollado como experimento por el equipo de Google: SVGOMG / Trusted Web Activity. Donde tal sólo debemos centrarnos en modificar el Android Manifest verificando los recursos a través del Digital Asset Links. Aquí tenéis una guía más exhaustiva de cómo hacerlo.

  • Otra posibilidad es integrar directamente en una app ya creada el componente de Trusted Web Activity disponible en la Support Library, por supuesto, sigue siendo obligatorio rellenar todos los campos del manifest para cumplir los requisitos de validación de la webapp.

Imagen | Maximiliano Firtman En Xataka Android | Las web apps lo tienen ahora más fácil en Android, Google Play hace más sencilla su subida y distribución

Trusted Web Activity: el punto de inflexión para que los desarrolladores puedan distribuir sus Progressive Web App en Google Play

11/02/2019
Artículo original

Trusted Web Activity: el punto de inflexión para que los desarrolladores puedan distribuir sus Progressive Web App en Google Play

Maximiliano Firtman, fue el primero que lanzó la noticia de la inminente posibilidad que las Progressive Web App puedan ser distribuidas en Google Play Store como apps de primer nivel. Es decir, que las PWA sean integradas con todas las funcionalidades que gozan en el navegador pero ejecutadas desde una APK y distribuidas a través de la tienda de aplicaciones.

Tal como comenta Maximiliano en su artículo en medium, desde que en Mayo del 2018 en Chrome Summit presentará las Trusted Web Activity se abría la puerta a un integración sin complejos de las PWA en Android. Es decir, utilizando todas las capacidades integradas de Chrome 72. Más allá de un limitado Webview o una ChromeTab con aspecto de navegador.

¿Por qué queremos ver las PWA en Google Play Store?

PWA amplían las posibilidades de las web apps normales acercandonos a este concepto hasta ahora sólo visto en las apps nativas

Posiblemente una de las ventajas de las PWA frente a las apps nativas es que no requieren instalación, pero continuamos con la obsesión de hacer app todo lo que el usuario maneja. Estamos en la década de las apps en contraposición a la web. Empujados por todo el marketing para ser descubierto en la tienda, las estadísticas de retención y, claro está, ciertas capacidades nativas que abren el abanico de posibilidad más allá de abrir un enlace o tener un acceso directo a una PWA en el móvil. Así que inevitablemente tenemos que estar presente en las tiendas de aplicaciones, en este caso en Google Play.

Cualquiera de nosotros que trabaje en la industria del desarrollo de aplicaciones móviles ha visto la insistencia de nuestros jefes o clientes por tener una app. Una forma de diferenciarse y de en cierta forma retener al usuario. Enviando notificaciones push o teniendo al usuario geolocalizado y, sobre todo, siempre logueado en nuestra plataforma para que pueda interactuar con ella, sin tener que esperar a que se registre de nuevo en el navegador o no pierda la sesión.

PWA amplían las posibilidades de las web apps normales acercandonos a este concepto hasta ahora sólo visto en las apps nativas:

  • Podemos acceder offline o incluso cuando las conectividad es pobre
  • Podemos mantener fidelizado a los usuarios a través de las push notificaiones
  • En contraposición a las web normales, podemos utilizarlas a pantalla completa y ser enlazadas con un acceso directo en la pantalla de inicio.
  • La nueva información puede ser sincronizada aunque la app esté cerrada, gracias a los service workers
Service Worker Progressive Web App

El punto de inflexión técnico pasa por las Trusted Web Activity

Si alguna vez has desarrollado una aplicación Android te sonarán los Webview. Este componente permite abrir páginas web incrustadas dentro de las apps. Más tarde llegaron las Chrome Custom Tab que tenían la capacidad de retener la sesión del usuario comportándose como una pestaña más del navegador, pero con aspecto de browser.

Pero todo eso no era suficiente, ya que seguiamos teniendo muchas limitaciones, como si de una página web se tratase, sin caché entre sesiones, ni tener ninguna de las ventajas de una PWA siendo incapaz de funcionar offline, por ejemplo.

Así que el equipo de Chrome empezó a desarrollar las Trusted Web Activities, lo que permitiría manejar las apps webs en full screen y consever la caché y servicios en background como los imprescindibles service worker de las Progressive Web App.

Aquí tenéis un vídeo de la presentación en el pasado Chrome Web summit.

Una Trusted Web Activity ejecuta un Chrome a pantalla completa dentro de una app Android, sin la interfaz visible dejando de parecer un navegador. Esta poderosa capacidad necesita, por supuesto, que el desarrollador de la app valide las URLs que se van abrir verificando su legitimidad. Todo ello a través de los Digital Assets Links.

Ya que una TWA tiene acceso a todas las funcionalidades de Chrome, podemos ir mucho más allá en el uso de que le dábamos hasta ahora a las WebView en Android. Algunas de las principales características son las web push notifications, la sincronización background, el autorelleno de formularios, Media Source Extension o las Sharing API.

Todo el contenido de una TWA debe cumplir, por supuesto, las mismas políticas para desarrolladores que hasta ahora para una app normal. Además de alcanzar ciertos criterios de rendimiento utilizando Lighthouse como herramienta de referencia: con al menos una puntuación de 80.

Progressive Web App

Opciones para desarrollar una Progressive Web App como “WebAPK”

A día de hoy tenemos dos posibilidades para integrar una Progressive Web App dentro de una APK Android.

  • Como primera opción si no tenemos extensos conocimientos de Android, podemos usar el esqueleto desarrollado como experimento por el equipo de Google: SVGOMG / Trusted Web Activity. Donde tal sólo debemos centrarnos en modificar el Android Manifest verificando los recursos a través del Digital Asset Links. Aquí tenéis una guía más exhaustiva de cómo hacerlo.

  • Otra posibilidad es integrar directamente en una app ya creada el componente de Trusted Web Activity disponible en la Support Library, por supuesto, sigue siendo obligatorio rellenar todos los campos del manifest para cumplir los requisitos de validación de la webapp.

Imagen | Maximiliano Firtman

Cómo instalar un certificado HTTPS en IIS Express para desarrollo en local

11/02/2019
Artículo original

En mi último post te contaba cómo podías generar un certificado HTTPS válido para poder hacer desarrollo en local usando conexiones seguras (necesarias para usar ciertas APIs de HTML5), incluso simulando el dominio real que se usará en la aplicación final. El método vale para cualquier sistema operativo y genera certificados válidos solo para la máquina local, por lo que son perfectos para desarrollo. Ahora toca ver cómo montar ese certificado en tu servidor local de desarrollo. Cada uno tiene su método. Yo me voy a ocupar de IIS Express.

Si trabajas en Windows y con tecnologías Microsoft lo más probable es que para desarrollar utilices el servidor Web IIS Express. Éste viene incluido con Visual Studio, pero también te lo puedes descargar de manera individual desde el enlace anterior para poder usarlo manualmente. Yo, por ejemplo, lo uso mucho con Visual Studio Code y para ahorrarme escribir las instrucciones para lanzarlo en cada proyecto, hago uso de esta extensión de Warren Buckley.

IIS Express es una versión auto-contenida del servidor Web de Microsoft, Internet Information Server, que permite utilizarlo en local y trabajar en un entorno de ejecución idéntico al que tendrías en un servidor, incluso desde versiones cliente de Windows, como Windows 10. Ambos productos son virtualmente idénticos, salvo por cuestiones de licencias y modos de actualización, por lo que es una buena manera de desarrollar en local en un entorno muy parecido (casi idéntico) al que tendrás en producción. Las mayores diferencias son estas:

  • A priori IIS Express solo sirve páginas en local, no hacia otros equipos de la red, aunque existen maneras de saltarse esa restricción (y puedes usar ngrok para hacerlo muy fácil).
  • IIS Express no se ejecuta como un servicio, por lo que debes lanzarlo a mano cada vez que lo necesites.
  • IIS Express no tiene una interfaz visual de gestión como sí ocurre en el caso de su hermano mayor IIS. Como no hay "IIS Manager", debes gestionarlo todo de manera manual, lo cual implica normalmente una de dos cosas: o tocar directamente el archivo de configuración o utilizar algunas instrucciones específicas desde la línea de comandos.

Para el caso que nos ocupa, montar un certificado HTTPS para uso local, este último punto nos complica bastante la vida en IIS Express (en IIS convencional es muy sencillo y realmente no hay que hacer nada más que gestionarlo con un "applet" específico para certificados que hay en el IIS Manager). Otras tareas son mucho más simples, pero la de adjuntar un certificado para SSL / HTTPS en IIS Express es bastante complicado hasta que das con la manera de hacerlo, como veremos enseguida.

Una vez que sabes hacerlo es rápido de hacer, pero a mi me llevó en su día algunas horas de probar y pelearme con diversos comandos. La información disponible en la Red al respecto no es muy buena tampoco, por lo que espero que esto le pueda servir a más gente (y a mi mismo en el futuro, para no olvidarme).

¡Vamos allá!

1.- Instalar el certificado en el sistema

El primer paso tras haber generado el certificado es, obviamente, instalarlo en el sistema.

En Windows, el formato de certificado más sencillo de utilizar es el formato PKCS12. Ya hemos visto como se generan, así que asegúrate de que lo estás generando así, y que el archivo final tiene la extensión .p12:

Para instalarlo en el sistema solo tenemos que hacer doble-clic sobre ese archivo. Se abrirá un diálogo con un asistente y es prácticamente darle a "Siguiente" y poco más. Realmente lo único importante son dos cosas:

1.- Asociarlo a la máquina local y no al usuario actual:

2.- Que se nos pide la clave con la que está protegida la información del certificado, sin la cual no podremos instalarlo. Si lo has generado tal y como explico en el anterior artículo, la clave que debes utilizar es "changeit" (sin las comillas), como se ve en esta captura:

Una vez hecho esto el certificado estará instalado en el almacén de certificados de la máquina local y listo para ser utilizado por IIS Express.

2.- Configurar http.sys para usar el nuevo certificado

http.sys es el componente de núcleo de sistema de IIS. Es decir, es el componente de bajo nivel que se encarga de recibir y procesar en primera instancia todas las peticiones del protocolo HTTP (y HTTPS) que llegan a una máquina que tienen IIS funcionando. De hecho este componente es el que se utiliza en Windows desde la versión 2.2 de .NET Core para servir aplicaciones de ASP.NET Core en lugar de Kestrel, aumentando de paso mucho el rendimiento.

Bien, para que nuestro certificado pueda asociarse luego a IIS Express es necesario que primero lo tenga registrado y reconocido este componente.

Por defecto el http.sys de IIS Express trae configurados 100 puertos, del 44300 al 44399, para ser utilizados con HTTPS, para lo cual incluye su propio certificado SSL "falso". Al contrario que el nuestro, este certificado no es reconocido correctamente los navegadores, por lo que mostraría un mensaje de seguridad como el que mostré en el artículo anterior. Puedes comprobarlo de manera sencilla escribiendo la siguiente instrucción en la línea de comandos del sistema:

netsh http show sslcert

que mostrará todos los puertos que responden a HTTPS y los certificados que utilizan:

Como puedes observar en esta captura, todos los puertos (aquí solo se ven 2 de los 100) tienen asignado el mismo certificado, cuyo hash para identificarlo comienza por d54c0... que es el resumen digital del certificado "chungo" que nos ha instalado IIS Express.

Aunque, por supuesto, puedes utilizar el puerto estándar 443 para usar el certificado, yo suelo ceñirme a esos puertos del 44300 en adelante para evitar que si pones un servidor de desarrollo distinto en la misma máquina pueda haber interferencias, que es por lo mismo que ellos lo hacen así. Pero lo que voy a explicar ahora es válido también si quieres usar el puerto 443 u otro cualquiera.

Lo primero que debemos hacer es averiguar el resumen digital del certificado que hemos creado e instalado. Tenemos dos formas de conseguirlo:

1.- Ir a la gestión visual de certificados (abriendo mmc.exe y añadiendo el complemento de certificados para la máquina local) y verlo directamente en sus propiedades (propiedad Thumbprint):

2.- Usar Powershell para obtenerlo directamente, con un comando:

Get-ChildItem -path cert:\LocalMachine\My

que nos muestra los certificados actualmente instalados:

Normalmente verás 3 (si tienes el de IIS Express aún instalado) o bien 2 como en mi captura, que se corresponden respectivamente con el certificado para HTTPS y para firmar código u otros certificados. El que nos interesa es el primero que lo podemos reconocer porque su nombre común (propiedad CN) NO comienza con "mkcert" o, de hecho ni siquiera tiene el CN establecido (en la figura, el primero).

Si quieres tener la seguridad de cuál es o poder ver con detalle todas las propiedades puedes escribir:

Get-ChildItem -path cert:\LocalMachine\My -recurse | ForEach-Object{ $_.Subject }

que te mostrará la propiedad "Subject" con estos datos completos por pantalla:

Si quisieses ver con detalle todas las propiedades y no solo esta deberías crear un mini-script de Powershell un poco más complejo, en concreto este:

$certs=get-childitem cert:\localmachine\my -recurse | select * 
    foreach($cert in $certs){
        foreach($prop in $cert.psobject.properties){
            write-host "$($prop.name) - $($prop.Value)"
        }
    }

Pero si tienes que llegar a esto solo para un certificado es mejor que vayas directamente a la MMC. Aquí tienes una buena referencia de estos comandos.

Bien, volviendo al tema que nos ocupa, una vez que tienes el thumbprint del certificado, lo que debes hacer a continuación es asignarlo al puerto que te interese, en mi ejemplo el 44300.

Dado que yo ya tengo asignado ese puerto, por defecto, a otro certificado, antes de nada tengo que eliminarlo para lo cual debo escribir desde PowerShell (o desde la línea de comandos) como administrador:

netsh http delete sslcert ipport=0.0.0.0:44300

En tu caso si no está asignado o usas otro puerto que no esté asignado (como el 443) no es necesario que lo hagas.

Ahora debes añadir el certificado al puerto correspondiente, para lo cual la instrucción necesaria es:

netsh http add sslcert ipport=0.0.0.0:44300 certhash=XXXX appid={214124cd-d05b-4309-9af9-9caa44b2b74a}

siendo XXXX el thumbprint de tu certificado en letras minúsculas (esto es importante), que has averiguado hace un momento. El appid es el identificador de IIS Express, que en mi caso es ese que se ve en la línea anterior, pero que dependiendo de la versión que ses puede variar. Lo puedes ver en la salida de netsh http show sslcert que comentaba al principio en cualquiera de las entradas por defecto que mete IIS Express.

3.- Enlazar el puerto a tu aplicación web

Vale, ahora solo nos resta crear un sitio web en IIS que responda a las peticiones del puerto al que hemos asignado el certificado. Para ello debemos hacer 2 cosas:

3.1.- Agregar el certificado a IIS

Para lo cual nos movemos desde la línea de comandos a la carpeta de IIS Express (generalmente "C:\Program files\ IIS Express") y usamos el comando:

IisExpressCmdAdminCmd.exe setupSslUrl -url:https://localhost:44300 -CertHash:XXXX

siendo XXXX el thumbprint de nuestro certificado (esta vez puede ir en mayúsculas como el original).

3.2.- Crear un nuevo sitio web que apunte a la carpeta apropiada

En este caso el comando a utilizar es:

appcmd.exe add site /name:"PruebaSSL" /bindings:https:/*:44300:localhost /physicalpath:"C\carpeta"

que creará un nuevo sitio web llamado "PruebaSSL" enlazado al puerto 44300 (o el que tú hayas querido utilizar) y que apuntará a la carpeta de disco que te interese para servir la aplicación o sitio web.

Con esto ya está todo listo y podrás lanzar tu nuevo sitio web con SSL simplemente escribiendo:

iisxpress /site:PruebaSSL

De modo que todo está ya funcionando y podrás ver tu sitio web en acción con HTTPS activado:

¡Espero que te resulte útil!

Crea tu propia página o blog gratis con Jekyll y Github: Parte 3 - Personalizando el sitio

11/02/2019
Artículo original

A lo largo de esta serie ya has aprendido a construir un primer sitio estático con Jekyll y a llenarlo de contenido, aprendiendo a ponerlo en funcionamiento en local. Ahora vamos a entender cómo está estructurado tu sitio y cómo procesa Jekyll cada parte, para poder hacer cualquier modificación y construir nuevos sitios desde cero.

Vamos a estudiar el lenguaje de plantillas que usa Jekyll, basado en un lenguaje de marcado denominado Liquid. De esta forma, podremos componer nuestras propias plantillas y parciales, que nos permitirán reunir los componentes necesarios para un nuevo sitio estático básico.

Marcado Liquid y variables

El marcado Liquid, creado por Shopify, no es exclusivo de Jekyll, sino que es un lenguaje común a otros motores de plantillas. La funcionalidad que ofrece es muy limitada, con la intención de que su ejecución sea segura, aunque tiene algunas características que lo asemejan a un lenguaje de programación. Este marcado tiene tres ingredientes básicos: los objetos, las etiquetas y los filtros.

Los objetos son marcas del tipo {{ nombre }} que permiten sustituir variables por su valor en una página. Por ejemplo, el código <h1>{{ site.title }}</h1> en una plantilla resultaría en una cabecera de primer nivel conteniendo el título del sitio web.

Los principales objetos que se pueden usar al componer plantillas para Jekyll son site y page. El primero contiene las variables que forman parte de la configuración del sitio y el contenido (por ejemplo, los posts). El segundo alberga los metadatos de la página que se está renderizando, de forma que cuando una plantilla se aplique a varias páginas, page tendrá diferentes datos para cada una. Este objeto tiene algunos datos de uso común, como page.title o page.date. Además, en los datos iniciales o front matter de cada página se pueden establecer variables personalizadas que serán accesibles como propiedades de page. Puedes encontrar la referencia completa de variables disponibles por defecto en la documentación de Jekyll.

Las etiquetas forman la lógica de la plantilla, y se escriben entre los delimitadores {% y %}. Mediante estas, Liquid proporciona variables, control de flujo con condicionales, e iteración con bucles. En el siguiente ejemplo, asignamos un valor a la variable cat, iteramos a lo largo de los posts del sitio web buscando aquellos cuya categoría coincida con cat.

{% assign cat = "Programación web" %}

Posts en la categoría "{{ cat }}":
<ul>
  {% for post in site.posts %}
    {% if post.category == cat %}
      <li>{{ post.title }}</li>
    {% endif %}
  {% endfor %}
</ul>

Por último, los filtros son similares a los métodos en lenguajes de programación: se aplican sobre objetos y devuelven otros resultados. En su mayoría, sirven para trabajar con cadenas de caracteres y configurar con precisión cómo deben mostrarse los objetos en las páginas.

Para aplicar un filtro a un objeto, se añade tras una barra vertical y se especifican parámetros tras dos puntos. Por ejemplo, si en la configuración del sitio tenemos definido author: david entonces el código siguiente mostrará "Por David":

{{ site.author | capitalize | prepend: "Por " }}

Los filtros disponibles se recogen en la documentación de Liquid, pero Jekyll añade algunos que están explicados en su propia documentación.

Estructura de un sitio Jekyll

Cualquier sitio estático Jekyll tiene tres partes diferenciadas: las plantillas o layouts, las parciales o includes y el contenido.

Plantillas

Las plantillas recogen la estructura general aplicable a las páginas del sitio web. Generalmente hay al menos dos: default.html y post.html. La primera establece la estructura base de cualquier página, y la segunda añade el marcado necesario para las correspondientes a artículos.

En este contexto contamos con un objeto importante: content, que representa el contenido de la página a la que se le está aplicando la plantilla. Para mostrar el contenido, por tanto, es crucial insertar {{ content }} en el punto que deseemos. A continuación incluyo una ejemplo escueto de lo que sería una plantilla default.html adecuada para nuestro sitio:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>{{ page.title }}</title>
    <link rel="stylesheet" href="https://www.campusmvp.es/recursos/assets/css/estilo.css">
  </head>
  <body>
    <header>
      <div class="content">
        <h1><a href="https://www.campusmvp.es/recursos/">{{ site.title }}</a></h1>
      </div>
    </header>
    <main>
      <div class="content">
        {{ content }}
      </div>
    </main>
    <footer>
      <div class="content">
        <p>&copy; {{ "now" | date: "%Y" }} {{ site.author }}</p>
      </div>
    </footer>
  </body>
</html>

Para aplicarle esta plantilla a una página, simplemente habrá que especificarlo en los datos iniciales de la misma. Por ejemplo, las primeras líneas de la página index.html serán las siguientes:

---
layout: default
title: Página principal
---

Las plantillas pueden heredar unas de otras de forma que no tengamos que repetir nada de código. Para ello, las tratamos como cualquier otra página e insertamos su propia sección de datos. Así, podemos construir plantillas para tipos de páginas específicos basadas en la plantilla por defecto. La plantilla correspondiente a los artículos de nuestro nuevo sitio estático será post.html con el siguiente contenido:

---
layout: default
---

<article>
  <h2>{{ page.title }}</h2>
  
  {{ content }}
</article>

<time datetime="{{ page.date | date: "%Y-%m-%d" }}">{{ page.date | date: "%d/%m/%Y" }}</time> por {{ site.author }}

Parciales

Las parciales o includes en Jekyll son trozos de código que separamos para poder reutilizarlos en múltiples puntos de nuestro sitio web, por ejemplo, tanto en la página principal como en la plantilla de algún otro tipo de páginas. En ocasiones también se separan partes del código que sólo se van a usar una vez con la intención de aligerar las plantillas y producir archivos independientes con propósitos más específicos (uno para la cabecera del sitio, otro para el pie de página, etc.).

En nuestro caso, vamos a ejemplificar el uso de parciales mediante una lista de enlaces para compartir posts en redes sociales. Además, haremos uso de la funcionalidad de parámetros, para añadir versatilidad a la parcial. Tendremos un parámetro denominado url al que accederemos desde el objeto include.url como ves en el ejemplo a continuación:

<div class="share">
  <a href="https://twitter.com/intent/tweet?text={{ include.url | absolute_url }}" class="tw">Twitter</a>
  <a href="https://t.me/share/url?url={{ include.url | absolute_url }}" class="tg">Telegram</a>
</div>

Para utilizar esta parcial en nuestras plantillas, simplemente tendremos que utilizar la etiqueta correspondiente: {% include share.html url=post.url %}. Podemos hacer esto en la página principal para la lista de artículos y en la plantilla post.html.

Contenido y otros directorios

El contenido, como ya sabes, se guarda principalmente en la carpeta _posts. Sin embargo, no es el único tipo de contenido que Jekyll puede procesar. Adicionalmente, podemos utilizar otras colecciones: carpetas con contenido diferente al de los posts, con las que se puede trabajar de la misma forma para crear sus propios índices y páginas. La diferencia principal que guardarán con los posts es que no irán nombradas con la fecha de publicación, sino que pueden tener cualquier nombre.

Por ejemplo, para añadir una colección travel necesitaríamos crear un directorio _travel donde incluir el contenido (archivos que Jekyll sepa procesar, como Markdown) y añadir las siguientes líneas a la configuración general del sitio (en el archivo _config.yml):

collections:
  travel:
    output: true

Para mostrar un índice de la colección, añadiremos una página a la raíz del sitio con el permalink /travel/ y el bucle que convenga para iterar sobre los elementos:

---
layout: default
permalink: /travel/
title: Mis viajes
---

{% for item in site.travel %}
  <p><a href="{{ item.url }}">{{ item.title }}</a></p>
{% endfor %}

Si el contenido que queremos almacenar y mostrar no consta de documentos sino de datos, Jekyll permite procesar datos en YAML, JSON y CSV en la carpeta _data. El archivo _data/ejemplo.csv estará accesible en el objeto site.data.ejemplo del sitio web, de forma que se pueda iterar a través de sus elementos y mostrarlos de la forma conveniente.

Por último, cualquier archivo que esté almacenado en un directorio que no comience por guion bajo y, si es de texto, que no tenga una sección de datos iniciales, no será procesado por Jekyll sino copiado directamente al sitio resultante.

Esto nos permite, por ejemplo, crear un directorio assets/ o similar que contenga todos los archivos de estilo y scripting necesarios. Si queremos que Jekyll los procese porque son archivos SCSS o CoffeeScript, entonces será necesario incluir una sección de datos vacía al principio de dichos archivos, como ya hemos visto.

En la figura a continuación te muestro un posible resultado al utilizar los ejemplos anteriores y añadir algo de estilo para construir un sitio estático desde cero:

Algunas páginas especiales

En Jekyll y GitHub Pages, algunas páginas aparte del contenido nos pueden ser útiles y se pueden tratar de forma especial, las siguientes son las más relevantes:

index.html

La página index.html de la raíz del proyecto es el punto de entrada para las personas que visiten nuestra web. Si seguimos el ejemplo del capítulo anterior en cuanto a paginación, el archivo puede tener simplemente este contenido:

---
layout: default
title: Página principal
---

{% for post in paginator.posts %}
<article>
  <h2>
    <a href="{{ post.url }}">{{ post.title }}</a>
    {% include share.html url=post.url %}
  </h2>
  {{ post.excerpt }}
  <a href="{{ post.url }}">Seguir leyendo</a>
</article>
{% endfor %}

<nav class="pagination">
  {% if paginator.previous_page %}
  <a href="{{ paginator.previous_page_path }}">Más nuevo</a>
  {% endif %}

  {% if paginator.next_page %}
  <a href="{{ paginator.next_page_path }}">Más antiguo</a>
  {% endif %}
</nav>

Nota: Es muy importante no imponer un permalink a este tipo de páginas, puesto que interfiere con el sistema de paginación de Jekyll.

atom.xml

A partir de cualquier colección se puede construir un feed con formato Atom para lectores RSS. El siguiente es un pequeño ejemplo del posible contenido de atom.xml que albergaría los posts más recientes en el sitio:

---
layout: none
---

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>{{ site.name | xml_escape }}</title>
    <link>{{ site.url }}</link>
    <atom:link href="{{ site.url }}/atom.xml" rel="self" type="application/rss+xml" />
    {% for post in site.posts limit:10 %}
    <item>
      <title>{{ post.title | xml_escape }}</title>
      <description>{{ post.content | xml_escape }}</description>
      <pubDate>{{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }}</pubDate>
      <link>{{ site.url }}/{{ post.url }}</link>
      <guid isPermaLink="true">{{ site.url }}/{{ post.url }}</guid>
    </item>
    {% endfor %}
  </channel>
</rss>

404.html

Si servimos nuestro sitio desde GitHub Pages, el archivo 404.html nos permite mostrar un error personalizado cuando se trate de acceder a una página inexistente en nuestro sitio. Para ello, simplemente podemos rellenarla con un mensaje de error y un enlace a la página principal, como en el ejemplo a continuación:

---
layout: default
---

<h2>404</h2>

<p>No hemos encontrado esa página. <a href="https://www.campusmvp.es/recursos/">Volver al inicio</a></p>

Con esto hemos dado un buen repaso a la estructura de un sitio con Jekyll y lo básico de creación de plantillas. Tienes el código con los ejemplos que hemos tratado para que puedas empezar ya a experimentar con un sitio funcional. Para lanzar el sitio basta con ejecutar en una terminal bundle y luego bundle exec jekyll serve.

En el siguiente capítulo de esta serie trataremos temas avanzados relativos a la compilación del sitio en la nube, y el uso de plugins para añadir funcionalidad al sitio.

Esta extensión para Chrome ayuda a los programadores a aprender algo nuevo cada vez que abren una pestaña

09/02/2019
Artículo original

Esta extensión para Chrome ayuda a los programadores a aprender algo nuevo cada vez que abren una pestaña

30 seconds of knowledge (30 segundos de conocimiento) es una extensión para Chrome que quiere ayudarte a ser un mejor desarrollador una nueva pestaña a la vez. Para ello muestra una mini lección de código cada vez que abres una nueva pestaña en el navegador.

Desde su configuración podrás elegir los lenguajes de programación en los que quieres hacerte mejor, y la extensión te mostrará un trocito de código con un par de consejos breves en cada nueva pestaña.

De momento la extensión soporta seis categorías: JavaScript, React, PHP, Python, CSS, y preguntas de entrevistas. Quizás los desarrolladores web la encuentren especialmente útil. Las mini lecciones pueden ser una forma divertida y breve de aprender algo simple y nuevo.

30 seconds of knowledge

Si alguno de los consejos que ves son sobre algo que ya dominas, puedes desactivarlo para no volver a verlo nunca más. La idea es que cada uno sea tan sencillo que te baste con invertir hasta menos de un minuto en ello, de ahí el nombre.

Entre todas las categorías tienen más de 500 piezas de código que enseñarte. Puedes copiar y pegar los segmentos en tu propio editor para ir probando, y los segmentos en CSS puedes previsualizarlos en vivo usando herramientas como CodePen.

Breves segmentos de código que puedas entender en 30 segundos o menos y siempre a la mano cuando abres una nueva pestaña en el navegador

Gran parte de las lecciones vienen de otros proyectos open source como 30 seconds to code, una web de la que hablamos hace algún tiempo en el consigues minilecciones de JavaScript para entender en 30 segundos o menos.

Esto no es ni de cerca un reemplazo para cualquier plataforma educativa, online o IRL, pero es un complemento interesante que puede ser útil, y algún consejo a la mano, tan a la mano como al abrir cada pestaña del navegador, es una buena forma de asegurarte de aprender algo nuevo con frecuencia.

Instalar | 30 Seconds of Knowledge

Humble Bundle Intro to Code, paga menos de un euro por un paquete de cursos sobre programación y desarrollo de videojuegos

08/02/2019
Artículo original

Humble Bundle Intro to Code, paga menos de un euro por un paquete de cursos sobre programación y desarrollo de videojuegos

Desde su nacimiento hace ya varios años en Humble Bundle constantemente ofrecen ofertas en las que el usuario puede pagar tan poco como un dólar por todo tipo de contenido, principalmente videojuegos.

Con el tiempo la plataforma se han expandido sus productos a ofertas de libros, cómics, software (que compartimos con frecuencia en Genbeta), y ahora también tienen disponibles cursos online. Su más reciente bundle ha sido llamado "Intro to Code" y ofrece más de 1.300 dólares en cursos por una ínfima fracción de su precio.

Para esta oferta en Humble se han asociado con Zenva Academy, una plataforma australiana especializada en cursos de programación a través de vídeos, prácticas, y la creación de proyectos.

Además, al momento de pagar por tus cursos puedes elegir cuánto dinero se dirige a la plataforma y cuánto a las diferentes caridades que apoya el bundle.

Paga tan poco como 0,88 euros por cinco cursos de programación con certificación

El paquete incluye un total de 25 cursos sobre desarrollo de videojuegos, desarrollo web, visión computarizada, machine learning, inteligencia artificial, ciencia de datos y más.

Puedes pagar tan poco como 1 dólar (0,88 euros) por el primer paquete de cinco cursos:

Captura De Pantalla 2019 02 07 A Las 14 27 56
  • Aprende programación en Python creando un juego
  • Introducción al desarrollo de videojuegos
  • Matrices y vectores Numpy
  • Aprende HTML y CSS creando un sitio web responsivo
  • El curso completo sobre diseño web responsivo

Si pagas 12,77 euros o más del promedio en ese momento, puedes acceder a ocho cursos más:

Captura De Pantalla 2019 02 07 A Las 14 28 07
  • Proyectos de realidad virtual - experiencia con la plataforma de vuelo
  • Crea un juego road crossing con Phaser 3
  • Crea un juego para enseñar español con Phaser 3
  • Aprende Angular creando una aplicación web
  • Blender para principiantes
  • Crea tu primer juego 3D
  • Aprende JavasScript creando un juego móvil
  • Empezando con SQL

Si pagas unos 21,94 euros te llevas todos los cursos anteriores junto a los 12 cursos restantes:

Captura De Pantalla 2019 02 07 A Las 14 30 07
  • Generación procedimental de contenido con Unity
  • Proyectos de realidad virtual - experiencia de fotos 360
  • Construye un juego de mascota virtual con Phaser 3
  • Procesamiento de imágenes con Python - Crea filtros al estilo de Instagram
  • Crea un cámara de seguridad inteligente con Raspberry Pi
  • El curso completo sobre redes neuronales artificiales
  • Desarrollo de videojuegos RPG
  • Efectos de sonido y bandas sonoras en Unity
  • Manipulación de datos con Pandas
  • La guía completa de Bootsrap 4
  • Descubre jQuery - Crea sitios web interactivos
  • Crea una ciudad RPG con NPCs y diálogos

Todos los cursos ofrecen certificados, acceso de por vida las 24 horas del días y los 7 días de la semana, soporte de expertos, recursos del proyecto para descargar, y subtítulos. Todos los cursos son en inglés.

Página Siguiente