Posts Tagged ‘google’


Me gustan los comics, pero más me gusta coleccionarlos. Es decir, tener la certeza de que tengo las series completas y verificar la secuencia de los mismos: no hay nada mas satisfactorio que saber que completaste una serie. En el mundo Cómic muchos apuestan por el tema digital, pero creo que el cómic impreso tiene para largo, porque la sensación es distinta al del libro, quizá sea porque en un cómic hay mas tinta y sangre puesta.

Desde que Peru21 empezó a publicar su serie de cómics a precio accesible, empecé con este hobbie al punto que puedo decir que tengo todas sus publicaciones. Otras editoriales empezaron como Editorial VUK, Skull Editores, Med Comics y después de todos estos años puedo decir que he pasado por la experiencia completa del coleccionista. Es por eso que me puse a trabajar en una aplicación que ya está lanzada el día de hoy: SuperComics como una forma de facilitar la experiencia del coleccionista.

¿Cuál es la experiencia del coleccionista? Pues en estos puntos los resumo:

  • Cronograma: Si sabes cuando van a publicarse tus cómics, se hace más fácil estar al día. Es tan crítico, porque de lo contrario tendrías que estar dando vueltas a la tienda o al kiosco a cada rato y si bien hay ahora algunas tiendas especializadas en cómics, no es fácil darse un tiempo para visitarlas. Con un cronograma se puede controlar cuáles cómics ya tienes y cuáles te faltan.
  • Inventario: Debes poder llevar un control de los cómics que ya tienes. La clásica es que te compras el cómic en un kiosco, y por ahí que caíste por el centro comercial arenales y te diste una vuelta por las tiendas de cómics, viste una carátula interesante y te la compras para darte cuenta en tu casa de que ya la tenías. Llevar la cuenta es clave.
  • Lista de compras: A pesar de los cronogramas, siempre sucede de que te faltó comprar un cómic, o que por esas cosas, perdiste alguna y necesitas reponer así que tendrás que ir a la tienda, kiosco, feria o evento donde esté la editorial. Tendrás que ir apuntando correctamente cuáles son los cómics que te faltan en una lista, aunque para evitar confusiones, tienes que llevar la carátula.
  • Tiendas: como ya dije hay algunas tiendas de cómics que van surgiendo, y algunos kioscos se han comprado el pleito de ofrecer cómics. Personalmente, hay una señora en Jesús María que incluso me guarda los cómics para no perder ninguno, y cruzando la calle hay otra tienda super caleta que te venden el mismo cómic con tu bolsicartón gratis y en bolsita, super cool. Lo malo es que si no conoces, estos lugares te los pasas sin darte cuenta. Otro ejemplo era la tienda de Perú 21 en el centro de Lima, donde podías comprar los cómics atrasados y encima el encargado te regalaba los posters de promoción, hasta ahora los tengo en su tubo porque ya me falta pared para colgarlos.

Finalmente, falta una que es el intercambio, porque si eres coleccionista, seguro que tienes repetidos que puedes cambiar o vender.

En la versión 2 de mi aplicación ofrezco las 4 primeras experiencias de tal forma que sea más fácil empezar a coleccionar, o para los que ya llevan algo de tiempo, controlar su colección más fácilmente.

La prioridad es saber lo que hay en este momento publicado y que ya se puede comprar. Por eso la pantalla de inicio comienza justamente con esos cómics:

screen01

screen14

Los 10 últimos cómics publicados se podrán ver en un carrusel, y si haces click en la portada verás todos los datos del mismo, así como la carátula completa.

screen01 screen09

Puedes ver el logo y el nombre de la colección, alguna nota importante, luego la carátula completa y si deslizas hacia abajo verás la información del cómic y sobre todo 3 botones:

  • Nola: marcas este botón si ya tienes el cómic, de tal forma que cuando regreses, podrás ver que ya lo tienes, porque habrá cambiado a “Yala”, como hacías con las figuritas de tu álbum.
  • Comprar: Si es que quieres comprar este cómic, al marcar este botón se agregará a tu lista de compras, de tal forma que los tendrás a la mano cuando vayas a la tienda. El botón se cambiará a “Lista” cuando hayas agregado el cómic.
  • Social: Podrás compartir orgulloso la carátula del cómic y sacarle pica a tus amigos de que ya lo tienes o que te gustó. Este botón te dará la opción de compartir la carátula en las redes sociales que tengas instalado en tu equipo.

Desde aquí, podrás ir casi a donde quieras:

  • Regresar al inicio: Para ver nuevamente el carrusel de comics recién publicados
  • ¿Que otros títulos tiene esta serie?: Al costado del nombre de la colección hay un punto blanco con una flecha hacia arriba. Haciendo click ahí, podrás ver la lista completa de títulos en esa seríe, al menos los que ya han sido anunciados. En algunos casos, la editorial publica un cronograma completo y podrás ver la serie completa con fechas de publicación y todo. Algo como esto:

screen15

Donde podrás ordenarlos o buscar en los títulos. El botón blanco con la flecha esta vez te llevará hacia la pantalla de la editorial:

screen06

Donde verás las otras series publicadas por esta casa, también con la opción de ordenar y buscar.

Ahora prestemos atención a los 4 botones de la parte de abajo:

  • Novedades: Es una sección secreta del app donde estarán los cómics últimos registrados. O sea que puede que aún no estén disponibles en tiendas. Si la editorial la ha anunciado con anticipación, la encontrarás en esta sección.

screen13

  • Catálogo: Encontrarás otro carrusel con los logos de todas las editoriales que publican localmente, ya sea directamente o a través de algún socio. Es el caso de editoriales gringas como Marvel, Dc, Image, Dark Horse, donde sus títulos son publicados por editoriales locales. Igual, si por ejemplo quieres ver donde está “The Walking Dead” la podrás encontrar tanto en Image como en Editorial Vuk, lo mismo para los otros títulos.

screen04 screen05 screen16

  • Compras: Si es que le diste a comprar en algún cómic, aquí es donde podrás ver tu lista de compras. De esta manera no vas a necesitar llevar tu papelito o acordarte de memoria cual querías comprarte. Después que te compres el cómic, no olvides de desmarcarlo para mantener tu lista de compras ordenada.

screen17

  • Tiendas: ¿Quieres saber donde comprar tus cómics? Pues en esta sección verás algunas de las tiendas que más se dedican al tema, y por supuesto, también he puesto el kiosco en Jesús María donde siempre compro los mios. Personalmente les recomiendo este lugar porque suele tener muchos de los números antiguos sobre todo los de Peru21. Podrán ver las tiendas en una lista, pero también en un mapa.

screen11 screen12

Inicialmente, sólo estaban incluidos cómics o “grapa” como se le dice en la jerga, pero gracias a la amabilidad de Skull Editores, ya se ha incluido su colección de Spawm que es un TPB con 4 números en cada volúmen. En la medida que reciba la información de las demás editoriales, las estaré incluyendo.

Y con esto terminamos las funciones que se pueden ver, ahora veamos las funciones que no se pueden ver:

  • Actualización automática: Salió un nuevo cómic o una editorial acaba de anunciar una nueva serie?. No te preocupes que la aplicación se actualizará automáticamente, sin que te pregunte ni nada.
  • Uso de datos: Ok, actualizar automático es cool, pero consume el saldo si no hay wifi. No te preocupes. Cuando descargues el app, viene incluida la última versión de la base de datos, lo que significa que descargarás solamente la nueva información, la cual es de mas o menos 24K por cómic. Saca tu línea: Si se publican 10 cómics en un día, recibirás una actualización de aprox 240 a 260K, casi nada. Además, si es que te quedaste sin saldo, igual podrás utilizar el app, y hacer de todo, menos el mapa que es la única función en línea. La opción Social también funcionará siempre con Whatsapp, ya que se puede usar sin saldo, Facebook te dirá que no puede subir la foto y las demás si te dirán que no tienes red.

En el futuro se vienen cosas interesantes:

  • Backup de la base de datos: Imagina que ya repasaste todo el catálogo y le diste Yala a todo. Sería una pena perder todo eso porque cambiaste de equipo. Pronto podrás hacer un backup de eso y tenerlo disponible para seguir controlando tu colección.
  • Integración con Facebook: Podrás compartir mas cosas en Facebook desde el mismo app.Además, con esto te podrás identificar de tal forma que puedas recuperar el backup de tu colección.
  • Intercambio/Venta de cómics: ¿Tienes cómics repetidos? ¿Te falta algún cómic? Podrás publicarlo y conectarte con los demás que estén en la misma situación.

La publicación en Google Play Store debe estar en unas dos semanas lista o antes. Con Apple, esto puede tomar algo más de tiempo. Con Windows Store para WP8, voy a demorar un poco más pues Microsoft está en transición así que esa versión me está demorando y si sale esa, podría también estar la versión para Windows 10.

Comentarios y sugerencias en este post, o también al correo del app en supercomics@supermio.com.pe


Aunque no tenga acceso a ninguno de estos dos equipos, podemos ver por las características sobre el papel y del rendimiento de los equipos de la generación anterior, como se comparan estas dos alternativas.

Primero, estas computadoras están orientadas para el trabajador móvil, tomador de notas que va desde el lápiz al teclado según sus necesidades y donde casi el centro de su productividad pasa por usar Office. Para ser más específicos, OneNote para la toma de notas con el lápiz, y Word, Excel y Powerpoint para la productividad de oficina tradicional con el teclado. En este caso, Pixel no ofrece una opción de lápiz, se supone que dejará que sus socios desarrollen esta opción

Ahora veamos punto por punto:

Sistema Operativo: Pixel C es android tal cual lo conocemos, mejor dicho Android 6 que vendrá con mejoras pero igual será muy parecido a lo que ya tenemos pero por sobre todo un sistema operativo de móviles.En el otro lado Windows 10 hace la diferencia.

Productividad: Office es aquí nuevamente la clave de todo. Como siempre en Surface tenemos la opción de ir por el full experience gracias a Office 365.

Teclado: Google si que la pensó bien al diseñar su teclado, ya que es rígido lo que significa que se puede utilizar sin problemas en cualquier circunstancia mientras que con Surface 4 siempre necesitaremos una mesa, de todas maneras, Surface ofrece un teclado con más funciones como el trackpad y el sensor de huellas.

Stylus: Pixel C no ofrece un stylus.

Batería: Google ofrece el Pixel C como un equipo de 10 horas de batería lo cual es aceptable para un tablet contra las 8 horas promedio que puede ofrece Surface 4

Precio: Obviamente Pixel C empieza más barato porque ofrece menos cosas, es así que comienza en 499 USD contra los 899 de Surface con stylus incluido. También el teclado aquí costará 150 USD en promedio.

En conclusión, Google diseño un gran teclado pero no es suficiente para hacer un gran producto.


Google tuvo un evento hace unos pocos días donde hizo el anuncio de algunos nuevos miembros de su línea Nexus. No fue un gran evento como los que hace Apple, pero creo que la gran noticia es que finalmente Microsoft puede decir que se adelantó a todos y nuevamente es el líder de una categoría nueva que podría llamarse Ultra Convertible como una evolución de los 2-1 y los híbridos.

Google Pixel C es un tablet basado en la última version de Android (Marshmellow) que viene con un teclado, tal como lo hace el Microsoft Surface y el Nuevo iPad Pro. También vimos los nuevos Nexus, fabricados esta vez por Huawei, donde lo más interesante es que soportan el Nuevo  Proyecto FI del que ya hablaremos mas tarde.

En fin, el punto aquí es que la tendencia ya se ha consolidado, tabletas de gran pantalla con un teclado casi igual al que tienen las laptops a fin de reemplazar a una para hacer trabajo “real”. Esto significa que estamos ante el reconocimiento en la industria de que para el trabajo fuerte, el touch no es suficiente.

En algún momento comenté que para el trabajo móvil incluso más importante que el procesador era la duración de la batería y parece que ya se ha consolidado este punto pues todas las opciones actuals ofrecen no menos de 10 horas de funcionamiento.

Pixel C trae otro punto importante y que justamente era la mayor observación que han tenido los equipos en esta categoría: El teclado y el tablet forman una estructura rígida tanto en su forma cerrada como en modo de trabajo. Si revisamos tanto el Surface como el iPad Pro, el teclado es un accesorio adicional que es casi como un case que se ajusta por magnetos. Cuando salió el Surface, la prueba que hacian era poner el equipo con el teclado sobre las piernas para trabajar como si fuera un laptop, algo que obviamente no era nada cómodo; y si hacemos la misma prueba con el iPad Pro seguramente tendrá los mismos resultados. Pixel C, gracias a su estructura sólida, sería el primer equipo en pasar el “lap test”.

El problema ahora es convencer a los trabajadores móviles de que esta es una alternativa real a una laptop, o para el trabajo en general. En este punto, Surface comienza con una ventaja pues es una computadora en todo sentido así que puede estar sujeta a las mismas herramientas de administración que ya tienen las desktops en una corporación.

En esta nueva categoría los factores principales pueden ser:

  • Batería: Surface sufre aquí pero tengamos en cuenta que tanto el iPad como Pixel C tienen Sistema operative de Tablet que no se compara con uno full como Windows 10. Igual estamos hablando de unas 2 o 3 horas menos de uso.
    • Una nota aparte es que Surface es un computadora complete por lo que para la gestión de energía tiene el ya famoso Connected Standby que pone a Surface en la misma categoría que las tablets, pero un Viejo truco del mundo PC es quien trae la ventaja: Hibernación. Yo uso la Hibernación en mi híbrido y hace lo que las tablets nunca podrán hacer: apagarse guardándo el estado, lo que significa que estas 7 a 8 horas de uso contínuo puede extenderse a muchas más horas cuando no utilicemos el equipo. Mientras la Surface en hibernación consume nada de energía, las tablets agotarán sus baterías. De todas maneras, Hibernación no es algo que Microsoft recomiende, pero igual es una alternativa.
  • Precio: Convenientemente Pixel C se ha puesto en el rango de los 500 USD igual que el modelo medio de Surface. Apple ya sabemos que no se mide y ha puesto un precio alto. En todos los casos tenemos que considerer los 150 usd adicionales en el teclado.
  • Sistema Operativo: Pixel C y iPad Pro son ambos tablets con un Sistema operativo limitado cuyo propósito es optimizer recursos antes que rendimiento. Windows 10 del Surface es el primer Windows que no tiene esa aureola de “tragón” que tenían los otros y ahora lo vemos trabajando muy bien incluso en formatos Tablets donde antes solo podíamos imaginar sistemas operativos ligeros como iOS o Android.

Fijense que luego de estos tres factores, podremos considerar todo lo demás casi igual. Por ejemplo, el tema del lápiz puede ser un tema interesante de análisis. Sólo diremos que mientras iPad Pro con su super Lápiz es todo lo contrario a lo que hizo Microsoft al incluir un lápiz menos “responsive”. Algo que solamente les importa a los que se dediquen al arte digital.

Microsoft puede estar saltando en un pie pues al final de cuentas todos estos equipos estarán ejecutando Microsoft Office, porque aceptémoslo, Google Docs ni Apple Page es tan Bueno. Esto también quiere decir que OneDrive tiene una oportunidad. Agreguemos las capacidades de integración que ya tiene Microsoft Office con la infraestructura corporativa y vemos que si es que por alguna razón sale un Surface con mejor batería (y un stylus de mejor rendimiento) podríamos ver un equipo top en su categoría marca Microsoft, algo no tan seguido por estos días.


Esta es una continuación de la serie sobre desarrollo en móviles que comencé aquí. Les recomiendo comenzar a escribir el código fuente desde la parte 1 ya que no se publica el código para descarga.

En la parte 8 dejamos el app con menus que permiten mostrar las noticias por categorías, pero faltaba cargar las categorías directamente de la base de datos, de tal forma que se vayan mostrando automáticamente las categorías nuevas.

Las categorías serán extraídas de la base de datos en una consulta bastante simple y debemos considerar lo siguiente:

  • Debemos poder establecer el orden en que se muestran las categorías. Para eso deberíamos agregar un campo que nos permita establecer el orden.
  • Debemos poder desactivar las categorías. Para eso también agregaremos un campo que indique el estado

Ok, hagamos esto primero entonces, felizmente tenemos pocas categorías. Para ejemplo, veamos como quedaría “cat_01”:


{
"_id": "cat_01",
"_rev": "2-df694a2ed157b1403baa2ca9214d801b",
"nombre": "Nacional",
"descripcion": "Noticias del país",
"tipo": "topic",
"orden":1,
"estado":1
}

Lo mismo para todas las demás categorías. Con estos cambios, consultaremos las categorías, las ordenamos por el campo orden y las filtramos por el campo estado.

Ahora para hacer la consulta tenemos dos alternativas:

  • Usando la clave principal: Todas las categorías tienen un id que comienza con “cat_” entonces podemos usar la clave por defecto. El orden será el orden de las claves: cat_01 luego cat_02 y así, igual podemos ordenarlo al mostrarlo.
  • Creando una vista: estaremos creando un índice solamente para recuperar categorías, ¿valdrá la pena? pues son pocas categorías así que aún no vale la pena ir por este camino.

Listo, ahora empieza lo complicado. Necesitamos que la lista de categorías sea pasado al estado inicial para que pueda ser mostrado. Recordemos que hemos definido un estado abstracto para incluir el sidemenu. Como en el ejemplo anterior, pasar datos a un estado requiere el uso de “resolve”, eso es fácil, lo  complicado es que tenemos que hacer la consulta a la base de datos para obtener esas categorias. Si revisan el archivo app.js, por ninguna parte hago alguna llamada al factory “db” que contiene todas nuestras operaciones por lo que si llamamos alguna operación de datos en el “app.js” simplemente fallarán porque acuerdense que inicializamos la factory db con el método db.init()  en el controlador “newsController” en la línea 8 del archivo “controllers.js” como pueden ver aquí:


.controller('newsController',function($scope,db){
db.init();
$scope.notas=[];
$scope.$on('refrescar',function(event,news){
$scope.$apply(function(){
$scope.notas = news;
})
})
})

Esto nos funcionó en su momento, y como ya podrán darse cuenta, es una mala práctica inicializar las cosas en un controlador. Incluso llamar a un inicializador puede resultar malo. Así que comenzaremos modificando el archivo “services.js” para dos cosas:

  • Ejecutar la rutina init() cuando haga falta y no tener que llamarla en ningún lugar. De esta manera simplemente llamaremos a las consultas y siempre tendremos la db lista.
  • Agregar el método para consultar las categorias

El primer paso es fácil: simplemente agregamos estas líneas al comienzo de cada método:


if (!db) {
this.init();
}

Simple, preguntamos si la variable interna es nula o no, y ejecutamos el método init() cuando haga falta. Agregamos eso a todos los métodos del factory.

El segundo paso también es simple, al igual que el método “mostrar” usamos el método allDocs así:


getCats: function(){
if (!db) {
this.init();
}
return db.allDocs({startkey:'cat_',endkey:'cat_\uffff',include_docs:true})
}

Con tanto cambio, el archivo services.js. quedará así:


angular.module('services',[])
.factory('db',function($rootScope){
var key = 'bentareadyessharyinessee';
var pass = 'OnEixgKgpt8LyEtl0S5DkAon';
var remote = 'https://'+key+':'+pass+'@supermio.cloudant.com/news';
var db;
var cat;
var mostrar = function(){
db.allDocs({startkey:'news_\uffff',endkey:'news_',descending: true,include_docs:true})
.then(function(result){
$rootScope.$broadcast('refrescar',result.rows);
});
};
var mostrarCat = function(catId){
if (catId)
db.query('news/topic',{key:[catId],include_docs:true,descending:true}).then(function(result){
$rootScope.$broadcast('refrescar',result.rows);});
else mostrar();
};
return {
init: function(){
if (!db) {
db = new PouchDB('news');
}
mostrarCat(cat);
this.replicate();
},
replicate: function(){
if (!db) {
this.init();
}
db.replicate.from(remote,{live:true,retry:true})
.on('paused',function(info){
mostrarCat(cat);
});
},
get: function(id){
if (!db) {
this.init();
}
return db.get(id);
},
setCat: function(id){
if (!db) {
this.init();
}
cat = id;
mostrarCat(cat);
},
getCats: function(){
if (!db) {
this.init();
}
return db.allDocs({startkey:'cat_',endkey:'cat_\uffff',include_docs:true})
}
}
});

Y listo, ahora vamos al archivo “app.js” donde vamos a agregar el resolve al estado abstracto:


.state('app',{
abstract: true,
views:{
"home":{
templateUrl:"templates/menu.html",
controller:"menuController as menu"
}
},
resolve:{
cats: function(db){
return db.getCats();
}
}
})

Agregamos la llamada al nuevo método y la pasamos al controlador a través de la variable “cats”. No se olviden de que, ya que estamos llamando a un factory definido en el modulo “services”, tenemos que agregarlo como dependencia. Así que la primera línea de nuestro “app.js” será ahora así.


angular.module('starter', ['ionic','controllers','services','ui.bootstrap'])

Y listo, terminamos con este archivo. Ya terminamos actualizando el modelo, ahora toca el controlador. Aquí simplemente tenemos que recoger la variable cats con las categorias y quitar cualquier llamada a “db.init()”. El controlador “menuController” quedaría así:


.controller('menuController',function($state,$scope,db,cats){
$scope.cats = cats.rows;
$scope.setCat = function(id){
$state.go('app.news');
db.setCat(id);
};
})

Acuérdense que cuando llamamos a la base de datos obtenemos un objeto y dentro de ese objeto el array “rows” nos trae los registros que queremos.

Ahora así quedaría el controlador “newsController”:


.controller('newsController',function($scope){
$scope.notas=[];
$scope.$on('refrescar',function(event,news){
$scope.$apply(function(){
$scope.notas = news;
})
})
})

Como ven, sólo le hemos quitado la llamada a “db.init()”. Y con esto hemos acabado con el controlador y vamos a arreglar la vista en el archivo “menu.html”. Si se fijan en la línea 25 comienza una lista donde todos los valores son estáticos y va hasta la línea 38. Reemplazamos todo eso por un iterador y quedaría así:


<ion-list>
<ion-item collection-repeat="cat in cats | orderBy: 'doc.orden'| filter:{'doc':{'estado':1}}" nav-clear menu-close ng-click='setCat(cat.id)'>
{{cat.doc.nombre}}
</ion-item>
</ion-list>

Cosas interesantes aqui:

  • Collection-repeat es propio de Ionic y es más eficiente en listas largas
  • El array cats es el que metimos en el $scope desde el controlador y tiene todas nuestras categorías.
  • Mediante “orderBy” las ordenamos por el campo “orden” que agregamos.
  • Y mediante “filter” mostramos solamente los que tienen estado =1

Todo lo demás viene del template anterior, incluso para llamar al método “setCat” llamamos al cat.id.

Y listo!, Si prueban el código hasta aquí funcionará, pero hay algunas limitaciones:

  • Si agregan una categoría en el servidor o se cambia el orden de alguna, no se refresca en la lista del menú automáticamente
  • Al inicio se mostrarán todas las noticias, incluidas las que pertenezcan a categorías inactivas

Esas las veremos en el siguiente post. Lo que si es urgente es corregir el estilo del código, siendo el más urgente el que figura en el controlador “detailController” donde verán que tenemos una llamada a db.get y esperamos por la respuesta. Si se habrán dado cuenta, para las categorías es lo mismo pero no esperamos por respuesta en ningún lado, simplemente esperamos valores y ya, así que usemos ese patrón aquí y corrijamos el controlador para que se vea así:


.controller('detailController',function($scope,db,noticia){
$scope.event=doc;
});

y tendríamos que cambiar el resolve de la ruta en el archivo “app.js” para que se vea asi:


resolve:{
noticia: function($stateParams,db){
return db.get($stateParams.id);
}

Y listo. La explicación para este cambio es que como casi todo en JavaScript es asíncrono, tenemos que usar un modelo llamado “promesas” para esperar por la respuesta y hacer algo con eso. Es por esto que usamos objeto.then() y dentro del then() incluimos una función con una operación. Pues bien, al momento de utilizar estados, el componente detrás de toda esa magia (UI-Router!!!) hace muchas cosas bien, y una de esas cosas es manejar la resolución de las promesas y es tan inteligente que esperará hasta que la promesa sea resuelta y podamos recibir los documentos en el controlador. Con eso nuestro código queda mas limpio.

Promises es todo un tema y siempre es un motivo de confusión así que mejor dejar que sea UI-Router quien las maneje. Así que para que se diviertan notarán que para cargar las noticias para la categoría seleccionada podemos usar el mismo esquema anterior. A ver si pueden completarlo por su cuenta.

NOTA: Ya un lector notó que todo es sobre leer datos en el cliente y tiene una razón. Grabar datos es bien simple pero supone que tengamos mucho cuidado durante el diseño, porque si dejamos escribir a un usuario, debemos tener en cuenta que cualquier usuario podrá hacerlo a menos que pongamos un control. Establecer un control requiere de cierto manejo adicional que aún falta explicar. Para que lo vean en perspectiva: 

  • Cualquiera puede escribir:
    • No hace falta establecer usuario y pass al inicio
    • Se debe tener cuidado de no duplicar el id del documento que se vaya a grabar
    • La replicación debe modificarse, porque si hay muchos usuarios, estaremos recibiendo muchos cambios y datos en nuestra db local.
  • Todos usuarios registrados pueden escribir:
    • Hay que incluir usuario y pass
    • También la replicación se tiene que ajustar para controlar los datos entrantes.
  • Sólo algunos usuarios registrados pueden escribir:
    • Usuario y clave es obligatorio
    • Hay que determinar quien puede escribir y quien no. Podemos integrar la autentication propia de CouchDB para determinar esto, pero esto aplica a todos los documentos, lo cual no necesariamente es bueno.
    • La replicación también se modifica pero ya es más simple

Recuerden que más importante que empezar a construir es sentarse a diseñar.


Esta es una continuación de la serie sobre desarrollo en móviles que comencé aquí. Les recomiendo comenzar a escribir el código fuente desde la parte 1 ya que no se publica el código para descarga.

El mayor desafio que hay al trabajar con NOSQL es consultar los datos pues no hay algo como SQL del mundo relacional que venga y nos simplifique la vida, bueno, si hay pero en cuestión de rendimiento no es lo mismo. CouchDB originalmente viene con funciones Map/Reduce para la creación de índices o vistas, es decir, si queremos recuperar los datos en cierto orden o hacer consultas tipo select * from tabla where campo3=XXX debemos crear un índice para poder buscar por el campo3, el problema es que como no hay tablas estos índices se aplican a todos los documentos en la base de datos y un detalle importante: estos índices se graban en disco lo que los hace muy eficientes. Suena bonito. Veamos como se hace.

Digamos que en nuestra aplicación de noticias queremos agregar secciones tal como lo tienen todos los sitios de noticias: política, espectáculos, deportes y así. Bien, entonces agreguemos los documentos a la base en Cloudant. Empecemos con 3 categorías.


{
 "_id": "cat_01",
 "nombre": "Nacional",
 "descripcion": "Noticias del país",
 "tipo": "topic"
}

{
"_id": "cat_02",
"nombre": "Internacional",
"descripcion": "Noticias del mundo",
"tipo": "topic"
}

{
"_id": "cat_03",
"nombre": "Espectáculos",
"descripcion": "Cine, TV y música",
"tipo": "topic"
}

{
"_id": "cat_04",
"nombre": "Opinión",
"descripcion": "Punto de vista de los editores",
"tipo": "topic"
}

Listo, 4 categorías para comenzar. Recuerden ingresar estos 4 documentos en su página de Cloudant. Seleccionen la base de datos y luego busquen la opción agregar doc.

addNewDoc

Ingresen uno a uno las 4 categorías.

Importante es el campo “tipo” que nos indicará que estos 4 documentos pertenecen a un tipo “topic” que es como identificaremos a esta entidad. Ahora tendremos en la base de datos documentos tipo “topic” y tipo “news”. Ahora lo que tenemos que hacer es vincular los documentos, así que iremos revisando los documentos tipo “news” uno por uno asignándole un topic. Por ejemplo:

{
 "_id": "news_20150724_vpease_001",
 "_rev": "2-6713e069e048d0eeb4d8d826f52454cd",
 "tipo": "news",
 "titular": "Retomando el demo!",
 "resumen": "Regresando a la lector de noticias esta vez con estados",
 "fecha": "2015/07/24",
 "autor": "vpease",
 "topic": "cat_01"
}

En la línea 9 podrán ver que se ha agregado el campo “topic” y el valor que tiene es el id de la categoría 1: “Nacional”.

Ahora necesitaremos una forma de recuperar la lista de categorías para mostrarlas en el app y luego al seleccionar cada una, mostremos las noticias asociadas.Las opciones que tenemos son :

  • Crear una vista: En el servidor buscaremos todos los documentos tipo “topic” y los devolveremos. Como todo índice, va a crear un archivo físico.
  • Usar el índice por defecto: podemos consultar el índice por defecto utilizando el Id. Si vemos el id que hemos fijado, todos los documentos tipo “topic” tienen un Id del tipo “cat_XXX” así que podemos usar esto para recuperarlos. Se reutiliza el índice principal.
  • Cloudant Query. Es el nuevo motor de búsqueda que viene con CouchDB 2.0 que es más fácil de usar que Map/Reduce. Igualmente creará un índice en un archivo físico.

Tengan en cuenta que:

  • Si crean un índice, se crea un archivo. Esto es tanto en el servidor como en el lado del cliente.
  • Ya existe un índice por defecto que nos permite consultar por el id.

Además, gracias al buen artículo publicado por Nolan Lawson en http://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html, lo más conveniente es explotar al máximo el Id principal del documento.

Cloudant Query lo guardaremos para el siguiente post, así que por ahora vamos a utilizar la siguiente estrategia:

  • Crear una consulta al Id para recuperar la lista de categorías
  • Crear una vista para recuperar todas las noticias dentro de una categoría.

Empecemos creando la vista. Esto debemos hacerlo en Cloudant y luego será sincronizada automáticamente al cliente en PouchDB. Recuerden que para PouchDB esto se llama índices secundarios. En la pantalla de Cloudant vamos a la opción de crear vistas.

createview

Ahora le damos un nombre a nuestro documento de diseño, para hacerlo simple llamaremos ‘news’ a este documento. Un documento de diseño es donde se definen los indices y otras reglas en CouchDB. Le pondremos el nombre topics a la vista. CUIDADO:  el nombre del documento de diseño es la raíz para cuando quieran llamar a su vista. En nuestro caso, el nombre completo de nuestra vista será ‘news/topics’.

Lo importante es que queremos poder buscar las noticias por la categoría a la que pertenecen, para eso escribimos lo siguiente en la sección Map function:

function (doc) {
if (doc.tipo =="news") {
emit([doc.topic], {_id:doc._id});
}
}

Tremenda ensalada para tan pocos comandos. Lo que hace esto es recuperar todos los documentos tipo news y publicar el índice doc.topic que como ya saben es el campo que tiene la categoría de la noticia, luego le decimos que devuelva todo el documento con la información de la noticia.

La función Reduce es opcional y se usa para cuando queremos realizar una operación sobre los datos obtenidos, en otras palabras, para los nativos SQL es cuando usamos funciones tipo Sum, Count y esas cosas. Para este caso, no nos hace falta.

Y listo, ahora el documento de diseño será sincronizado con PouchDB en el cliente y podremos hacer las consultas, pero antes debemos cambiar el diseño de nuestra aplicación, Para no alargar este post, vamos a hacer un cambio simple, mostraremos solamente las noticias que pertenezcan a la categoría ‘cat_01’ que corresponde a las noticias nacionales.

Primero, comencemos agregando al servicio db un método para consultar la vista que acabamos de crear.


var mostrarCat = function(catId){
db.query('news/topics',{startkey:[catId],include_docs:true,descending:true})
.then(function(result){
$rootScope.$broadcast('refrescar',result.rows);
});
}

El nombre de la vista es ‘news/topics’, noten que comenzamos por incluir el documento de diseño, porque simplemente puede haber más de uno, pero no compliquemos el asunto por ahora. luego están las opciones que hemos incluido:

  • startkey: simple, es el valor que queremos comparar. Como nuestra clave fue definida simplemente por el campo doc.topic entonces es una cadena simple. Es posible definir mas campos en el índice y en ese caso tendríamos que pasar un array. En este parámetro pasamos el id de la categoría que queremos ver.
  • include_docs: Por defecto, CouchDB devuelve solamente el Id del documento asociado, pero como necesitamos mostrar la noticia completa, tenemos que fijar este parámetro en true.
  • descending: indica que el resultado será ordenado por la clave original en modo descendente, recuerden que la clave original tiene la fecha en el formato YYYYMMDD de tal forma que si la ordenamos en forma descendente tendremos las noticias nuevas al comienzo.

Y listo, ahora solo falta indicarle al código del servicio que en lugar de utilizar el método “mostrar()” , donde se recuperan todas las noticias, utilice “mostrarCat(“cat_01″)” donde le decimos que nos muestre solamente los de la categoría “cat_01” que corresponde a las noticias nacionales. Algo tosco pero efectivo. El código del servicio ‘db’ quedará así:


angular.module('services',[])
.factory('db',function($rootScope){
var key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var pass = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var remote = 'https://'+key+':'+pass+'@server.cloudant.com/news';
var db;
var mostrar = function(){
db.allDocs({startkey:'news_\uffff',endkey:'news_',descending: true,include_docs:true})
.then(function(result){
$rootScope.$broadcast('refrescar',result.rows);
});
};
var mostrarCat = function(catId){
db.query('news/topic',{startkey:[catId],include_docs:true,descending:true})
.then(function(result){
$rootScope.$broadcast('refrescar',result.rows);
});
}
return {
init: function(){
if (!db) {
db = new PouchDB('news');
};
mostrarCat("cat_01");
this.replicate();
},
replicate: function(){
db.replicate.from(remote,{live:true,retry:true})
.on('paused',function(info){
mostrarCat("cat_01");
});
},
get: function(id){
return db.get(id);
}
}
})

Podrán ver aquí que hemos agregado el método mostrarCat en la línea 13 y luego cambiamos la función para mostrar los datos en la línea 24 y en la 30. Fijense que no hemos tenido que mostrar el Controller para nada.

Al ejecutar este nuevo código notarán que ya no tendrán todas las noticias que solían tener, ahora verán una o dos. Prueben insertando nuevos documentos y cambiando la categoría.

Para la próxima trataremos de insertar el concepto de estados abstractos y sobre todo, pasar datos a un estado, y para arreglar la parte gráfica, agregaremos un bonito menú que nos permita elegir las categorias como cualquier sitio de noticias decente.


He pasado los últimos meses programando una aplicación para móviles. No es que yo sea el programador más rápido y eficiente que existe pero me divierte mucho hacerlo. Principalmente disfruto la etapa de diseño, así que más que las funciones en el mismo app, me interesa todo el diseño del entorno que tendrá el app, no solo ahora sino también en el futuro.

Los objetivos que me puse para esta aplicación son:

Que sea muy útil. Obvio, aunque no tanto considerando que hay aplicaciones verdaderamente inútiles que tienen mucho éxito.

Que sea fácil de usar. En otras palabras, que no tenga que hacer clicks por todas partes para verlo funcionar. Instalarlo y listo.

Que sea fácil de mantener. Tengo que poder saber cuántos usuarios tengo, a que hora se conectan, que funciones del app están usando mas y cosas por el estilo. Además, que no tenga que estar contratando un super servicio de hosting que me cueste un montón de dinero mensual.

Utilizar un sólo código para muchas plataformas. Ok, Android es el más popular, pero iOS y WP y otros sistemas operativos deben poder usarlo también.

Que se pueda monetizar.

Todo esto me sonó razonable en su momento y aún me lo parece, así que los mantendré.

Ahora, mientras estaba programando, y considerando el último objetivo, me dí cuenta que hacia falta muchas cosas además de elegir hosting, librerías y demás cosas, realmente fue todo un descubrimiento para mi y sobre todo algo que no se puede aprender en ninguna escuela.

En fin, para hacer la historia corta, el proceso que tuve que seguir fue algo así mas o menos:

– Plataformas: 

Ya había escuchado hablar de Phonegap y Cordova desde hace años pero recién les puse atención como debe ser. Lo primero que encontré es que no son una solución completa. Veamos, la idea es que hagas tu app en JavaScript, luego la extiendas con Phonegap/Cordova y finalmente dejarle la generación de las versiones específicas. Todo bien, pero eso de hacer tu app en Javascript no me sonaba bien, además que Jquery no me quedó muy claro, principalmente porque te puedes enredar muy fácil con javascript si no tienes un framework que te ayude a programar. Jquery se orienta a la parte gráfica pero no a construir una estructura de aplicación que se pueda manejar aceptablemente, hay gente que lo hace, pero en mi caso, faltaba algo.

Por suerte encontré Ionic Framework que es una versión de Cordova mas una librería para UI y un framework de aplicaciones con AngularJS. Lo mas importante aquí es la inclusión de AngularJS, que es la forma como siempre debió ser Javascript.

Para ahorrarles algo de trabajo. El mayor problema que tuve con Javascript es que casi todo es asíncrono. Es decir, ejecutas una línea y la respuesta viene en algún momento que no sabes de antemano. Fatal para aprender y para hacer Debug. Además, su organización hace que el manejo de MVC sea muy natural. Finalmente, entiendo la importancia de que una vista no tenga acceso a la capa de datos, y que el controlador sea quien gestione la vista. El resultado es una aplicación donde las vistas con entidades independientes que podrían ser reutilizadas sin problema. Incluso pude dejar de lado la mala costumbre de preocuparme de un estado global de la aplicación gracias a una maravilla llamada UI-Router que viene integrada en Ionic Framework, para resumir, cada vista es un estado y listo.

Con esto solucioné el problema de cuál herramienta de desarrollo utilizar. Si bien tuve que aprender javascript, es un sol esfuerzo para abarcar muchas plataformas así que valía la pena.

– Datos: 

Sobre los datos en una aplicación hay tres cosas que pensar, que los tienes que organizar y tener en algún tipo de base de datos, que los tienes que pasar del servidor al móvil y finalmente que ese paso ocasiona tráfico.Resumiendo, Database, Syncing y Traffic.

En el mundo de móviles no hay muchas opciones y menos aún si queremos un app para varias plataformas. Muchos dirán que SQLite está presente en todas partes, yo me encontraba en ese grupo, pero la noticia mas grave que enfrenté es que no es cierto. SQLite no existe en todas partes y en los lugares donde existe se considera un estándar viejo que puede desaparecer en cualquier momento. Golpe durisimo porque ya empezaba con un problema mas. En fin, la alternativa que ofrece el mundo estándar es IndexedDB que para matar los ánimos, aún no es soportada completamente por todos. Que lío. En fin, como siempre el camino correcto parece siempre estar a la mitad y así fue que encontré PouchDB.

PouchDB es una versión cliente Javascript de CouchDB, que es un tipo de base de datos NOSQL que tiene algo muy bonito: sincronización automática de datos. Lo segundo: sincronización automática suena muy bien, pero lo primero requiere algunas líneas.

NOSQL es un movimiento nuevo de bases de datos que no están basados  en tablas y columnas como los tenemos en Oracle, Sql server y demás. La idea detrás es que sea más fácil de usar en aplicaciones de Internet, por dos motivos: el protocolo es http así que no hay drivers que cargar, y que no exista un modelo de datos, y con eso se eliminan los famosos joins. No es que crea que esta alternativa sea mejor que una base relacional, pero tener sincronización automática me convenció así que pagaré el precio usando NOSQL. El problema principal con estas DB es que hay casos en los que si tengo que usar “joins” para lo cual tengo que usar una pesadilla llamada MAP/REDUCE. En fin, lo bueno es que toda esa complicación me permitió aprender a golpes que hay que ser muy específico cuando se trata de hacer consultas a la base de datos.

– Sincronización y tráfico:

Como ya les dije, Pouch/CouchDB se encarga de sincronizar y lo más importante es que no consume mucho ya que es posible cargar una base de datos inicial, por lo que sólo se transmiten los cambios. Ahora, consideremos que la app que estoy haciendo es principalmente un catálogo con fotos, así que cada nuevo “registro” o mejor dicho “Documento” va a tener un tamaño algo grande, esto es 20K promedio lo que es bastante grande, pero que suena manejable considerando que por semana se crearán un máximo de 5 documentos con 2 documentos en la mayoría de los casos, así que podemos decir problema resuelto: la información estará al día y con un costo de transmisión de datos bastante aceptable. Sobre el consumo de datos, normalmente siempre es un problema la velocidad de datos ya sea por la calidad de la señal o por su costo, lo que hace necesario pensar siempre en transmitir lo mínimo indispensable a fin de que al usuario no le importe mucho usar tu app y por lo tanto, hace necesario que la app pueda funcionar sin datos por completo. Mágicamente, esto se soluciona con PouchDB ya que la base de datos está grabada en el móvil así que si se corta la señal, podremos seguir usando el app sin problemas.

– Hosting:

Una cosa interesante sobre CouchDB es que hay opciones de hosting gratuitos. En mi caso, IrisCouch tiene un servicio que es gratis hasta 5 dólares. Lo interesante es que la sincronización hace que sólo se pague por las diferencias entre la base de datos actual y la que se encuentra en el móvil, así que el tráfico debe ser bastante grande para empezar a pagar.  Un beneficio oculto es que se pueden hacer aplicaciones dentro de CouchDB, lo que simplifica la gestión del hosting. Ya les diré cuando aprenda a usar esa función.

Con esto se cierra lo que es la parte mecánica de la aplicación, es decir todo lo que un programador puede hacer. Ahora faltaba considerar lo que un empresario necesita. En primer lugar: Medir, necesitas saber cuanto se usa tu app y quienes la usan. Identificar: necesitas ahora mas datos de las personas que usan tu app y finalmente (al menos por ahora) Monetizar: generar algún ingreso.

Para la medición opté por Google Analytics porque es bastante completo pero con un giro. Para el cliente escogí una librería que simplifica el registro de los eventos y del uso y que suspuestamente trabaja con todas las plataformas. Cordova tiene un plugin para GA pero no soporta Windows Phone, Angulartics, la librería que escogí, parece que si por lo que estoy cubierto.

Para la identificación hay un gran detalle: los usuarios deben querer ser identificados. No voy a poner un formulario larguisimo para que mis usuarios se registren, lo mas simple es usar alguna red social y Facebook viene al rescate. Mejor aún, es si usamos un plugin para permitir compartir contenido dentro de la app que recibe información de las redes sociales a las que te conectas. En el futuro, si pienso dar la opción a que te registres, pero también seguiré el modelo de vincular la cuenta a alguna red social para simplificar el asunto, para que los usuarios tengan la opción de entrar fácilmente con sus cuentas de Twitter, Facebook o Google Plus y también para dar tiempo a que Windows Phone permita hacer lo mismo que en Android y iOS.

La monetización es algo que no se puede poner tan al principio para evitar que sea un impedimento para el crecimiento de los usuarios. Tampoco voy a dejar el app totalmente libre porque como ya dije, soy muy lento y alguien puede ganarme la jugada. Por el momento, la alternativa son banners y Admob resultó fácil de integrar. Hay un concepto llamado mediación que permite utilizar la misma cuenta Admob para recibir avisos de proveedores de banners que pagan algo mas, así que estaré en esa búsqueda. En el futuro, las opciones de monetización se abren como por ejemplo, cuentas personales que permitan hacer backup de tus datos, opciones para facilitar el intercambio de items entre usuarios en el mundo real y demás.

Adicional a todo esto hay un punto que ya queda casi al límite del tema técnico: Comunicación de los usuarios con el App. Toda app debe tener una identidad “social”. En otras palabras, hay que separar cuentas de Twitter, Facebook, Instagram, Pinterest, Correo, Web y otras por ahi. El app debe poder recibir mensajes y responderlos. Para eso hay que planificar con mucho tiempo porque los Ids en cada red social no esperan. Si se les ocurre un nombre cool, créenlo en la red social de su preferencia y así no lo perderán. Y lo más importante: asignen un Community Manager.

Hay un objetivo que siempre estuvo considerado pero que no lo escribí: que sirva de ejemplo para desarrollar otro tipo de aplicaciones móviles. Quizá esto es lo más importante, porque hasta ahora mi mayor éxito es un diagrama mal dibujado en algún papel, quizá ahora podríamos cambiar eso por una app que se pueda mostrar.

Resumiendo, su próxima aplicación móvil debe considerar las siguientes fases:

– Desarrollo: Plataforma, Datos y Hosting

– Explotación: Medir, Identificar y Monetizar

– Difusión: Planificar

Hay un punto que no he considerado que es la fidelización y ha sido a propósito. Personalmente, creo que la base de la fidelización de usuarios es brindar un buen servicio y satisfacer una necesidad. Veamos a Twitter que es básicamente el mismo servicio desde sus inicios, quiza sean los hash tags y las tendencias lo mas importante en innovación pero nada que altere la paz de los usuarios en escribir y leer tweets. Para el caso de esta aplicación, la estrategia de fidelización está en las nuevas funciones y en las futuras opciones de intercambio de items persona a persona.

¿Sobre que trata la aplicación? Ya lo verán en un par de semanas.


Hace unos años, revisaba casi todos los días una página web de noticias, hasta que alguien tuvo la idea de vender “banners” de pantalla completa, es decir, una imágen que aparecía encima de todo por unos segundos y no dejaba leer nada. Cambiar de página.

Migré a otra página que luego cambió a un formato que en lugar de mostrar principalmente los titulares, haciendo que la lectura fuera muy rápida y cómoda, cambiaron a la genialidad de mostrar un montón de noticias en un espacio reducido. Otro cambio mas.

Otra vez elegir una página de noticias, y estos empezaron a poner banners auto retráctiles. Es decir, salen grandes al inicio de la página y luego se esconden, El problema es que empiezas a leer y luego de un momento, todo se mueve y te perdiste.

Me harté, así que buscaré un lector rss que me permita ver las noticias a mi manera.

La moraleja de todo esto es que parece que la comodidad de la lectura ya dejó de ser una prioridad para los diseñadores, puesto que ya nos tienen como lectores, no importa si nos complican un poco la navegación.

Esa tendencia tiene sentido para los anunciantes pues nos muestran sus avisos. Ahora, depende de nosotros permitirles esta intromisión. Por eso es que una aplicación tan simple como Flipboard tiene éxito pues te permite una navegación placentera, aún con unos pocos avisos, pero sin alterar la experiencia de lectura. Buena voz.

Lo que parece es que el formato Web tal como lo conocemos  esta siendo estirado ya demasiado. La realidad es que el primer interés de los generadores de contenido es la de generar ingresos, por lo que inician la captura de usuarios y luego los exprimem. En nuestro país se nota mucho mas pues las alternativas son más limitadas si es que nos queremos enterar de noticias locales. Obviamente, si nuestro interés va más alla, las alternativas son innumerables en el Internet completo.

En fin, el punto es que una página web ya no es sinónimo de fuente de información, mas bien se vuelve en un laberinto que hay que cruzar para acceder a niveles muy limitados de información. Por ejemplo, vean la página de la Sunat, ONPE y cualquier otra entidad del Estado.

El mundo móvil ofrece la posibilidad de obligar a concentrar la experiencia de uso en el acceso fácil a la información. Lo más interesante es que esas aplicaciones también se pueden ejecutar con aplicaciones web.

El otro extremo es la implantación de servicios de subscripción, lo que hasta hoy lo tenemos de gratis. Es una alternativa siempre y cuando eso nos asegure una experiencia adecuada de lectura.

Lo principal es que el mundo web ya se nota lleno de basura que va desde información correcta con una mala presentación hasta contenidos muy malos con una presentación muy pulcra. Parece que la existencia de terceros que se encarguen de unificar la experiencia es algo necesario. Gracias Flipboard y a todas las apps de su tipo.


Por un tema técnico, tuve que dejar la revisión del iPhone 5s y hacer la de BB10 Z10 y puedo decir que estoy gratamente impresionado.

Primero, z10 no es un mal equipo principalmente porque su Hub es realmente bueno para enfocarse en los correos electrónicos y mensajes de todo tipo, es como una bandeja de notificaciones, realmente muy práctico. Desde su salida se le criticó por la falta de aplicaciones  y realmente es un problema que sigue en la actualidad, siempre y cuando busquemos aplicaciones nativas BB10 porque una capacidad poco comunicada y explotada permite a estos equipos ejecutar aplicaciones Android, algo que pude comprobar y con un resultado impresionante en algunos casos. Es una pena que Blackberry haya cometido el error de no comunicar propiamente esta funcionalidad, así como otras como la gestión de conexiones y notificaciones.

Usabilidad: Z10 no tiene botones físicos, solamente el de Power y nada más, lo que significa que todo se hace a través de gestos en la pantalla, lo cual esta bien por un rato pero luego se vuelve muy incómodo. Si instalamos muchas aplicaciones, cambiar de aplicación activa se vuelve un ejercicio de gimnasio porque hay que pasar páginas y páginas.

Como era de esperarse leer correos y notificaciones es de lo mejor del equipo, ya que se presentan incluso con la pantalla bloqueada y se puede hacer un vistazo del contenido sin tener que desbloquear el equipo, o ir directamente al mensaje si es que quiero. Sweet.

El teclado no es una maravilla pero es bastante grande y cómodo sin llegar a ser excelente, los que tienen dedos gordos podrán utilizarlo sin problemas.

La configuración de los correos es simple y cubre con una sola aplicación todos los servicios de mensajería, incluyendo algunas redes sociales (Específicamente, Linkedin, Facebook y Twitter) otras redes simplemente no existen como clientes nativos porque recordemos que este es un teléfono de trabajo, pero como ya dije esto se puede solucionar con un app de Android. Para cerrar, el correo se notifica casi tan bien como con la versión clásica de BB y la visualización de los adjuntos es bastante buena. Otro aspecto fundamental es que la sincronización de contactos ya viene para todos los proveedores de mensajería por lo que no tendremos que preocuparnos por dejar algún contacto sin ser reconocido.

BBM está presente y es muy bueno, pero lamentablemente todos mis contactos ya se fueron a otras plataformas así que ya no encuentro a nadie por ahi.

En conclusión, si tuviera un par de botones  mas, el Z10 sería ideal para trabajar, ahora si tuviera un teclado QWERTY sería perfecto. Una lástima que el Q10 tenga un teclado pero con una pantalla reducida, algo que baso el esquema de navegación que tiene BB10 es de un gran impacto.

Ahora, explicaré rápidamente la compatibilidad con Android: Blackberrry hizo bien en implementar la ejecución de apps de Android en BB10, pero se olvidó de algo fundamental, hacer que instalar esas apps en el equipo sea sencillo. Entonces, si es que ustedes quieren ejecutar, por ejemplo, Instagram, tendrán que conseguirse el apk (lo cual es bastante complicado) y pasarlo al equipo (peor) o instalar un Appstore de terceros tal como Amazon store, 1- Mobile o culaquier otro por ahi. Personalmente, recomiendo 1-Mobile (1mobile.com) porque tiene un catálogo mas amplio incluyendo algunas apps propias de Google, inexistentes en el catalogo de Amazon. Lo que sigue es muy simple, elegir la app, descargarla, instalarla y listo.  Como ya estarán sospechando, no todas las apps de Android funcionarán bien, aquí sólo es cuestión de probar, por lo menos he podido comprobar que Google Maps y Instagram funcionan Ok.

Batería: Como también era de suponer, BB hizo un trabajo interesante con el uso de energía a pesar de sus capacidades de multitarea. A pesar de esto, llegar al final del día con carga dependerá de la cantidad de apps que tengan y el tipo de las mismas. Como era de esperar, si instalan apps de Android consumirán mas que si instalan apps nativas. La gran mayoría de apps de BB10 son html5 por lo que su consumo es limitado. Como regla general si tienen un app que use muchas figuritas, sonido y acceso a la red entonces estamos hablando de un alto consumidor de batería.

Igual que con Android, hay que salir a la calle con un cargador. Antes, hay que decidir bien que apps necesitamos verdaderamente.

Consumo de datos: Siendo el correo electrónico la app principal, es la que mejor ha implementado el uso de recursos, así que mientras usemos el BB Hub, estaremos seguros que usaremos la menor cantidad de datos de nuestro plan. Hay que anotar que con BB10 ya no tendremos los servicios de Blackberry.net, al menos no de la forma como estaba en los equipos BB7. Ahora, utilizaremos cualquier plan de datos regular.

Una diferencia fundamental es el manejo de notificaciones. El BB Hub es el app que maneja todo y seremos nosotros quienes decidiremos si aceptar la notificación o no. Entonces, si en Android, una notificación puede iniciar una sincronización sin avisarnos, en BB10 la sincronización se dará si es que aceptamos la notificación. Simple y sobre todo seguro para el usuario.

En conclusión, BB10 es una herramienta especializada para gente que quiere trabajar en la calle, tal vez no sea tan bueno como los equipos con BB7 para el ingreso de texto, pero cumple con su cometido siempre y cuando el correo electrónico sea nuestro único interés porque tendremos que “perdonar” muchas falencias en otros aspectos que son naturales para otras plataformas.  La compatibilidad con Android ayuda un poco pero no ha sido comunicada propiamente.

Para el trabajo podría utilizar un BB10, pero tendría que salir a la calle con otro smartphone para contestar llamadas y demás apps para asegurar que la batería me dure todo el día. Podría contestar correos en el Z10, pero no muy largos. Además, si es que el volumen de correos y cuentas es bastante alto, ésta sería mi única alternativa para poder salir a trabajar a la calle sin problemas.


Primero, si bien utilicé un Nexus 5, en realidad me estoy enfocando en Android en general pues si bien algunos fabricantes le insertan mejoras en la navegación, básicamente Android es el mismo.

Segundo, les hago recordar que estoy evaluando el teléfono para reemplazar mi BB por lo que estaré enfocado en utilizar apps de mensajería y de productividad. En segunda prioridad tendré a las redes sociales.

Pues bien, Nexus es un gran teléfono y la gran cantidad de aplicaciones en Google Play hacen que las capacidades del hardware sean exprimidas al límite. Así es, el hardware se aprovecha con las apps, pero ¿qué hay con mis intereses como usuario?

Usabilidad: Lo mas importante que ofrece Android es que es muchísimo más rápido y potente que BB y sobre todo mas estable. Puedes utilizar sin problemas de reinicios y congelamientos. El cambio entre aplicaciones es simple pero se nota que Android tiene la idea descabellada que las funciones de voz y sms no son tan importantes, pues , ya que son tratadas como cualquier otra app, por lo tanto, no hay botones dedicados para acceder a ellos, o cortar la llamada, incluso, en algún post anterior, yo describía el diseño (El número 5), pero finalmente es un problema de todos los teléfonos el día de hoy. En definitiva, con Android no tenemos un aparato para comunicarnos y realizar nuestras tareas de trabajo, tenemos un tipo de computadora de uso general, por lo que el diseño de uso es totalmente neutral tratando a todas las apps por igual.

Puntos mas importantes:

– El teclado es en pantalla y hay, para mi sorpresa, buenas opciones tal como el nuevo teclado de Google y como SwiftKey que son muy fáciles de usar, en una pantalla de 5 pulgadas, no me imagino escribiendo un email en un teclado mas pequeño

– Mensajeria: Android ofrece Gmail y funciona bien, pero para otros proveedores, normalmente se ofrece un cliente universal. Veamos, Yahoo tiene su cliente, Hotmail tenía un cliente también y ya empezamos con la fragmentación. He encontrado que el cliente universal funciona relativamente bien mientras no tengamos archivos adjuntos, pero quizá lo mas crítico es la integración de los contactos, la única manera de garantizar nuestros contactos (y calendarios y notas y demás información adicional que nos ofrezca nuestro proveedor de correo) sincronizados. Esto de los contactos es altamente importante, sobre todo cuando estamos en la calle. En el Nexus 5, el cliente universal funciona mas o menos bien pero el tema de los contactos si es un fallo. Por ejemplo, no hay sincronización nativa con Yahoo que es mi cuenta principal. Mi segunda cuenta de correo principal es Gmail, por lo que ya significaría que tendría que usar dos clientes de correo, lo que me obliga a tener un cliente para cada proveedor de correo que tenga. Mi tercer proveedor es Hotmail y ya empiezan los líos.

Otro punto importante es que BB se hizo famoso por lo que se llamó Push Email, es decir, llegaban super rápido. Lamentablemente tengo que decir que BB sigue siendo mas rápido. El “Push” email no es una función intrínseca del cliente de correo universal del Nexus, mas bien, hay lo que se llama Pull, que cada X minutos verifica contra el servidor. Mal. Otra vez, tengo que ir con un cliente de correo propietario para tener esa función Push.  En conclusión, si tienes varias cuentas de correo, bájate el cliente de cada proveedor. Si todas tus cuentas son Google estás con suerte.

Finalmente, BB tenía lo que parecía ser un almacenamiento infinito, es decir, tus correos antiguos también se podían consultar. En el cliente universal de Nexus, también se sucede este manejo pero hay que pedir manualmente cuando necesitemos ver mensajes mas antiguos.

En lo que se refiere a SMS, tener que usar el Hangout es un castigo, pues su uso es bastante confuso poniendo todo en conversaciones, lo cual no es mala idea, pero no dejan ver claramente el orden en que llegaron los mensajes.

La mensajería instantánea es otra cosa ya que Android tiene clientes para casi todas las opciones en el mercado y como el “look and feel” no depende de Google, entonces su rendimiento es el mismo en cualquier Android.

– Batería: mejor ir al punto: el rendimiento de la batería depende de la cantidad de aplicaciones que instales. Por supuesto hay algunas aplicaciones que consumen más batería, en fin, nada nuevo ni sorpresivo aquí. Lo increíble es que mi BB 9810 siga teniendo una batería que dura un día y algo mas, si bien tiene pocas aplicaciones, estamos hablando de un equipo bastante viejito, algo que Nexus 5 apenas puede cumplir. Y quizá la explicación venga por aquí:

Como explicaba en el punto anterior, todo es una aplicación para Android, y cada aplicación gestiona por su cuenta el uso de recursos, aunque Android trate de mantener el buen uso de los mismos y lo hace casi bastante bien con la memoria y el almacenamiento, pero con la red no. Lo que les contaba del correo Push es un caso notorio y lo que sucede es que si el correo es Push se consume menos energía que cuando es Pull (verificar cada 10 o 15 mins) y esto es solamente un ejemplo. Lo mismo sucede con todas las aplicaciones de mensajería. Si quisiera asegurar que todas las aplicaciones funcionen bien, tendría que revisar cada aplicación. Y esto es sólo para red, para lo que es uso de procesador y demás, tendré que confiar en que el proveedor del app haya sido lo suficientemente eficiente. En BB la cosa era más simple pues el manejo de Push era uno solo para todas las aplicaciones, por lo que se podía esperar que fuese super eficiente.

De todo esto, si tienes que usar un Android a fondo, entonces la sugerencia obvia es concentrar aplicaciones. Un solo cliente de correo para todas mis cuentas, una sola para redes sociales y así. Obviamente que para mensajería instantánea es algo difícil pero algo es algo.

Facebook es un caso interesante pues tiene en su configuración una opción para controlar el uso del ancho de banda.

Conclusión en este punto: Escoge bien que aplicaciones vas a instalar según tus necesidades. Según la arquitectura de Android, no basta con que dejes de usar algunas aplicaciones para ahorrar batería, pues muchas apps tienen un mecanismo para despertar y casi todas las aplicaciones de redes sociales lo tienen, igual que las de mensajería instantánea.

– Consumo de datos: Ya es obvio que mientras mas datos consuma, mas se afecta la batería. Android tiene además, un control para limitar el consumo de datos lo que es muy conveniente y muestra las aplicaciones que mas consumen. Pero aceptémoslo, Android gestiona los datos, pero son las apps las que consumen los datos. Sin embargo, hay algo que falla no sólo en Android sino que en todas las nuevas plataformas móviles, las apps necesitan actualizarse y eso es lo que mas ancho de banda les va a consumir, así que lo primero que deben hacer es verificar que la actualización esté en manual. Pero no queda todo ahí.

El método de notificaciones que tiene Android permite a las aplicaciones ahorrar batería al apagarse cuando no tienen actividad, y despertar sólo cuando sucede algún evento. Esto requiere un mínimo consumo de datos de nuestro operador ( que en ningún caso puede ser gratuito, ya hablaremos de eso en otro Post). Como es mínimo, cualquiera diría que no es mucho problema, pero potencialmente si se puede suceder un problema cuando las apps son despertadas y tratan de actualizar su estado descargando o enviando datos, esto si puede ser un problema. Otra vez, aquí depende de que apps instalemos, así que a escoger con cuidado.

Finalmente, como les dije, Android es una computadora, así que la pueden usar para lo que les dé la gana como por ejemplo, ver videos en Youtube, escuchar música en Spotify o Pandora y demás tareas que tienen la combinación correcta para matar tu batería: Red y multimedia. Si quieres usar tu celular como un equipo multimedia personal que cuesta menos de la décima parte de lo que pagaste por tu celular, date el trabajo de grabar tu contenido localmente en la memoria del aparato, ya que el streaming es muy fácil de usar pero consume batería como loco.

Para concluir, leer la pantalla del Nexus 5 estando en la calle es posible pero no es tan cómodo como para quedarme a escribir directamente bajo el sol y el equipo no es tan delgado como para resbalarse de las manos, dos puntos que son muy importantes pero descuidados por lo general. Obviamente, verifiquen estas dos cosas si eligen comprarse otro Android.

¿ Me puedo quedar con un Android ? si, pero tengo que tomar un buen tiempo eligiendo las apps que necesito y llevando una batería externa bien cargada todo el tiempo.

NOTA: Hay un punto que no he profundizado y que es la multitarea. Es posible pero yo en este punto soy algo mas radical y sostengo que con un teléfono y estando en la calle, lo más seguro para todos es hacer una sola cosa a la vez, incluso si es que estamos sentados en un Starbucks. Si tienes un trabajo tan importante que requiere que manejes y cambies documentos y gráficos y cosas, resígnate a llegar una tablet o mejor una laptop híbrida sobre todo esta última opción. Tienes que elegir entre potencia y duración y en un celular yo prefiero siempre la duración.

Veamos como me va con iPhone en esta semana que viene.


Ahora si, ya se anuncio oficialmente la fecha de publicacion de BBM para Android y iPhone manteniendo casi todas las funciones  que lo hicieron famoso en los telefonos Blackberry.

A simple vista, quien tiembla ante esta noticia es Whatsapp, pues tiene ahora un competidor que hace simple todo lo que ellos hacen, ademas de incluir a los pocos que todavia quedan usando BBM en equipos Blackberry. Ahora, la mayor virtud de Whatsapp es la importacion automatica de contactos que hace que comunicarnos con alguien sea tan facil como registrarlo en nuestra lista de contactos, pero por otro lado, carece del perfil unificado de BBM, donde recuperaremos los contactos que ya hallamos registrado en la app en otro telefono mientras que usemos el mismo PIN.

Ademas, se tiene el tema de la notificacion de lectura de BBM que yo tiene Whatsapp, pero creo que puede quedar en un segundo plano. 

Lo mas importante, sin embargo, es determinar si esta movida es buena o mala para Blackberry a largo plazo. Para muchos, incluyendome, BBM era una de las dos razones por las que valia la pena estar en Blackberry. La otra razon era el plan de voz y datos que en roaming presenta los mejores precios del mercado.

Ahora veamos, BBM es de lo mejor pero tiene el punto debil en el tema de los contactos, ahora son mucho menos que antes. Entonces, ya no es tan determinante como antes, Y si ahora surge la oportunidad de comprar otro smartphone, entonces lo primero que va a suceder es que muchos antiguos usuarios de Blackberry instalaran BBM y lo usaran junto con Whatsapp.  Que el BBM sea un factor de decision en la compra, no lo creo ya que ahora podemos decir que hay de todo, la opcion nativa con equipos BB10 y anteriores, y clientes en Android y iOS

Un factor importante es el tema de contactos. Todos los usuarios de Whatsapp han sufrido alguna vez con el tema de contactos cuando han cambiado de telefono, y si cambiamos de numero el tema es aun peor, simplemente hay que restablecer la lista de contactos lo cual a pesar de ser automatico, toma un tiempo. En el caso de BBM, existe un perfil unificado basado en el PIN y no en el numero de telefono, lo que significa que podremos literalmente tener varios telefonos con los mismos contactos haciendo muy facil cambiar de telefono o cambiar de numero. Algo que ocurre con mucha mayor frecuencia estos dias. 

Para Blackberry esto no pinta nada bien pues significa que esta apostando todo en esto. En lo que es dispositivos, yo no veo como justificar la compra de un Z10 o Q10 o cualquier otro BB10 teniendo alternativas en Android o iOS a los mismos precios, y mucho mas considerando que los planes de voz y datos de BB ya no estan disponibles en BB10. 

En un post anterior, mencione el tema de la experiencia de uso. Para los que necesitamos de la experiencia de uso basada en mensajeria, los equipos BB 6 o 7 venian bien y quiza podamos repetir esa misma experiencia solamente en el Q10 por el teclado pero perdemos un valor muy alto al no poder acceder a los planes de datos BES/BIS.  Alternativas reales en la experiencia en otros smartphones aun no existen, eso puedo decirlo hasta el cansancio. Prefiero sacar mi laptop y contestar un correo que hacerlo en el teclado en pantalla de un Galaxy o de un iPhone 5 o incluso una tablet. 

Si Blackberry libera BBM, lo siguiente que deberia hacer seria liberar BES de tal forma que las companias pudieran comprarlo para crear redes privadas con equipos gestionados fuertemente sin importar el OS que tengan, algo que ya se puede segun entiendo. Solo falta que le pongan un precio y lo lancen al mercado. Definitivamente, en lo que se refiere a dispositivos ya perdieron. Aun guardo la esperanza que lancen un equipo tipo SideKick. 

Blackberry es una solucion corporativa, dedicada a empresas, siempre lo ha sido a pesar de la terquedad de sus directivos de querer entrar a la competencia de equipos masivos. Ciertamente el mercado es mas grande, y ellos necesitaban vender, pero nunca debieron abandonar a las empresas, verdadero nicho de sus clientes mas leales.





%d bloggers like this: