Ratnopam Chakrabarti es un desarrollador de software que trabaja actualmente para Ericsson Inc. Lleva bastante tiempo centrado en IoT, tecnologías máquina a máquina, coches conectados y dominios de ciudades inteligentes. Le encanta aprender nuevas tecnologías y ponerlas en práctica. Cuando no está trabajando, le gusta pasar tiempo con su hijo de 3 años.
Esta es la primera parte de una serie de entradas en las que te presentaré una aplicación de galería de fotos que permite a los usuarios subir cualquier imagen de su elección (en formato .png o .jpg) y ver todas las imágenes que han subido otros usuarios. La aplicación permite a los usuarios "gustar" una imagen en particular. Una vez que el usuario sube una imagen, la aplicación utiliza el servicio de Amazon Web Services API de reconocimiento para escanear y detectar etiquetas para esa imagen. Las etiquetas más fiables se utilizan para etiquetar las imágenes. La aplicación también permite a los usuarios hacer clic en una etiqueta concreta para ver todas las imágenes con esa etiqueta.
Demo
He aquí una enlace a la demo de la aplicación terminada.
La pila tecnológica
Couchbase - Para almacenar metadatos de imágenes
Express - Para construir el front-end con node
AWS SDK y S3 - Para almacenar los archivos de imagen y también para Rekognition imagen
Node.js - Para construir el backend de la aplicación
Además, jQuery se utiliza para realizar llamadas Ajax desde el lado del cliente a los archivos server.js.
Node.js se utiliza para construir todas las API RESTful que aprovecha la aplicación. Utiliza las siguientes dependencias para realizar el trabajo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
paquete.json "aws-sdk": "*", "couchbase": "^2.3.3", "express": "4.13.0", "formidable": "1.0.17", "gm": "^1.20.0", "hogan-express": "^0.5.2", "knox": "^0.9.2", "socket.io": "1.0.5", "uuid": "^2.0.1" |
He aquí para qué sirven estos módulos:
- El aws-sdk - utilizado para llamar a las API de AWS Rekognition
- knox - utilizado para interactuar con Amazon S3
- gm: se utiliza para cambiar el tamaño de la imagen (no queremos almacenar imágenes de gran tamaño en S3, al fin y al cabo tiene un precio).
- formidable - utilizado para procesar los archivos de entrada
- hogan-express - proporciona Bigote motor de plantillas para express framework
- socket.io - utilizado para emitir eventos del servidor al cliente sobre los que se puede actuar
- couchbase - se utiliza para interactuar con la base de datos Couchbase
- uuid - utilizado para generar IDs de documentos aleatorios para almacenar documentos JSON en Couchbase
Papel de Couchbase
Estoy utilizando Couchbase en esta aplicación para
- almacenar metadatos de la imagen, como el nombre del archivo
- almacenar otra información útil, como el número de "me gusta" de una imagen y las etiquetas asignadas a una imagen
En este post (Parte 1), describiré los pasos necesarios para usar Couchbase con la aplicación de galería de fotos. El código fuente completo de la aplicación está disponible en GitHub.
Instalar Couchbase y otros módulos de Node
Para instalar todos los módulos enumerados en package.json, vaya al directorio raíz de la aplicación y escriba:
1 |
npm instale |
Una vez instalados todos los módulos, incluido Couchbase, tu tarea ahora es utilizarlo en la aplicación.
Config.json
Define parte de la información configurable en un archivo .json llamado config.json.
1 2 3 4 5 6 7 8 9 10 11 |
{ "couchbase": { "servidor": "127.0.0.1:8091", "cubo": "fotogalería" } } |
Aquí, he especificado el host y el puerto de Couchbase Server y también el bucket donde se almacenará la información de metadatos de la imagen.
server = 127.0.0.1:8091 (si está ejecutando Couchbase localmente)
Una vez definida la configuración, la siguiente tarea consiste en importarla a la aplicación exprés.
Aquí tienes un fragmento del código de la aplicación:
1 2 3 4 5 6 7 |
var couchbase = requiere("couchbase"); var config = requiere("./config"); módulo.exportaciones.cubo = (nuevo couchbase.Grupo(proceso.env.COUCHBASE_HOST || config.couchbase.servidor)).openBucket( proceso.env.CUBO_CAMA || config.couchbase.cubo); |
Estamos haciendo uso de algunas variables de entorno para identificar el host de Couchbase y el bucket. Si no se proporcionan en tiempo de ejecución, los valores predeterminados serán los del config.json mencionado anteriormente.
Ejecutar y configurar Couchbase
Como requisito previo para ejecutar la aplicación localmente, primero hay que instalar y ejecutar Couchbase Server. Dirígete a la página SOPORTE DESCARGAR PÁGINA e instale según su propio sistema operativo. En mi caso, estoy ejecutando una instalación de Couchbase 4.6 en mi sistema Windows. Una vez que Couchbase esté funcionando, cree un bucket llamado "photogallery". Este bucket almacenará toda la meta información de las imágenes. Una cosa importante a tener en cuenta, hay que crear un índice en el bucket antes de usarlo. Para crear un índice:
1 |
CREAR PRIMARIO ÍNDICE EN <bucketname> |
Una vez creado el índice, diríjase a la pestaña Índice y el índice debería aparecer en la lista.
En un entorno de producción, no se recomienda tener un índice secundario global, ya que podría causar una degradación del rendimiento. Sin embargo, para la escala de nuestra aplicación, está bien tenerlo.
Guardar y recuperar documentos en Couchbase
La aplicación photogallery hace lo siguiente:
- Una vez que el usuario selecciona el archivo y hace clic en cargar, la aplicación lo almacena en un bucket de Amazon S3.
- Una vez que el archivo se ha guardado correctamente en S3, llama a AWS Rekognition API para asignar etiquetas a la imagen.
- Una vez asignadas las etiquetas, la aplicación almacena la información de metadatos de la imagen en Couchbase fotogalería cubo.
Para guardar los datos en Couchbase, necesitamos el siguiente fragmento de código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// importar variables var uuid = requiere("uuid"); var db = requiere("../upload").cubo; var config = requiere("../config"); var N1qlQuery = requiere(couchbase).N1qlQuery; //definir un modelo función ImageModel() { }; // definir la función guardar ImageModel.guardar = función(datos, devolución de llamada) { var jsonObject = { nombre de archivo: datos.nombre de archivo, le gusta: datos.le gusta, etiquetas: datos.etiquetas } // Si el id del documento no existe crea un id único para insertarlo var documentId = datos.id ? datos.id : uuid.v4(); db.upsert(documentId, jsonObject, función(error, resultado) { si(error) { devolución de llamada(error, null); devolver; } devolución de llamada(null, {mensaje: "éxito", datos: resultado}); }); } |
Lo que hace el código anterior es importar las dependencias apropiadas para interactuar con la base de datos Couchbase y definir una función para guardar los datos. Se crea un cuerpo JSON con nombre de archivo, gustos y etiquetas de una imagen y luego se llama a la función upsert() para guardar los datos. Si un documento no tiene un atributo "id" asignado, la función crea uno usando uuid.v4().
Para recuperar documentos, eche un vistazo al siguiente fragmento de código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/* * Obtener todos los documentos de Couchbase Server usando N1QL */ ImageModel.getAll = función(devolución de llamada) { var declaración = "SELECT META(fotos).id, filename, likes, tags" + "FROM `" + config.couchbase.cubo + "AS fotos"; var consulta = N1qlQuery.fromString(declaración).coherencia(N1qlQuery.Coherencia.SOLICITUD_PLUS); db.consulta(consulta, función(error, resultado) { si(error) { devolver devolución de llamada(error, null); } devolución de llamada(null, resultado); }); }; |
El fragmento de código anterior devuelve todas las imágenes del bucket utilizando la consulta N1QL. Esto es útil para listar todas las imágenes del bucket photogallery. Tenga en cuenta que el bucket de Couchbase almacena sólo el nombre de archivo, una parte de la url de Amazon s3 es estática y la url completa se crea añadiendo el nombre de archivo a la url estática de s3 de una imagen.
Parte estática -> https://s3.amazonaws.com/la-image-tagger-chakrar27/
Parte dinámica -> nombre de archivo
Toma, la-image-tagger-chakrar27 es el bucket s3 que he creado. Para crear este bucket, sube este cloudformation a AWS y crear una pila. Se creará el cubo s3.
Este post forma parte del Programa de Escritura de la Comunidad Couchbase
[...] En la Parte 1 de esta serie de blogs, vimos cómo podemos almacenar y recuperar metadatos de imágenes desde y hacia un bucket de Couchbase. En esta [...]