Posts Tagged ‘Facebook’


En las noticias se puede leer hoy que un Operador ofrece “Internet gratis” usando el famoso “Internet.org” de Facebook y los comentarios no son nada halagadores, comenzando con “engaño” hasta amenaza hasta “atentado” a la libertad de Internet.

La cruda realidad es lo siguiente:

  • Internet.org es una opción comercial creada por Facebook para capturar aquellos mercados donde el acceso a Internet aún no es masivo con la intención de “capturar” usuarios nuevos. Teniendo en cuenta que estos usuarios tendrían una experiencia limitada, Facebook se volvería el “internet” para los pobres.
  • Internet.org suena bonito para el operador por que se pueden utilizar dos palabras: “gratis” y “facebook”. Esto no puede sonar mal, más aún cuando hay otras páginas disponibles además de facebook.
  • Internet.org se basa en que Facebook te da acceso, así que ellos podrán ver todo lo que haces y hacer con eso lo que quieran.
  • Hay otro rollo más: Los que no pueden pagar un plan de datos, o los que tienen un plan prepago suelen apagar el servicio de datos para evitar el consumo de saldo. Los Operadores no se benefician de esto así que empezaron a ofrecer Whatsapp gratis y ahora también Internet.org, porque de esa manera ya no apagamos el servicio de datos por lo que queda abierta la posibilidad de que consumamos el servicio de datos ya sea a propósito o por casualidad.

Ninguna de estas cosas me parece mal, al final las empresas tratan de ganarse el pan. El problema está en el usuario: TIENE QUE ESTAR 100% SEGURO DE LO QUE ESTÁ COMPRANDO. Esto quiere decir que la Operadora tiene la obligación de explicar lo que vende y el consumidor también se debe informar por su lado. Ambos por igual.

Es cierto que para muchos tener full Internet es algo normal y hasta necesario, pero no todos tenemos la misma suerte. Si tuviera que elegir, no iría por Internet.org ni loco, pero ese es mi caso en particular y la razón no es que crea que Facebook es diabólico o que me parezca una estafa, simplemente que no me gusta que vean mi tráfico ni que me impongan a que lugares puedo entrar.

¿El acceso a Internet es un lujo? Si, suena feo pero lo es. La razón para esto es que Internet no es una librería, es más como un centro comercial donde puedes encontrar buenas cosas gratis o no. Hay buenos libros como los hay también malos y recontra malos y lo más doloroso es que es la mayoría. Es cierto que puedes entrar a cosas “pseudo educativas” como Wikipedia (que no sigue un método transparente para la creación de sus contenidos), Wattpad (donde hay libros gratis, pero no están curados por edades) y otros contenidos interesantes, pero no hay garantía de que encuentren algo que sea realmente tan confiable como lo que se puede encontrar en un libro impreso.

Cierto que estar en Internet es cool, incluso si ese “Internet” fuera solamente Facebook, pero de ahí a que se vuelva un “servicio público” lo dudo mucho, incluso si hablamos de un servicio tan básico como el correo electrónico.

Hace algún tiempo surgió el proyecto “Huascarán” que ofrecía Internet en colegios con las famosas laptops XO de la fundación “one laptop per child” de Mr Negroponte. Si bien la intención era buena, se trató de una iniciativa que olvidaba la capacitación de los profesores, tal vez en la tecnología y en los métodos que venían con él (entiendo que se capacitaba a los profesores en el método constructivista de la educación), pero no en los temas básicos de fondo que al final son los que más importan.

Si los libros son tan buenos, hay forma que hacerlos llegar de forma eficiente, controlada y con menores costos, y no hace falta que me ponga a decir cuales. El punto es que la tecnología no puede estar por encima del objetivo principal.

En fin, la conclusión es que si puedes vivir sin Internet, o con un Internet recortado y si tienes suerte podrías tener un Internet Full, pero eso no te hace ni mejor ni peor persona y tampoco quiere decir que tus oportunidades en la sociedad se reduzcan. En el peor de los casos, siempre es posible conseguir Internet de algún lado a un precio módico.

Tener Internet full y libre es lo ideal, pero si no te alcanza la plata aún tienes chances, Internet.org es una opción entre muchas pero debes saber realmente que estás comprando un servicio recortado y aceptarlo de tal forma, y si no te gusta un Internet limitado, no te preocupes, aún se puede vivir sin Internet.


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 este post vamos a incluir algunos puntos propios de la plataforma Cordova que no han sido tan obvios hasta ahora y que deben tenerse en cuenta para aplicaciones reales, pero antes hay que planificar.

Planificación:

Quedó pendiente en el post anterior la implementación de un método para ver cuáles noticias eran las más leídas. Algo tan simple nos plantea los siguientes retos:

  1. Al leer una noticia se tendría que agregar un documento indicando que un usuario determinado la ha leído.
  2. El documento agregado debe ser sincronizado solamente con el servidor. No debe ser sincronizada con los demás usuarios
  3. En el servidor debe existir un mecanismo que concentre todos los documentos de lectura y haga la suma para poder ordenarlos y así presentarlos en el móvil.

El punto 1 requiere de insertar documentos en la base de datos. Para eso recordemos que no hay un esquema así que tendríamos que definir uno que tenga al menos la siguiente información: usuario, noticia leída, la fecha. Digamos que algo así:

{
_id:’id del documento’,
newsId: ‘id de la noticia leída’,
fecha: ‘fecha cuando fue leída la noticia’,
tipo: ‘read’,
usuario: ‘usuario’
}

Por ahora este documento cumple con lo que nos hace falta. Y para grabarlo a la base de datos el comando es super simple “db.put(doc)”, ya veremos como usarlo.

Para el punto 2 debemos considerar que al sincronizar, debe haber alguna información en el documento para definir si hace falta ser sincronizado o no. Además, también debemos considerar que hay información que tiene que ir a todos los usuarios. Entonces podríamos usar el campo “usuario” de la siguiente manera:

  • Consideraremos que la información común a todos, será asignada al usuario “all”
  • La información particular a un usuario, será asignada al usuario actual

De esta manera, podríamos definir una regla para que se sincronicen todos los registros donde el campo usuario sea igual a “all” o al “usuario actual”. Lo único que debemos asegurar es que tengamos un mecanismo para generar un id único. También podríamos considerar que no se pasen las noticias muy antiguas, para eso podríamos pasar la fecha, lo haremos al final si sobra tiempo. Todas estas reglas se entienden fácil, pero hace falta que le hagamos entender esto a CouchDB en Cloudant para lo que tendremos que usar una característica llamada “filtered replication” o replicación filtrada.

Para el punto 3, tendremos que usar una vista en el servidor que utilice una característica llamada map/reduce, que no es otra cosa que un proceso de dos pasos, que está optimizado para cuando trabajamos con un software distribuido en muchos servidores, tal como es nuestro caso. Para entenderlo fácil, MAP concentra todos los documentos que deben ser manipulados para que luego REDUCE realice cierta operación sobre los mismos. En nuestro caso, lo que haremos será buscar los documentos donde registramos que una noticia ha sido leída, luego las agrupamos por noticia y contamos las ocurrencias para hacer el ordenamiento.

Ejecución:

Empecemos por un punto 2, la replicación filtrada pues no queremos que los datos viajen por la red sin control para eso tenemos que crear un filtro así que vayamos a la sección de documentos de diseño:

alldesigndocs

Encontraremos el documento por diseño por defecto y para ver su contenido vamos a hacer click en el icono de lápiz:

designdoc

El documento de diseño tiene varias secciones, podrán reconocer la sección “views” donde he definido unas vistas de prueba. Lo que necesitamos hacer es crear una sección nueva para definir nuestro filtro, el cual debe ser una función que se evalúa por cada documento que se envía en una replicación. Tengamos en cuenta que para nuestro caso, la función debe ser verdadera para cuando el campo de usuario sea igual a “all” o al usuario actual. Digamos que el campo usuario lo llamamos “owner” entonces nuestra función de filtro sería:

"filters": {
"leidos": "function(doc,req){ if (doc._deleted){ return false; } if (doc.owner){ if (doc.owner==req.query.user){ return true; }; if (doc.owner==’all’){return true;};} else {if (doc._id==’_design/news’){return true;} else {return false;}}}"
}

Hemos agregado una condición al inicio y se refiere a los documentos que no hayan sido borrados. Por diseño, Couchdb guarda incluso los documentos que borras y los sincroniza también, así que es mejor filtrarlos para que la comunicación sea más fluida y de pasadita ahorramos algo de espacio.

La replicación filtrada nos permite asegurar que los datos que se replican son los necesarios y esto es super importante por dos razones: seguridad y uso de ancho de banda. Es muy común tener apps donde los usuarios tienen información particular que les es exclusiva, como por ejemplo, tu lista de compras, tu lista de reservas, tus preferencias y así. Con este mecanismo aseguramos que cada usuario tiene lo que realmente necesita y de pasadita al dejar de enviar un montón de documentos inútiles ahorramos espacio y ancho de banda.

Y bien, agregado el filtro a nuestro documento de diseño, éste quedaría así:

{
"_id": "_design/news",
"_rev": "41-667b5e312f96dfec37e4480d2c34479d",
"views": {
"topic": {
"map": "function (doc) {\n if (doc.tipo ==\"news\") {\n emit([doc.topic], {_id:doc._id});\n }\n}"
}
},
"filters": {
"leidos": "function(doc,req){ if (doc._deleted){ return false; } if (doc.owner){ if (doc.owner==req.query.user){ return true; }; if (doc.owner==’all’){return true;};} else {if (doc._id==’_design/news’){return true;} else {return false;}}}"
}

Tengan cuidado de poner todos los valores en una sola línea y de no utilizar la comila (“) dentro de cada valor.

Y listo, ahora vamos al código de replicación y pongamos la llamada a la replicación filtrada paso a paso:

Creamos una función para obtener un id único. Para eso, nuevamente usamos ng-Cordova para usar el plugin Device, esta vez en el archivo app.js ya que tenemos que agregar un concepto propio de la plataforma Cordova:

angular.module('starter', ['ionic','controller','service','ngCordova'])
.run(function($ionicPlatform,$cordovaDevice,$cordovaSplashscreen,$state,db) {
 $ionicPlatform.ready(function() {
 // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
 // for form inputs)
 if(window.cordova && window.cordova.plugins.Keyboard) {
 cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
 }
 if(window.StatusBar) {
 StatusBar.styleDefault();
 };
 var id='1231232132';
 if (ionic.Platform.platform()!="win32"){
 id = $cordovaDevice.getUUID();
 };
 db.setUser(id);
 $state.go('app.news',{status:'loading'});
 });
})

Como verán, hemos incluido el módulo ngCordova como una dependencia y llamamos a $cordovaDevice.getUUID() que genera un código único por equipo móvil. Para ser exactos no es tan único, o al menos no tenemos garantía de eso, pero para nuestro ejemplo es suficiente. Quizá lo mas interesante aquí es como y cuando llamamos a esta función.

Si se dan cuenta en la línea 3, llamamos a la función $ionicPlatform.ready. Como les dije en algún momento, ionic está basado en Apache Cordova y pues Apache Cordova se toma un tiempo en estar listo para contestarnos por lo que usamos la línea 3 para “esperar” a que cargue Cordova y en ese momento, ya podemos utilizar los plugins que nos dan acceso a funciones nativas, en nuestro caso $cordovaDevice. Ahora bien, el valor del id del equipo es crítico, al punto que tendremos que hacer que el app espere a que tengamos este valor disponible y eso es lo que se hace en las líneas siguientes:

  • En la línea 16, pasamos el valor del id del equipo al servicio porque nos va a servir para sincronizar la base de datos
  • En la línea 17, cuando ya tenemos todo listo, recién pasamos al estado que muestra las noticias.

Ahora bien, ¿Que hacemos mientras Cordova termina de cargar? pues lo mejor es mostrar un Splash Screen o el logo de nuestra aplicación y para eso tenemos que agregar un nuevo estado


$stateProvider
.state('splash',{
url:"/splash:status",
cache:false,
views:{
"home":{
templateUrl:"templates/splash.html",
controller:"splashController as splash"
}
},
resolve:{
status: function($stateParams){
return $stateParams.status;
}
}
})

Obviamente, tendremos que agregar una vista y un controlador. Aquí va la vista:

<ion-view view-title="">
<ion-content>
<div class="row">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
<div class="row row-center">
<div class="col">
</div>
<div class="col">
<img src="img/ionic.png">
</div>
<div class="col">
</div>
</div>
<div class="row-bottom">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
</ion-content>
</ion-view>

y aquí va el controlador:


.controller('splashController',
['$state',
'status',SplashController])
function SplashController($state,status){
if (status!='loading'){
$state.go('app.news');
}
};

Y verán que hay código de más. El tema es el siguiente: si el splash screen es un estado quiere decir que cuando se muestren las noticias, el usuario podría “regresar” al splash screen con el botón Back en Android o Windows Phone, cosa que nadie quiere. Para eso, en la línea 17 del archivo app.js al ir al estado de noticias, pasamos un parámetro para indicar que llamamos al estado desde el flujo de inicio del programa. Si vamos al estado de noticias mediante el botón Back, llegará sin éste parámetro y haremos que se vaya automáticamente al estado news nuevamente.

Lo bueno de todo esto es que con este mecanismo implementado, estamos 100% seguros que Cordova está listo y todas las llamadas a plugins funcionarán correctamente.

Ahora vamos hasta la método replicate y le tendremos que agregar el usuario como un parámetro, así que también tenemos que actualizar la línea donde llamamos a la replicación en método init. Mostremos todo el archivo services.js porque hay mas cosas que explicar

angular.module('service',[])
.factory('db',['$q','$rootScope',DbService]);
 function DbService($q,$rootScope){
 var key = 'xxxxxxxx';
 var pass = 'xxxxxxxxxx';
 var remote = 'https://'+key+':'+pass+'@server.cloudant.com/news';
 var db;
 var user;
 var initiated=false; 
 function newNews(change){
 if (!change.deleted){
 if (change.doc.tipo=="news")
 $rootScope.$broadcast('db:newNews',
 {newsId:change.id,
 newsTitle:change.doc.titular});
 }
 };
 function put(doc){
 db.put(doc);
 console.log('documento grabado');
 };
 function changed(change){
 console.log('cambios en la base de datos');
 if (!initiated)
 {
 initiated=true;
 db.changes({live: true, since: 'now', include_docs: true})
 .on('change', newNews);
 };
 $rootScope.$broadcast('db:changed',change);
 };
 return {
 setUser:function(userId){
 user = userId;
 },
 init: function(){
 if (!db) db = new PouchDB('news',{adapter:'websql'});
 this.replicate();
 return true;
 },
 replicate: function(){
 if (!db) this.init();
 db.replicate.to(remote,{live:true,
 retry:true,
 filter:'news/leidos',
 query_params:{'user':user}})
 .on('change',function(info){
 console.log('Evento Chage:'+JSON.stringify(info));
 })
 .on('paused',function(){
 console.log('Evento Paused:');
 })
 .on('complete',function(info){
 console.log('Evento Complete:'+JSON.stringify(info));
 })
 .on('active',function(){
 console.log('Evento Active:');
 })
 .on('error',function(err){
 console.log('Evento error:'+JSON.stringify(err));
 })
 .on('denied',function(info){
 console.log('Evento error:'+JSON.stringify(info));
 });
 db.replicate.from(remote,{live:true,
 retry:true,
 filter:'news/leidos',
 query_params:{'user':user}})
 .on('paused',changed);
 },
 get: function(id){
 if (!db) this.init();
 return db.get(id);
 },
 getCats: function(){
 if (!db) this.init();
 return db.allDocs(
 {startkey:'cat_',
 endkey:'cat_\uffff',
 include_docs:true});
 },
 getNews: function(catId){
 if (!db) this.init();
 if (catId)
 return db.query('news/topic',
 {key:[catId],
 include_docs:true,
 descending:true});
 else return db.allDocs({startkey:'news_\uffff',
 endkey:'news_',
 descending: true,
 include_docs:true});
 },
 putRead: function(pnewsId){
 var doc = {
 _id :'read_'+user+'_'+pnewsId,
 newsId: pnewsId,
 fecha:new Date().toString(),
 tipo:'read',
 owner:user 
 };
 put(doc);
 }
 }
 };

Veamos, vayamos en orden:

  • Primero, tenemos que agregar una función para recoger el dato de usuario, para eso hemos agregado una variable interna en la línea 8 y un método público en la línea 33.
  • Seguidamente, necesitamos grabar registros y para eso tenemos un método privado bastante genérico en la línea 18. Pero como necesitamos agregar un documento por lo que también agregamos un método público en la línea 94 donde verán que usamos una plantilla para crear el documento JSON que describimos al comienzo donde solamente cambiamos los valores de los campos para luego llamar al método interno genérico.
  • Finalmente, agregamos un comando de replicación. Los atentos se habrán dado cuenta que el comando de replicación que hemos venido usando es db.replicate.from lo cual significa que la dirección de los datos es del servidor al móvil, así que faltaría agregar la dirección del móvil al servidor. Para hacer un poco más gráfico el proceso de debug, hemos agregado todos los eventos del proceso. NOTA: Hay un comando db.sync que replica en ambos sentidos, pero prefiero separar las dos direcciones porque quiero capturar solamente los eventos solamente cuando “llegan” nuevas noticias del servidor.

Tanto lío y la pregunta que se cae de madura: ¿Ya podemos grabar y sincronizar? Aún no. Falta que la llave que usamos para conectarnos a la base de datos en Cloudant tenga permisos para escribir. Para eso vamos a Cloudant y hacemos click en el icono de candado al costado del nombre de nuestra base de datos:

Security

permissions

En el segundo gráfico podrán verificar que el key que están utilizando tenga el privilegio Writer.

Ahora, agreguemos la grabación cuando una noticia es leída en el controlador:


function DetailController(db,$scope,$state,noticia){
$scope.event= noticia;
db.putRead(noticia._id);
$scope.$on('db:changed',
function(event,changed){
$state.go('.', null, { reload: true });
console.log('Recargando Noticia');
});
};

En la línea 34, hemos agregado la dependencia al servicio db y en la línea 36 hemos agregado la bendita línea para grabar que hemos leído una noticia.

Y con eso ya podemos ver como nuestra aplicación hace lo siguiente:

  • Graba un documento del tipo ‘read’ cada vez que alguien lee una noticia. Como la clave del documento es única, si entramos a una noticia ya leída, la inserción simplemente fallará y eso esta bien porque asegura que sólo tendremos un documento tipo ‘read’ por noticia.
  • Los documentos serán sincronizados con la base de datos en Cloudant de forma automática.
  • Finalmente, manejamos el evento Ready para verificar que Cordova ya está listo y podemos usar plugins que nos den acceso a servicios nativos.

El Post ya se hizo largo, así que en uno próximo haremos un reporte de las noticias más leídas y ya que el código se ha hecho algo grande, vamos a ponerlo en un repositorio Github.

Por mientras, traten de actualizar su código para que tengan la funcionalidad desarrollada hasta el momento. Y sobre todo revisen los eventos que genera la replicación móvil – Servidor.


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.

Les recomiendo que la revisen de principio a fin pues es una guía paso a paso de absolutamente todo lo que tienen que hacer para comenzar en este mundo de móviles con javascript. Averiguarlo por cuenta propia es algo que les tomaría muchos meses, se los aseguro. Y si es algo largo, pues vale la pena pues cubre todos los aspectos.

En esta segunda parte voy a centrarme en las capacidades móviles de la plataforma Ionic y en como PouchDB se acomoda a cada una de las capacidades de nuestros equipos para escoger el mejor almacenamiento para los datos. Y de gratis, sus aplicaciones móviles sincronizarán sus datos con Cloudant.

Comenzaremos con el código que dejamos en el post anterior.

Preparando el ambiente

Para poder empezar a generar el código para las diversas plataformas, tenemos primero que instalar el SDK de cada una de ellas. El foco va a estar en Android y Windows Phone 8. Si quieren generar para iOS necesariamente deben estar en Mac (Si no tienen para comprarse aunque sea una Mac mini, aún les queda crear una máquina virtual con VMware). Pueden generar para mas plataformas si quieren: BlackberryOS 10, Firefox OS, incluso pueden generar para Windows 8 o Tizen y otros, pero todas estas plataformas, tienen sus cositas, hay que hacer ciertos trucos  o simplemente son dificiles de conseguir. Según las pruebas que he hecho, si se van con Android, Wp8 y iOS no tendrán casi problemas.

Empecemos con Android:

Revisemos lo que estamos haciendo: El Java SDK es la base de todo, pero para que funcione bien, debemos fijar la variable de entorno porque otras herramientas se fijan en ese valor para funcionar bien. Para crear estas variables tienen que ir a Mi PC – Propiedades – Configuración avanzada del sistema – Variables de entorno  y de preferencia crearlas como variables del sistema. En resumen:

Paquete Variable Por defecto Debe ser Agregar al Path
Java SDK JAVA_HOME C:\Program Files\Java\jdk1.8.0_40 la ruta donde instalen el jdk  nada
ANT ANT_HOME C:\ant\ la ruta donde descompriman el zip de ant  %ANT_HOME%\bin
Android SDK ADT_HOME C:\program files\android-sdk\ la ruta donde instalen el sdk %ADT_HOME%;

%ADT_HOME%\platform-tools;

Con esto ya tienen listo su entorno para Android. Para Windows Phone 8, basta con que instalen Visual Studio Community 2013 update 4 desde aquí .

Finalizo con algunas sugerencias:

  • Para Android: No usen el emulador que viene en el SDK, usen Genymotion
  • Para Windows Phone: usen un equipo real conectado al USB trabajen cargando el proyecto generado en Visual Studio

Plus: Para MAC tendrán que instalar unos paquetes adicionales en NodeJS: ios-sim y ios-deploy y los instalas fácil con el comando npm install -g <paquete>.

Generando los binarios

Ahora si empieza la diversión y para eso nos vamos a una línea de comandos y nos ubicamos en la carpeta donde dejamos el proyecto Superdatos. Aqui empezaremos a ver los potentes comandos de Ionic.

Agregando una versión de Superdatos para Android:

c:\projects\superdatos\>ionic platform android

Y después de unos segundos ya tendremos nuestra versión para android. ¿No me creen? Entonces lancen Genymotion o conecten su Android a la computadora y luego ejecuten:

c:\projects\superdatos\>ionic run android

Con esto verán su aplicación ejecutarse en un emulador o en su móvil tal cual lo vieron en el navegador. Simple y limpio. Y si quieren una versión para Windows Phone 8 el comando es :

c:\projects\superdatos\>ionic platform wp8

Aquí, como les recomendé, lo mejor es abrir el proyecto generado en c:\projects\superdatos\platforms\wp8 con Visual Studio y ejecutar el proyecto en un emulador o en un móvil conectado.

NOTA: En algún momento les dije que Ionic no soportaba WP8 y es cierto, y por lo que han visto, se darán cuenta que el resultado está algo feo ya que no se ven los iconos. Para suerte de ustedes, y después de perder mucho pelo, la solución es simple. En la ruta “www\css” encontrarán el archivo “ionic.app.css” verán esta línea:

src: url("../lib/ionic/fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"), url("../lib/ionic/fonts/ionicons.ttf?v=2.0.1") format("truetype"), url("../lib/ionic/fonts/ionicons.woff?v=2.0.1") format("woff"), url("../lib/ionic/fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg");

Y la cambian por esta:

src: url("../lib/ionic/fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"), url("../lib/ionic/fonts/ionicons.ttf") format("truetype"), url("../lib/ionic/fonts/ionicons.woff?v=2.0.1") format("woff"), url("../lib/ionic/fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg");

Recompilan su proyecto y listo. Recuerden hacer esto cada vez que tengan que generar el proyecto. Para los flojos, el cambio está en remover “?v=2.0.2” de la definición ionicons.ttf, en la columna 126 de la misma línea.

Así de simple pueden tener su aplicación para sus dispositivos con Ionic. Es bastante simple pero hay que saber AngularJS, así que para el post que viene revisaremos algo de eso para mejorar nuestro código. Además, veremos como usar plugins para habilitar mas funciones en nuestras apps móviles.


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.


Hay algo que se obtiene apenas tomas el iPhone 5s en la mano y es la satisfacción de tener un equipo elegante. Si además puedes desbloquear la pantalla con tan solo poner tu huella, entonces se vuelve una adicción. Realmente Apple aún tiene el toque para hacer equipos que dan gusto utilizar.

Usabilidad: Regresemos al trabajo y me sorprende encontrar que es muy fácil y práctico utilizar el iPhone y su velocidad es muy buena, hasta que tenemos que empezar a ingresar algún texto. El teclado no es malo pero tampoco tan bueno como uno físico.

Las notificaciones es un tema donde si reniego. Mientras que en Android yo puedo ocultar una notificación simplemente arrastrándola, en iPhone sólo puedo borrarlas por grupos, además, si quiero ver realmente que notificaciones tengo pendientes, tengo que abrir el centro de notificaciones pasando el dedo de arriba a abajo, de lo contrario no me entero que hay cosas pendientes. Mal.

Nunca me ha pasado que alguna aplicación se pone lenta o se cuelga, incluso cerrar apps es muy fácil mediante una función copiada de WebOS.

En la parte de correo, la aplicación cliente no es la maravilla pero hace el trabajo, aunque se hace problemas con archivos adjuntos muy grandes. Principalmente, debo resaltar que el soporte para los proveedores de correo mas populares es tan bueno que puedo sin ningún problema sincronizar contactos, calendarios de forma muy fácil, algo que extrañé en Android. El único problema con esto es que iOS se cree tan inteligente que a veces, combina varios contactos en uno solo cuando por algún criterio oscuro cree que se trata de la misma persona. Sugerencia, arregla bien tus listas de contactos antes de sincronizar.

Un punto importante es el Office. Para iOS ustedes sólo podrán modificar archivos si tienen una cuenta de Office365 así que les toca pagar, algo que en otras plataformas es gratis, asi que mientras no lo hagan, sólo podrán visualizar. Así como Office hay otras apps que sólo tienen versión de pago, como por ejemplo Whatsapp así que vayan haciendo algo de caja para actualizar sus apps.

Batería: me sorprendió además que la batería funciona bien, siempre y cuando me dedique a trabajar. Esto no es nada nuevo. Básicamente, si te dedicas a usar cualquier otra app que no sea correo, teléfono o contactos, tu batería va a sufrir y esto también se cumple aquí con iOS. El otro punto es el manejo de las notificaciones Push.

Ya les dije que el cliente de correo es bueno y las opciones de sincronización también lo son, por lo tanto, eso nos permite dejar de usar aplicaciones propias de proveedores como Yahoo o Outlook.com que además de consumirnos recursos, nos consume datos y batería mediante las notificaciones Push. Aquí la regla es que si tenemos una aplicación que tiene la capacidad de alertarnos de contenido nuevo mediante notificaciones, No permitamos que utilice notificaciones. Cada notificación supone consumo de datos y por lo tanto de batería. O sea, fuera Instagram, Facebook, Vine y todas esas, téngalas instaladas y refresquen manualmente para ahorrar algo de batería.

Al final, si se pudieron controlar y dejaron de ver videos de Youtube en su iPhone, puede que lleguen al final de día con batería, o sea igual que el resto de opciones hasta el momento.

Una verdadera molestia es que este teléfono no tenga un puerto micro USB, por lo que tendrán que llevar su cable a todas partes por si es que se quedan sin batería.

 

En conclusión, iPhone 5s es un buen teléfono si es que soy un consumidor de datos, es decir, me la paso leyendo todo lo que me mandan y si contesto algún email, será sólo un par de líneas. Para trabajar a full quizá me quede algo corto tanto en funciones como en batería, pero estaré en la onda si me toca un almuerzo de negocios o una reunión en un bar.


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.


Estuve buscando mas datos y simplemente no hay. Parece que a ningún fabricante le interesa promocionar InstantGo o al menos explicarlo. Hace poco en una Tienda Sony, nadie me pudo explicar porque un equipo con Instantgo costaba mas que un equipo son esa función y que a la vista tenía mejor acabado.  Realmente, esto es muy importante para una laptop especialmente pensada para uso diario en casa.

Con Windows 8.1 y con los nuevos modelos de laptops híbridas, Microsoft ha introducido un nuevo modelo de conservación de energía llamado comercialmente Instantgo o Connected Standby para los amigos. Más fácil que notar las ventajas es notar las ausencias: los equipos con Instantgo no soportan Hibernación.

Veamos como se puede analizar esto:

Con la hibernación, lo que hacíamos era cerrar la laptop y luego regresar, abrir y recuperamos lo que estabamos haciendo en ese momento. Mientras teníamos la laptop cerrada, no había problema, pues no se consumía energía.

Sin la hibernación, y con Instantgo, solamente tenemos opción a apagar la pantalla y listo. No hay un estado de no consumo de energía, pues la computadora queda activa en su mínima expresión para mantener servicios básicos como red y disco, por lo que para nuestros amigos que nos ven en Skype siempre estaremos “en línea”.

Al principio no le ví la ventaja, hasta que me tocó hacer un viaje en avión de 6 horas. Con el modelo de hibernación, una buena laptop me podría haber durado unas 4 horas. Con una laptop con Instantgo pude estar activo durante todo el viaje sin problemas.

Instantgo permite eso, tener largas sesiones de trabajo donde la recuperación de la sesión se da de forma inmediata pues las interrupciones son pocas. Algo que solamente había visto con mi antigua Macbook Air. Algunos llaman a esto, el modelo smartphone, ya que estos equipos no se apagan, solamente entran en un modo de bajo consumo y así hasta que agotan su batería.

El modelo antiguo de hibernación no creo que sea para nada un modelo que tengamos que descartar porque si hablamos de movilidad, no siempre vamos a estar en ese plan de pasarnos todo el día en la calle usando la laptop sin cesar. Pongamos este ejemplo: El día de hoy , ustedes cargan su laptop a full, salen al trabajo o a la calle y se da que solamente han tenido que usar la laptop un par de horas. Llegan a su casa y botan todo, incluso la laptop hasta el día siguiente. En la mañana, si su laptop tiene hibernación, no habrá problema pues la carga estará intacta, mientras que si su equipo es Instantgo, verán que ya casi no tienen batería. Ya me ha pasado y es muy molesto.

Ejemplos de estos equipos con Instantgo son: Sony Vaio Duo, Microsoft Surface 2 y Pro 2. No encontré ningún documento sobre el soporte de instantgo en la tablet Nokia 2520.

Entiendo muy bien el movimiento que se ha querido hacer con esta innovación, hacer equipos realmente híbridos. Igual que cualquier tablet o teléfono, Instantgo permite larga duración de la batería. Me hubiera gustado que aún se mantenga la opción de hibernación porque es lo que hace que una tablet sea mas que eso. No se puede tener todo en la vida.

Finalmente, Si ustedes son trabajadores móviles que necesitan una computadora mas que una tablet, Instantgo no es para ustedes. Si lo que necesitan es un equipo todo terreno mas recreativo que para trabajo entonces exijan que tenga Instantgo, pero no se olviden de usar el cargador al final del día.

NOTA: En Mac hay un feature llamado PowerNAP que permite establecer ciertos intervalos de tiempo donde el laptop con la pantalla cerrada, se encenderá para recuperar correos y notificaciones. Es como el Smart Connect de Intel que suele venir en los nuevos laptops híbridos basados en el procesador Haswell y que no tienen soporte de Instantgo.

Una nota final: podrán reconocer a los equipos con soporte de Instantgo porque estos no tienen la opción de Hibernar y que en PC info al final de la página verán que la encriptación de disco está activada.


El día de hoy Blackberry ha anunciado que BBM estará disponible en Windows Phone muy pronto, con lo que se transformaría definitivamente en una compañía líder del segmento corporativo a una compañía de servicios de IM. Pensé en algún momento que esto podría revertirse con la entrada de la nueva administración pero ya es muy tarde. Mobile World Congress en Barcelona ya ha comenzado y no hay ningún anuncio importante de parte de Blackberry en el segmento de dispositivos, así que tendremos que ver como los Q10 y Z10 siguen sin venderse. Es increíble ver como han bajado de precio a pesar de que se tratan de equipos bastante interesantes. Ese es el problema de llegar 3 años tarde al mercado y descuidar a los usuarios mas fieles.

Volviendo a los Z10 y Q10, soy ultra fan de los teclados físicos pero el Z10 me parece un buen equipo y con el Q10 yo podría vivir tranquilo si no es por el cambio en el método de conexión, pues como ya sabemos, el super extraordinario Blackberry.net ya no se utiliza en esos equipos por lo que el plan de datos es igual a la de cualquier smartphone. Esta es la razón única y suficiente como para mantener mi viejo y fiel BB 9810. Una vergüenza todo lo que he tenido que soportar por esta compañía y me imagino que como yo, muchos usuarios fieles se sienten traicionados con esta marca.

En fin, esto me lleva a pensar sobre las verdaderas razones que nos impulsan a cambiar de celular. En mi caso personal el tema es especial pues, dado mi trabajo, tengo acceso a teléfonos de última generación y pesar de todo eso sigo con mi BB que ya parece arcaico.

Es como lo que sucede con las computadoras, queremos la que haga de todo hasta que viene Apple y queremos la que se vea mas sexy y resulta que lo mismo está pasando en los móviles. El mayor problema es que estamos dejando de lado las reales necesidades de los usuarios. Por ejemplo:

Hasta hace unos años, si queríamos una laptop, incluso para nuestros temas más básicos, comprábamos las que nos daban mas procesador y memoria, aunque eso signifique solamente 1 o 2 horas de operación y le cargábamos todos los programas que nos pudiéramos imaginar, hasta que salieron las tablets y ahora se venden mas que las laptops. Imagínense que pasaría si en la tienda pedimos una laptop y nos dicen: “Si le quitamos la multitarea tendrá mas duración de batería y le descontamos USD 200”, “si le hacemos la pantalla mas pequeña y de menor calidad, le descontamos USD 100” y así. Para un mundo laptop corriendo Windows Xp, Vista , Linux o incluso MacOSX es inaceptable. Pues con las tablets no nos han preguntado y nos han quitado todas esas cosas lo cual comprueba algo que ya sabíamos pero no queríamos aceptar:

La gran mayoría de personas no necesita tanto poder de procesamiento para sus tareas básicas del día.

Estas personas han estado pagando de más en computadoras, sistemas operativos y programas. Usar Photoshop para retocar imágenes como aficionado es como comprarse un Hummer para salir a hacer las compras del mercado.

Con eso en la mente, tenemos que fijarnos en los equipos que tenemos en la mano y aplicar este mismo concepto. ¿Cuántos de ustedes han usado todos los gestos que soporta el Samsung Galaxy S3? ¿Cuántos de ustedes han hecho lo mismo para el S4? ¿Quién utiliza el centro de notificaciones en iPhone? ¿Quién cierra las aplicaciones en iPhone o en Android?

Y así pudiera seguir haciendo preguntas cuando las que de veras importa están del lado de las necesidades nuestras, como en mi caso: ¿Qué les pasa a los fabricantes que no sacan un modelo con teclado físico?

Para muchos, el smartphone se reduce a este número de tareas:

– Tomar fotos

– Ver el Facebook

– Usar Whatsapp

– Publicar fotos con Instagram

– Contestar llamadas y sms

Adicionen una o dos redes sociales con localización como Foursquare o Waze y listo. incluso contestar correos ya pasó a un segundo plano o ver paginas web. ¿Cuánto podría costar un teléfono que haga exactamente estas funciones y nada mas? Yo no creo que mas de 100 USD. El problema es que hasta ahora esos teléfonos son chinos y sin marca que no duran mucho. Espero que en Barcelona las cosas se arreglen algo en este sentido y parece ser así con el anuncio del Nokia X y la línea Asha con teléfonos de USD 50 o menos, y hay versiones Mini de los Galaxy de Samsung que también se anuncian.  Lo mas importante aquí es que todos los sistemas operativos móviles disponibles pueden hacer esto casi con la misma facilidad desde Tizen, Windows Phone, Blackberry OS hasta Android o iOS.

En fin, donde no veo mucha diferencia es sobre mi necesidad de tener un teclado físico, creo que no tengo otra que buscar alternativas fuera de la caja o seguir con mi fiel BB 9810.


Todavía se escucha en estos días la bulla que se hizo con el concurso de bandas para LTE en Perú y no faltan artículos diciendo que se viene un gran cambio en como usamos los datos desde los celulares y como vamos a cambiar radicalmente el uso de datos móviles.

Seguramente pasará todo eso pero tienen que darse varias cosas para que todo esto suceda y aquí les explicare cuáles son y como nos afectan. No me crean un pesimista, si me sobrara la plata, ya estaría con mi teléfono LTE comprado y contando las horas para contratar los nuevos planes. Lo real es que ya no puedo hacer eso, y no es porque  crea que los teléfonos o el servicio sean caros.

Pues bien, la revolución tiene dos puntos iniciales: La red y el teléfono.

La red: Como ya nos hemos enterado, los operadores celulares tendrán que instalar la infraestructura asi que no esperemos nada para este año.  Mediados del 2014 veremos los primeros intentos de LTE con zonas de cobertura limitadas.  Es decir, no esperemos que la alta velocidad llegue a todas partes.

El teléfono: tendremos que cambiar de teléfono si es que no tenemos ya uno de esos que ya se promocionan. Considerando que el tiempo de vida de un smartphone es de 6 meses, comprarnos hoy un teléfono LTE no sería lo ideal pues el servicio se tomará unos 10 a 12 meses. Si aun no tenemos un equipo LTE, no es para preocuparse, podremos esperar y compraremos uno a un precio menor y seguramente con mas funciones.

Bien, para muchos el tema de LTE termina aqui, pero no es así.

Tambien tenemos que considerar que los proveedores del servicio requieren de una infraestructura para gestionar todo el ancho de banda que les supone LTE.  Para entenderlo,  todas las tecnologías de datos se refieren a la velocidad de datos entre el terminal y el Operador. GPRS, EDGE, HSDPA, HSUPA, HSPA+ y ahora LTE es el tamaño del canal hasta el operador y nada mas.

Ahora, el Operador funcionará como una gran presa donde todos los canales convergen. Mientras mas ancho sea el canal, mas agua necesitará para atender a todos. Entonces, aquí viene el detalle, lo que realmente nos limitará es que tan rapido el Operador llene el agua de la presa.

La velocidad con que llenan la presa es el ancho de banda que el Operador tiene para salir a Internet. Si este ancho de banda es poco, entonces por mas LTE o lo que sea que pongan entre ellos y nuestros teléfonos, sentiremos que el Internet es lento en nuestros teléfonos.

Siguiendo con el ejemplo de la presa, si todos consumimos Internet a alta velocidad, lo lógico sería que el Operador reponga el agua a la misma velocidad. Es decir, si me da 2 MB a mi teléfono, el Operador deberá tener 2 Mb disponibles de su lado, y lo mismo por cada usuario, lo cual sería extremadamente caro porque no todos los usuarios están consumiendo datos a ese ritmo todo el tiempo. Entonces lo que se hace es una estimación de un máximo número de usuarios concurrentes y se asegura el ancho de banda para esos usuarios. Digamos que el 5% de usuarios estará todo el tiempo conectado así que habrá que asegurar 2MB para cada uno en ese 5%.

¿Porqué elegí 5%? por ninguna razón técnica que pueda sustentar. Lo hice porque me dió la gana. Las Operadoras pueden utilizar un método mas formal para hacerlo, incluso en algunos países es parte de la regulación que exige el Estado, pero de eso no estoy enterado. Lo que si es un hecho es que el ancho de banda disponible del Operador es limitado.

Entonces, está muy bien que venga la tecnología al país y que tengamos mayor velocidad en nuestros celulares es también bueno, pero necesitamos aún mas que la infraestructura, aquello que no vemos y que realmente es la clave de un buen servicio, mejore aunque eso suponga que las empresas inviertan un poco mas.

En resumen:

– No te compres un celular LTE aún

– Verifica la cobertura del LTE antes de contratar algún plan

– Pregunta la velocidad asegurada del servicio tanto de bajada como de subida. Esto simplemente para fastidiar y de pasada hacerle entender al operador que si sabemos lo que estamos comprando.





%d bloggers like this: