Crea una skill Flash Briefing Alexa

Hola,

Relacionado con el post anterior, voy a explicar como crear una skill de tipo flash briefing de alexa.

Una skill flash briefing, consiste en una skill que se dedica a leer un feed rss e incluirlo en la skill de noticias de alexa, entonces, si activamos una skill flash briefing de noticias del NYTimes, cuando digamos, “Alexa, dime las noticias del día” las noticias que haya en el feed incluido en nuestra skill se incluirán a las noticias base que te dice Alexa.

Es muy sencillo e intuitivo, en un ratejo, tendremos una skill válida para la promo de
European Alexa Perks Program

Comenzamos, primero habría que crear una cuenta de amazon developer. Es bastante intuitivo, hay datos que aunque ponga que son obligatorios no lo son.

Después habría que ir al panel de skills de alexa. Deberemos pulsar sobre create Alexa Skill: alexa01.PNG

Por ejemplo, yo voy a crear una skill que te devuelva noticias del blog oficial de league of legends, seleccionad Flash Briefing – Provision your own:

alexa02.PNG

A continuación hay que insertar un mensaje de error genérico y crear el feed de noticias:

alexa03.PNG

Rellenamos los datos y le damos a add:

alexa04.PNG

le damos a save:

alexa05.PNG

Ahora pasamos a la pestaña distribución y rellenamos lo siguiente:

alexa06.PNG

alexa07.PNG

Save and continue. Ahora nos pregunta cosas sobre el contenido, todo no y rellenad las instrucciones, save and continue:

alexa08.PNG

En el siguiente paso, no tocamos nada, salvo la región donde se publica, yo como he creado la skill en ingles UK, voy a publicarla en UK e Ireland.

alexa09.PNG

Una vez cumplimentado tardara un rato:

alexa10.PNG

Y al acabar solo quedará publicar, nos vamos a submission y submit for review.

alexa11.PNG

Y ya hemos acabado, en unos días nos llegará un mail y nos dirán si todo ha ido bien o por lo contrario debemos corregir algo, en tal caso, vendré a actualizar el post 🙂

Cualquier duda que tengas, escribe un comentario.

Y si tienes tiempo, y te ha servido el tutorial de ayuda, instala y prueba mis skills 😉

US: https://www.amazon.com/dp/B07ZRKMK21

ES: https://www.amazon.es/dp/B0813S4R9F

GB: https://www.amazon.co.uk/dp/B0815378X8

 

 

 

European Alexa Perks Program

Ya hacia tiempo que no escribía, y hoy es buen día, tengo tiempo y ganas. Os voy a hablar del European Alexa Perks Program, este es un programa promoción de Amazon Alexa, dirigido a desarrolladores para que desarrollen sus primeras skills en alexa, pero vamos por pasos, ya que igual aquí nadie sabe de que estoy hablando:

Alexa es un asistente de voz desarrollado por Amazon, la competencia directa de google home. Por un lado está el software, denominado Alexa, que puedes instalar en muchos dispositivos Android/iOS así como pueden ser smartphones, tablets, smart TV, o el propio hardware de Amazon que ya lo contienen, los aparatos para domótica Echo, aparatos especificos para funcionar exclusivamente con Alexa.

Aquí os dejo unos enlaces para que les echeis un ojo:

Y que es una Skill pues es una “app” de Alexa, que a partir de comandos de voz, te permite realizar alguna acción, ya puede ser conseguir información o más tecnicamente, llamar a un servicio web.

Pues bien, en resumen, por hacer skills hay premios:

  • Por publicar 1 skill, te ganas un echo dot
  • Por publicar 3 skill y conseguir 75 activaciones únicas, te llevas el echo show 5
  • Por añadir APL a tu skill y conseguir 150 activaciones únicas te llevas el Amazon Echo Show.
  • Y solo para desarrolladores en Alemania, Austria, UK y Irlanda 🙁 si haces una app con pagos y consigues 150 activaciones únicas, te llevas un examen de certificación pagado AWS skill builder.

Así que nada, a crear vuestras aplicaciones, aquí os dejo 2 que he hecho yo, y si necesitáis ayuda o queréis uniros a un grupo de desarrolladores de Alexa escribidme un comentario.

US: https://www.amazon.com/dp/B07ZRKMK21

ES: https://www.amazon.es/dp/B0813S4R9F

 

Migración

Escribo este post rápido, simplemente para decir que he migrado a otro con dominio y servidor propio, en el he exportado todos los datos que había, así que no se perderá nada, pero no borro este por si en un futuro quisiera volver a *.wordpress.com.

Bienvenidos seáis a blog.jjorda.com.

Métodos asíncronos en Spring

springframework

Spring es como ya sabréis el framework por excelencia en todo desarrollo J2EE actual. Por tanto, no es extraño que tenga implementado algún modo de ejecutar código de manera asíncrona sin tener que crear molestos threads.

Vamos a ejemplificarlo todo con un caso real, imaginemos que tenemos que llamar a 2 servicios distintos, uno nos da ciudades y otro nos da personas, y queremos devolverle al usuario de la lista de ciudades que tenemos relacionada con la lista de personas que tenemos. Para poder hacer esta relación, necesitaremos la respuesta de ambos servicios. Sí cada servicio tarda 3 segundos en responder, de forma síncrona, la ejecución de todo tardará (6 segundos + lo que tarde nuestro código), pero si lo hacemos de manera asíncrona, solo tardaremos (3 + nuestro código).

Entonces… ¿De que manera se ha resuelto esto? con anotaciones, inyección y la mágica interfaz Future.

Primero que nada, deberemos poner la anotación @EnableAsync en la clase que llamará a los metodos asincronos, asi estará preparada para hacerlo.

async1

Luego tendremos que crear los métodos asíncronos, estos deberán de ir en otra clase, que será inyectada a la anterior como servicio. Estos métodos tendrán que tener la anotación @Async y deberán devolver un objeto Future que contendrá la información que necesitamos.
async2

Y ahora tendremos que llamar a estos métodos, y esperar que los 2 se hayan ejecutado para seguir con nuestro código. Para saber si el método se ha ejecutado ya, lo que haremos, será llamar al método isDone() de Future.
async3

Ahora solo queda usar la imaginación para llegar al máximo rendimiento en vuestras aplicaciones y evitar todos los cuello de botella posibles.

Spring.io Async method
Github Async method

Como documentar tus servicios con JSONDoc

JSONDoc easily generate docs and playground for your RESTful API

Para un programador, el trabajo más molesto y coñazo es y siempre será el documentar. Además según que metodología se use tienes diferentes inconvenientes.

Sí usas metodología en cascada, probablemente cuando acabe un proyecto la documentación a la realidad se parecerá lo que un huevo a una castaña, a menos que, claro está, se haya ido actualizando en cada cambio, cosa que no suele ocurrir.

En cambio si utilizas una metodología ágil, lo mejor es usar una herramienta como la que te voy a describir a continuación, ya que si la forma de documentar no es igual de ágil que la forma de programar, se suele postergar y te sueles comer el marrón de documentarlo todo el último día.

JSONDoc es una librería Java que sirve para documentar tus servicios Rest dinámicamente a través de anotaciones. Es decir, en el mismo sitio que desarrollas el servicio web tienes la propia documentación, estas propias anotaciones pueden sustituir al Javadoc y a partir de ellas se generará una web interactiva en la que ver la información de los servicios, es decir: rutas, versiones, parámetros de entrada/salida, ¡incluso probarlos!

Por lo que he visto esta librería se la ha currado Fabio Maffioletti y tiene todo su código en github por si tenéis interés en hurgar, forkear, etc. También tenéis toda su documentación en la que está basado este articulo en su página oficial

Empecemos, lo primero será irse a Maven Central a Buscar la última versión que haya salido, en ella buscamos jsondoc todo junto, en este caso, la ultima versión es la 1.0.4.

Captura de pantalla de la página de maven central con la búsqueda de jsondoc

Aquí mismo podemos ver las dependencias necesarias para hacer funcionar esta librería:

<dependency>
    <groupId>org.jsondoc</groupId>
    <artifactId>jsondoc-core></artifactId>    
    <version>1.0.4</version>
</dependency>

<!-- Si usáis Spring MVC, usad esta librería en vez de core -->
<dependency>
    <groupId>org.jsondoc</groupId>
    <artifactId>jsondoc-springmvc</artifactId>
    <version>1.0.4</version>
</dependency>

<!-- JSONDoc necesita la librería de reflections para funcionar -->
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections-spring</artifactId>
    <version>0.9.9-RC1</version>
</dependency>


Ojo: Si usais Spring MVC, usad jsondoc-springmvc, si no josondoc-corejsondoc-springmvc contiene josondoc-core, poner las dos es una tontería.

Estad atentos a las versiones de jsondoc vs reflections usáis, ya que a mi por ejemplo la versión 1.0.4 de jsondoc no era compatible con la 0.9.9 de reflections, en cambio si que lo fue con la que os he puesto en el código.

Ahora si usáis spring MVC queda poco por hacer, simplemente declaráis el bean de jsondoc en vuestro fichero de contexto:

<mvc:annotation-driven />
<context:component-scan base-package="tu.paquete.base" />
 
<bean id="documentationController" 
class="org.jsondoc.springmvc.controller.JSONDocController">
  <property name="version" value="1.0" />
  <property name="basePath" value="http://localhost:8080/api" />
  <property name="packages">
    <list>
      <value>com.mycompany.controller</value> 
      <value>com.mycompany.pojo</value> 
      <value>org.external.stuff</value>
    </list>
  </property>
</bean>

Tendréis que sustituir los valores de ejemplo por los paquetes que correspondan de vuestro proyecto:

  • version: la versión de tus servicios, es solo informativo.
  • basePath: la url al root de tus servicios.
  • packages: lista de paquetes que escaneará por reflexión para buscar la documentación que incluyas con sus anotaciones.

En el caso de que no uséis Spring MVC la única diferencia es que tendrás que crear tu propio JSONDocController en la tecnología que a ti te interese, yo lo hice en Apache CXF y no tuve grandes problemas. Es posible que publique como hacerlo en otro articulo.

Ahora, podremos llamar al servicio /jsondoc y nos devolverá un json con toda la información de los servicios que hayamos documentado, como en este momento, no hemos documentado ninguno, nos devolverá una estructura vacía.

Finalmente, para poder leer el json que nos proporciona esta librería, tenemos en el github de JSONDoc jsondoc-ui, que es una página dinámica que interpreta este json, solo hace falta meter en la barra superior la url completa de nuestro servicio de jsondoc y tendremos una página de documentación bastante intuitiva y práctica. Aquí tenemos un ejemplo de la página de JSONDoc.

Y ya solo queda documentar, documentar y documentar, es decir a empezar a poner anotaciones, aquí os pongo un ejemplo de un controller y otro de un pojo sacados del github de Fabio:

https://gist.github.com/jjorda/043aa2faf4dc1b759e10

https://gist.github.com/jjorda/acc58a64e4f8060e76b4

Espero que os sea de tanta utilidad como a mi.
Documentación de JSONDoc
GitHub de JSONDoc

 

Como te puede salvar el culo Spring Roo

Spring Roo es un RAD(rapid aplication development) esto significa que cuando tienes poco tiempo para un desarrollo te puede salvar el culo.

Con Roo puedes crear un crud (tanto web como servicios rest) en muy poco tiempo, ¿como? pues con su consola de comandos, roo tiene su herramienta que se ejecuta desde cualquier consola de comandos (windows, linux o mac) y a partir de ella, con comandos relativamente sencillos vas generando código que luego se convertirá en nuestro rápido backend.

Hace una semana tuve la oportunidad, necesitábamos hacer una aplicación con servicios rest que consistía en cuatro tablas relacionadas entre si que también debían ser (si era posible) modificables y visibles para el cliente, y todo esto tenía que hacerse con un margen de tiempo muy pequeño.

Entonces me acordé de Roo, hace tiempo en un proyecto en el que estuve, que por suerte o por desgracia no llegué a estar mucho tiempo lo usaban, así que siempre me quedó el gusanillo de usar esta tecnología en un entorno real. No era mi primera experiencia, ya hice un tutorial hacía un año y me quedé alucinado, así que está era la mía. Después de dos días en los que me pegué con problemas con la exportación a eclipse (recomiendo usar el eclipse que proporciona Spring STS). Y un par de errores en el script que hice. Ya tengo en la máquina de desarrollo la aplicación corriendo de manera totalmente funcional.

Todavía queda pasar algunas pruebas de QA y el pase a producción. Pero la verdad me he quedado encantado con el resultado.

Para que este post no quede en solo texto, aquí dejo un ejemplo rápido de un script de Roo:


// Seleccionamos el directorio en el que estamos como el root del proyecto
// y elegimos el nombre que tendrán los paquetes
project --topLevelPackage com.jjorda.example

// Elegimos Hibernate para la persistencia y elegimos que nuestra base
// de datos será MySQL. Esto nos generará un fichero llamado
// database.properties que deberemos editar con los datos de conexión de
// nuestra db.
jpa setup --provider HIBERNATE --database MYSQL

//definimos la entidad
entity jpa --class ~.domain.Message --testAutomatically
field string --fieldName title
field string --fieldName content

// Definimos el dao
repository jpa --interface ~.repository.MessageRepository --entity ~.domain.Message

// Definimos la capa servicio/fachada
service type --interface ~.service.MessageService --entity ~.domain.Message

// Lo siguiente te crea la capa de servicios y la capa web del crud
json all --deepSerialize
web mvc json setup
web mvc json all --package ~.web
web mvc setup
web mvc all --package ~.web

 

Y con esto ya tenemos el crud creado, en cuanto despleguemos en un servidor, la base de datos se creará gracias a hibernate y nuestra aplicación estará accesible para ser usada.

Pero… a mi me gusta programar, no escribir scripts.
No te preocupes, una vez tengas el crud creado, tendrás tiempo para escribir la lógica que te falta exportando el proyecto a eclipse.

Más adelante escribiré un post detallado desde como configurar Roo hasta el despliegue en un servidor Tomcat.

Página del proyecto de Spring Roo
http://projects.spring.io/spring-roo/

Tutorial de principiantes Spring Roo
http://docs.spring.io/spring-roo/reference/html/beginning.html

Interstitial Banner con Google Mobile Ads en juego de Unity

Hoy os voy a enseñar, como añadir un banner del tipo interstitial dentro de un juego usando unity con el plugin de Google Mobile Ads. En este enlace podeis ver como se instala el plugin en un proyecto de Unity.

Para el que no lo conozca, un Interstitial es un banner que aparece ocupando toda la pantalla. Necesitamos mostrarlo en un momento que no moleste al jugador, por ejemplo justo después de morir, o antes de comenzar una partida. De lo contrario el jugador se frustrará y dejará de jugar a nuestro juego / usar nuestra app.

Ahora pasemos al código, es bastante sencillo y parecido al ejemplo anterior, primero debemos cargar el Interstitial, y lo hacemos de este modo:

using GoogleMobileAds.Api;
...
// Initialize an InterstitialAd.
 interstitial = new InterstitialAd (TU_KEY_DE_ADMOB);
 // Create an empty ad request.
 AdRequest request = new AdRequest.Builder ().Build ();
 // Load the interstitial with the request.
 interstitial.LoadAd (request);

A continuación lo que debemos hacer es mostrarlo, esto no hacía falta en el caso del banner normal. Importante: Debemos mostrar el interstitial en un momento en el que la App/Juego esté parado, de lo contrario, el juego se bloqueará con el anuncio encima y el jugador perderá el progreso / perderá la partida.

Para mostrarlo tenemos que ejecutar su método Show, pero no olvidemos comprobar antes si está cargado.

if (interstitial.IsLoaded()) {
  interstitial.Show();
}

Este es el resultadoad_screenshot_intersitial

Para más detalles del plugin de Google Mobile Ads para Unity, os dejo este enlace para que le echéis un vistazo al resto del paquete, hay otras opciones como filtrar la publicidad metiendo algunos datos del usuario, por ejemplo, si es hombre o mujer, edad, …

Integrar Admob en Unity para un proyecto Android

Hola, empezamos con un tutorial de Unity, que es lo que mas entretenido me tiene últimamente: Lo primero que hace falta es descargar el paquete del plugin Google Mobile Ads aquí. Después lo importaremos a nuestro proyecto de Unity. import_google_admob_unity Después de esto hay que añadir la carpeta de google-play-services_lib contenida dentro de la carpeta del sdk de android que tengas en  /extras/google/google_play_services/libproject al directorio de tu proyecto Plugins/Android. add_google_play_services Ahora ya podemos usar Google Mobile Ads en nuestra app, lo siguiente será generaremos nuestro primer banner de publicidad, para ello necesitaremos el id de un banner que hayamos dado de alta en la página de AdMob. admob_id_example Y por último ya solo queda el código que genera el banner.

using GoogleMobileAds.Api;
...
// Create a 320x50 banner at the top of the screen.
BannerView bannerView = new BannerView(
        "ID_DE_TU_BANNER", AdSize.Banner, AdPosition.Top);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the banner with the request.
bannerView.LoadAd(request);

En este caso crea un banner en la parte de arriba de la pantalla de 320×50. Podemos cambiar el tamaño del banner o la posición tal que:

using GoogleMobileAds.Api;
...
// Create a 320x100 banner at the top of the screen.
BannerView bannerView = new BannerView(
        "ID_DE_TU_BANNER", new AdSize(320, 100), AdPosition.Bottom);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the banner with the request.
bannerView.LoadAd(request);

y este sería el resultado: ad_screenshot

Queda un poco feo el banner tan gordo y con huecos a los lados. Así que vamos a probar un valor que hay por defecto que es el AdSize.SmartBanner:

using GoogleMobileAds.Api;
...
// Create a 320x50 banner at the top of the screen.
BannerView bannerView = new BannerView(
        "ID_DE_TU_BANNER", AdSize.SmartBanner, AdPosition.Bottom);
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the banner with the request.
bannerView.LoadAd(request);

y este es el resultado final:ad_screenshot_smart

 

Por último, recordaros que para todo esto debéis tener bien configurado el JDK con su JAVA_HOME y su Path. Yo lo tenía mal y no me compilaban las librerías de google. En el siguiente post intentaré explicar como poner un ad de tipo interstitial.