¿Qué es Firebase?

Si trabajas haciendo apps para móviles, sabes lo complicado que resulta a veces realizar algunas operaciones, sobre todo la gestión multidispositivo con la base de datos. Por ejemplo a la hora de realizar aplicaciones muy grandes como CLMs, hay una enorme inversión de horas de trabajo para crear un backend poderoso que nos permita sincronizar de forma bidireccional la comunicación entre dispositivo y servidor aunque estemos desconectados de la red.

Firebase se podría decir que es un framework de trabajo de Google que nos ayuda con esto y con muchas cosas más. Aunque tiene soporte para web, está más orientada al desarrollo móvil iOS y android, para que los desarrolladores no tengan que preocuparse de desarrollar y mantener un servidor con su backend, además de ofrecer herramientas para la interconexión entre la app y el backend.

 

Firebase dispone de diferentes funcionalidades, entre las que se encuentran:

  • Base de datos en tiempo real: una base de datos gestionada por Google basada en JSON que nos permite, mediante eventos, tener funcionalidades en tiempo real. También nos permite llevar una gestión automática de los datos en el caso de que la aplicación se encuentre sin conexión, sincronizando todos los cambios una vez haya recuperado dicha conectividad.
  • Sistema de autentificación de usuarios tanto por email/contraseña como por otros sistemas como facebook, twitter, google, github, etc.
  • Cloud Messaging para el envío de notificaciones push a los dispositivos de una forma sencilla.
  • Un sistema de almacenamiento y sincronización de ficheros con el dispositivo.
  • Un sistema de hosting estático, ideal para realizar páginas estáticas o utilizarlo a modo de CDN de la app.
  • Sistema de reporting de errores.
  • Laboratorio de pruebas, para realizar pruebas en los dispositivos.
  • Funciones lambda basadas en NodeJS para realizar mediante eventos ciertas operaciones.
  • Conexión con AdMob para la monetización de la aplicación.
  • Configuración remota de la aplicación, pudiendo cambiar dinámicamente funcionalidades de la misma.

Lo más llamativo de Firebase es el Free Tier que ofrece, puesto que un proyecto para arrancar es gratuito, pudiendo dar el salto al pago cuando la aplicación haya crecido lo suficiente. Como opciones de pago disponemos de una tarifa plana de 25$ al mes que nos ofrece lo necesario para funcionar en proyectos de mediana envergadura. También disponemos de un "pago por uso" que nos permite pagar por aquellos recursos que utilicemos y que nos permitirá, de una forma escalonada, ir aumentando los costes poco a poco, según va creciendo nuestra aplicación.

¿Se puede rentabilizar un blog?

Tengo varios amigos que me preguntan si se puede ganar dinero con un blog, que están pensando escribir un blog para así dejar de trabajar. Lamentablemente siempre les tengo que dar la misma respuesta "si y no".

Por un lado, claro que si se puede pero tiene mucho trabajo. Lo primero me voy a saltar el término "viral", puesto que este es muy relativo y es muy difícil que se de. Cuando empezamos a escribir un blog tenemos que hacerlo porque nos gusta y no porque vamos a ser ricos con el. Solo cuando este punto está claro podemos trabajar en nuestro blog, porque no esperamos nada a cambio, lo hacemos por gusto.

Pero, ¿cómo gano dinero mi blog? Tienes 3 formulas principales: publicidad, artículos de pago o donaciones.

  • Publicidad: es la más clásica. Pones publicidad en tu blog y a escribir. Si tenemos la suerte que alguna empresa nos patrocine para poner su publicidad, podemos cobrar un fijo mensual, pero si no tenemos esa suerte, dependeremos de alguna plataforma tipo AdSense de Google para hacerlo. El problema, necesitamos muchas visitas, clicks y suerte para ganar dinero.
  • Artículos de pago: esta fórmula es difícil de conseguir pero es interesante. Cuando te contactan para este formato, solo tienes que escribir un artículo sobre una temática en concreto y te pagaran por ello. Hay empresas que ya te dan el artículo escrito y otras que permiten que lo escribas tu mismo. El precio varia en función del tamaño de tu blog, visitas, temática, etc. Es más rentable que la publicidad tal cual, pero tiene el problema que estás "vendido" por decirlo de alguna manera.
  • Donaciones: este es otro formato, menos explotado, puesto que o eres de mucha calidad y todo el mundo te conoce o no vas a ver ni un céntimo. Esta es la opción menos atractiva, ya que mucha gente no está dispuesta a pagar para leer algo en internet.

Sea cual sea la fórmula que elijamos para intentar ganar dinero con nuestro blog, debemos tener claro que necesitamos visitas. Sin visitas, da igual cuanta y de que calidad sea nuestra publicidad, no nos rentabilizará. En otro artículo explicaré como conseguir visitas para nuestro blog.

Por otro lado, no se puede ganar dinero con nuestro blog. Cuando la gente habla de ganar dinero con su blog, no se refiere unos centimos o euros al mes, se refiere a conseguir un sueldo con nuestro blog. Tengo un amigo que me dice:

Estoy leyendo un libro de uno que vive de escribir su blog, si el puede yo también

¡Claro que si! Poder se puede y esa es la actitud, si nunca lo intentas nunca lo lograrás, pero como decía al comienzo de la entrada, "tienes que hacerlo porque te gusta, no porque te harás rico". Por hacer un poco números en el aire, si partimos de Adsense y con este venimos ganando entorno 1€ cada mil visitas (estoy tirando por lo alto), deberíamos tener dos millones de visitas (2.000.000) al mes para conseguir un sueldo de 2.000€. Evidentemente esta regla no se aplica porque cuando tienes muchas visitas complementas con publireportajes, publicidad más cara, etc. pero desde luego, vemos lo difícil que es arrancar cuando las visitas iniciales son cero.

Hacer una consulta MongoDB comprobando que un atributo array no esté vacío

En el ejemplo de obtener resultados aleatorios en una consulta de MongoDB y mongoose utilizaba un where un tanto especial. Este where es para comprobar que un atributo de tipo array que está contenido en el modelo tiene datos.

Primero definamos un ejemplo de modelo simple con el que vamos a trabajar. Lo detallo en formato JSON para no anclarnos a un entorno:

{
  name: "Nombre",
  code: "Código",
  screenshots: [],
  description: "Descripción"
}

Ahora con el modelo definido veamos como utilizarlo. Para ello debemos fijarnos en la sentencia where que vamos a utilizar.

{ screenshots: {$exists: true, $not: {$size: 0}} }

En este where, sobre screenshots realizamos 2 comprobaciones. La primera comprobación es utilizar "$exists: true" donde indicamos que la propiedad necesariamente debe existir. Recordemos en las bases de datos de documentos como MongoDB no necesariamente deben coincidir todos los modelos en una colección (tabla) de la base de datos.

Lo segundo que comprobamos es "$not" negamos que el tamaño del array sea 0 o lo que es lo mismo "$size: 0", de esta forma, le pedimos a MongoDB que nos de solo modelos que tengan la propiedad screenshots y que el tamaño de screenshots sea mayor de 0.

Ahora volvamos a ver el ejemplo que usamos con mongoose.

var where = { screenshots: {$exists: true, $not: {$size: 0}} };

mongooseGameModel.count().where(where).exec(function(err, gameCount) {
  var rand = Math.floor(Math.random() * gameCount);

  mongooseGameModel.findOne().where(where).skip(rand).populate('developer').exec(function(err, game) {
    res.locals.randomGame = game;
    next();
  });
});

En este ejemplo utilizando mongoose contra MongoDB obtenemos un juego aleatorio de un listado que cumpla la condición de que screenshots no esté vacío.

Obtener registros aleatorios con MongoDB

En una base de datos NoSQL como es MongoDB nos asaltan dudas constantemente. En este caso, ¿Cómo obtener un único registro aleatorio? A continuación os detallo como obtener este dato.

Para obtener un registro aleatorio debemos de realizar una consulta de un único elemento pero saltando los x primeros registros. De esta forma obtendremos el resultado. Nada mas fácil que verlo con un ejemplo. Para ello pondré 2 ejemplos uno directamente haciendo la consulta sobre MongoDB y otro utilizando ODM de Mongoose.

En MongoDB se haría de la siguiente forma.

db.games.find().limit(-1).skip( _rand() * db.games.count() )

Si tenemos una tabla games con un listado de juegos y queremos seleccionar un juego aleatorio, lo podríamos hacer así. Seleccionamos todos los juegos, establecemos el limit a -1 y saltamos un aleatorio.

Otro método sería utilizando mongoose, este ya solo como programación.

mongooseModel.count().exec(function(err, resultCount) {
  var rand = Math.floor(Math.random() *resultCount);
  mongooseModel.findOne().skip(rand).exec(function(err, result) {
    console.log(result);
  });
});

Como podemos ver, es un lo mismo que hacerlo directamente sobre MongoDB pero añadiendo algo de complejidad en el proceso por las llamadas asíncronas. En primer lugar deberemos obtener el número de resultados, una vez los tengamos, podemos calcular el aleatorio y obtener con findOne el resultado que queremos.

Ya para terminar un buen ejemplo de como utilizar este código, es utilizando where para filtrar los resultados, que deberemos aplicar tanto a la hora de obtener el contador como cuando buscamos el resultado, ya que si no lo aplicamos en conjunto, puede fallarnos todo el código.

var where = { screenshots: {$exists: true, $not: {$size: 0}} };

mongooseGameModel.count().where(where).exec(function(err, gameCount) {
  var rand = Math.floor(Math.random() * gameCount);

  mongooseGameModel.findOne().where(where).skip(rand).populate('developer').exec(function(err, game) {
    res.locals.randomGame = game;
    next();
  });
});