19 septiembre 2014

[Google App Engine] Usando Bitbucket para Push-to-Deploy (traducción)

Traducido de Google Cloud Platform Blog

Algunos meses atrás, extendimos el soporte para realizar Push-to-Deploy con repositorios GitHub. Hoy estamos felices de extender el soporte para Push-to-Deploy con repositorios Bitbucket Git. Conectando tu proyecto AppEngine con tu repositorio Bitbucket, puedes lanzar el despliegue de tus aplicaciones Java, Python o PHP haciendo push a tu branch master en Bitbucket.

Push to Deploy automatiza el proceso de construcción, pruebas y despliegue lanzado por medio de tus comandos de git. Esto hace la distribución de cambios en el código para tu aplicación de forma fácil, segura y rápida. Adicionalmente, a través del manejo de tu despliegue en Google Cloud Platforms te brinda acceso a otras interesantes herramientas devops tales como Log to Source linking.

"Los usuarios de Bitbucket pueden facilmente desplegar sus aplicaciones para Google App Engine." dijo Jens Schumacher, Group Product Manager para Atlassian. "Con Push-to-Deploy, los desarrolladores pueden lanzar un despliegue al hacer push al master branch del repositorio o por combinar un pull request aprobado en Bitbucket".

Vayamos a través de un ejemplo.

Conectando el repositorio


  1. Dirígete al Google Developers Console y crea un proyecto o haz click sobre un proyecto existente que desees sincronizar con Bitbucket.
  2. Haz click sobre Source Code y luego sobre Browse en el panel de navegación izquierdo.

  3. El siguiente paso es enlazar el repositorio de tu proyecto en Bitbuket.

    Si tu proyecto no tiene un repo git o tiene un repo git vacío, llegarás directamente a la página "Source Repository Settings". Haz click en "Connect" debajo del logo de Bitbucket.
    Si tu proyecto no tiene un repo git vacío, verás una pantalla listando el contenido actual del repositorio. Puedes cambiar la configuración del repositorio para conectarlo a Bitbucket (toma en cuenta que esto sobreescribirá el contenido actual del repositorio de tu proyecto). Haz click sobre el ícono de Settings para acceder a la página "Source Repository Settings" mostrada anteriormente y luego haz click sobre "Connect" debajo del logo de Bitbucket.
  4. Serás redirigido a Bitbucket para autenticarte y obtener permisos para tus repositorios Bitbucket. Haz click en "Grant access". Te podría solicitar que ingreses a cuenta de Bitbucket.
  5. Una vez que hayas obtenido acceso, verás una lista de todos los repositorios Bitbucket Git a los que tienes acceso. Escoge el repositorio que desees conectar con tu proyecto.
  6. Lee y acepta y la opción de consentimiento en el cuadro de dialogo y haz click en Connect.
  7. El repositorio Bitbucket ahora aparece en la página Repo Settings
  8. Puedes configurar tu flujo de despliegue siguiendo estas instrucciones
  9. Una vez que tu flujo de despliegue está configurado, cada vez que hagas push a tu master branch del proyecto en Bitbucket usando git push origin master el código fuente será desplegado al App Engine. La página Release también te muestra el estado de los despliegues pasados y del actual.
-Publicado por Rae Wang, Product Manager
-Traducido por Armando Picón

Esta fue una traducción del post original (en inglés): Using Bitbucket for Push-to-Deploy

04 junio 2014

Un vistazo a Google Cloud Platform

Uno de los temas de los que he venido conversando con los chicos últimamente es la plataforma en la nube que se conoce como Google Cloud Platform. Esta plataforma te permite desplegar aplicaciones web, almacenar data y analizarla, construir el backend de aplicaciones mobiles y varias cosas. Lo bueno es que se cuenta con una plataforma escalable y robusta.

Esta plataforma se compone de varios servicios como se muestra en la siguiente gráfica:


Como se puede apreciar contamos con tres grandes categorías Compute, Storage y App Services:

  • App Engine: la PaaS (Plataforma como servicio) de Google, nos permite desplegar aplicaciones web desarrolladas con Python, Java, PHP y Go. También, podemos interactuar con diferentes APIs de los servicios de Google. Se cuenta con un paquete básico gratuito que le viene bien a las startups.
  • Compute Engine: la IaaS (Infraestructura como servicio) de Google, nos permite la creación de máquinas virtuales a partir de imagenes predefinidas o crear con nuestras propias configuraciones. Actualmente, se cuenta con la posibilidad de emplear sistemas operativos como Debian, CentOS, CoreOS, entre otros. Recomendado para quienes requieran un alto nivel de cómputo.
  • Cloud Storage: el servicio de almacenamiento de objetos de Google, cuenta con APIs que permiten el consumo de datos desde otros servicios como App Engine, Compute Engine, etc.
  • Cloud SQL: si requerimos de una base de datos relacional en la nube, este es el servicio que debemos emplear, basado en MySQL; el mantenimiento? se lo dejamos a Google quien nos garantiza una base de datos con una buena performance y de alta disponibilidad.
  • Cloud Datastore: la base de datos NoSQL, libre de esquemas y data relacional, puede crecer de acuerdo a nuestras necesidades, con soporte a transacciones y a consultas tipo SQL.
  • BigQuery: si hablamos de consultas a grandes conjuntos de datos y a un tiempo reducido, sin duda, esto es BigQuery. Escalable y de fácil uso, nos permite explotación de conjuntos de datos que en sistemas normales podrían llevarnos horas.
  • Cloud Endpoints: nos permite construir servicios RESTful para el consumo de aplicaciones mobiles, cuenta con protección contra ataques de denegación de servicios (Denial-of-Service), soporte OAuth 2.0 y más.
  • ...y otros servicios como Prediction API, Translate API y el reciente Cloud DNS.
Si quieres saber quiénes emplean Google Cloud Platform puedes visitar el siguiente enlace.

Hace poco la gente de Google hizo un esfuerzo y preparó este site en Github lleno de ejemplos sobre cómo emplear las diversas APIs y tecnologías.

Finalmente, les comparto una presentación que empleé hace poco para dar un vistazo a lo que la plataforma ofrece:


Otros enlaces útiles:

11 mayo 2014

Taller de Android - FLISOL Lima Este 2014

No hace mucho, el 26 de abril para ser más precisos, tuve oportunidad de dictar un taller sobre Android como parte del evento FLISOL Lima Este 2014 al cual fui invitado como miembro del GDG Open. Les comparto los slides que usé para mi presentación.


Enlace: FLISOL Lima Este 2014

12 febrero 2014

Un nuevo comienzo... con Python

Recientemente, estoy entrando de lleno a ver Python como un lenguaje alternativo al que uso diariamente (java). He tenido oportunidad de ver el uso de este lenguaje y también he visto aplicaciones que amigos míos han desarrollado, realmente, he quedado gratamente encantado con ello por la simpleza que hay en este código. Entonces, tras ver su aplicación en el desarrollo de aplicaciones web y desktop, en la administración de servidores, en la ejecución de tareas del sistema operativo (uso Linux) y saber que se puede aplicar en otros campos más, pues es claro que este lenguaje tiene mucho potencial y que sería buenísimo aprender a usarlo. 

Cuando empecé a explorar este lenguaje, un detalle interesante cuando empleas el Python Interpreter es que al ingresar la sentencia "import this" nos aparecerá el Zen de Python, el cual contiene un listado de principios de diseño y la filosofía que hay detrás de este lenguaje y que nos puede ayudar a entender un poco más cómo es que funciona.

The Zen of Python, by Tim Peters

Beautiful is better than ugly. (Hermoso es mejor que feo)
Explicit is better than implicit. (Explícito es mejor que implícito)
Simple is better than complex. (Simple es mejor que complejo)
Complex is better than complicated. (Complejo es mejor que complicado)
Flat is better than nested. (Plano es mejor que anidado)
Sparse is better than dense. (Disperso es mejor que denso)
Readability counts. (La legibilidad cuenta)
Special cases aren't special enough to break the rules. (Casos especiales no son lo suficientemente especiales para romper las reglas)
Although practicality beats purity. (Aunque la practicidad le gana a la pureza)
Errors should never pass silently. (Los errores nunca debería pasar silenciosamente)
Unless explicitly silenced. (A menos que sea silenciado explicitamente)
In the face of ambiguity, refuse the temptation to guess. (De cara a la ambigüedad, rechace la tentación a adivinar)
There should be one-- and preferably only one --obvious way to do it. (Debería haber una -- y preferiblemente solo una -- forma obvia de hacerlo)
Although that way may not be obvious at first unless you're Dutch. (Aunque esa forma pueda no ser obvia al principio, a menos que seas holandés)
Now is better than never. (Ahora es mejor que nunca)
Although never is often better than *right* now. (Aunque nunca es frecuentemente mejor que "ahora mismo")
If the implementation is hard to explain, it's a bad idea. (Si la implementación es difícil de explicar, es una mala idea)
If the implementation is easy to explain, it may be a good idea. (Si la implementación es fácil de explicar, puede que sea una buena idea)
Namespaces are one honking great idea -- let's do more of those! (Los namespaces son una gran idea -- hagamos más de aquellas!)

Ya les iré comentando como me va con este nuevo lenguaje, es el inicio de una nueva etapa.

25 enero 2014

Problema entre Unity y los Menúes del Dart Editor en Ubuntu 13.10

Cuando ejecutas el Dart Editor en Ubuntu 13.10, los menues se integran a Unity y eso impide que podamos desplegarlos. Para evitar ello, por el momento, ejecuté los siguientes comandos desde el terminal para levantar el editor. Tomen en cuenta que las rutas que estoy empleando son las que tengo en mi PC por lo que en otros casos esta variará.

sudo env UBUNTU_MENUPROXY=/home/armando/Dev/dart/DartEditor
sudo /home/armando/Dev/dart/DartEditor

Sin duda esto constituye un workaround, asi que seguiré buscando una forma definitiva y permanente para solucionarlo.

26 noviembre 2013

[Anecdota] La vida más sencilla con servicios online: Reniec, PNP, Interbank y Google

El día de hoy tuve la mala fortuna de extraviar mi billetera (o cartera como se le llama en otros países) con mis documentos, tarjetas y dinero, por cierto, fue la primera vez que me ocurre un hecho de esta naturaleza en mi vida. Sin embargo, ante la situación en que me vi envuelto era necesario actuar con cierta prontitud, asi que armado de mi laptop y mi modem, empecé a realizar los trámites de modo virtual:

La denuncia, para evitar cualquier incidente por la pérdida del DNI es necesario acercarse a una comisaría para efectuar una denuncia, sin embargo, la Policía Nacional del Perú (@policíaperu) ha habilitado en su servicio de comisaría virtual la opción de Pre-Registro de Denuncias, mediante el cual puedes registrar una denuncia indicando la comisaría en la que se realizará la confirmación, de esta forma basta con acercarte a la comisaría y confirmar la denuncia pre-registrada. También sirve para realizar denuncias anónimas.

El bloqueo de tarjetas, una simple llamada desde mi celular al 013119000, y unas cuantas pulsaciones en el teclado de mi celular, fueron suficiente para hacer el bloqueo rápido de todas mis tarjetas vía la banca celular de Interbank (@interbank), no tuve necesidad de conversar con nadie, lo cual me parece genial porque ante una emergencia la acción es inmediata. Quizá algo para mejorar es dejar el número de la central telefónica un poco más visible en su web.

El duplicado de mi documento de identidad, tiempo atrás cuando se me venció mi DNI (sí señores, acá en el Perú, los DNIs vencen), tuve que acercarme hasta la oficina misma de la Reniec (@reniecdigital) para realizar un trámite que me hacía perder varias horas de largas colas; hoy en día eso ya cambió, gracias a los Servicios en línea, disponibles en su portal web puedo de forma sencilla y rápida realizar el trámite para la obtención del duplicado que estaba necesitando. Basta con realizar el pago correspondiente en cualquier agencia del Banco de la Nación o BCP y listo, con los datos de la boleta, el trámite sale en un, dos por tres! Y el servicio te da la fecha aproximada de entrega y un número de consulta :D

La impresión de la constancia. Bueno, del trámite anterior era necesario imprimir una constancia y San Google (@google), fue de mucha ayuda, gracias a su servicio Google Cloud Print (aun en beta), el cual permite agregar una impresora adicional y puedo, enviar mi documento para su impresión a una impresora remota conectada a la nube o bien enviar el documento en formato PDF a mi Google Drive. Un magnifico servicio.

Y así, muchas cosas que antes se hacían de forma presencial o manual, hoy en día se ven aligeradas gracias a los servicios online!! :D

Creando un Custom Portlet Service con Maven y sin RAD

En la entrega anterior les mostré como desarrollar un portlet básico sin RAD. En esta ocasión nos toca ver cómo desarrollar un Custom Portlet Service para WebSphere Portal, obviamente sin RAD y empleando Maven.

Lo primero que vamos a necesitar es el archivo public_spi.jar que contiene algunas de las clases e interfaces que requeriremos para desarrollar el portlet service. Habitualmente este archivo se encuentra en una ruta similar a esta: /doc/compile.

Luego, nos valemos de Maven para agregar este jar a nuestro repositorio de dependencias.

mvn install:install-file -Dfile=public_spi.jar -DgroupId=com.ibm /
-DartifactId=public-spi -Dversion=1.0 -Dpackaging=jar
A continuación, creamos un proyecto simple con Maven y agregamos las dependencias correspondientes a la api portlet 2.0 y al jar que acabamos de agregar.

Ahora crearemos una interfaz que contendrá la declaración de métodos públicos que se expondrán a través del servicio y, obviamente, crearemos también la clase que la implementará:


En este punto, debemos generar el JAR del servicio para luego registrarlo en el Portal.

  • Colocamos el jar en la ruta: /wp_profile/PortalServer/config
  • En la consola del WAS del Portal, registraremos el portlet service valiéndonos del Resource Environment Provider llamado "WP PortletServiceRegistryService".
  • Creamos  un nuevo registro en los Custom Properties. En el nombre ingresamos jndi.pe.apiconz.portletsapps.portletserviceexample.MyPortletService y en el valor colocamos el nombre completo de la clase que lo implementa: pe.apiconz.portletsapps.portletserviceexample.MyPortletServiceImpl.
  • Guardamos y reiniciamos el portal.
La invocación del portlet service que acabamos de crear sería como sigue:


18 noviembre 2013

Google Maps - Ejemplo sencillo de multimarcadores

Aquí les dejo un ejemplo sencillo de multimarcadores empleando Google Maps API. Para la visualización de este ejemplo necesitan una API KEY que pueden generar en http://cloud.google.com/console.

El ejemplo debería verse de la siguiente manera:
El código lo dejo a continuación: