🏥📲 Aplicación para la visualización de archivos DICOM siguiendo un enfoque de ingeniería de software

in steemstem •  24 days ago

🏥📲 Aplicación para la visualización de archivos DICOM siguiendo un enfoque de ingeniería de software


Por Enio...

⁣


INTRODUCCIÓN

DICOM es considerado a nivel internacional el estándar que rige las comunicaciones de los artefactos y sistemas de propósito clínico, así como el almacenamiento y transmisión de imágenes y otros archivos médicos. Ha sido objeto de revisión teórica en un pasado artículo [3], en donde se analizó ampliamente su conceptualización desde una perspectiva compleja para el interés de todos los lectores de Steemit, de los profesionales de la salud y a modo de introducción para los efectos de programación.

Ahora bien, el norte de esta publicación pasa por profundizar precisamente en esto último: la utilización de DICOM en el contexto de la programación. Se trata de presentar el desarrollo de una aplicación como solución informática a un problema práctico, siguiendo un ejercicio de ingeniería de software. De esta manera, el artículo tiene los siguientes objetivos estratégicos:

1. Demostrar la aplicabilidad del estándar DICOM en una propuesta de ingeniería de software clara y medible.
2. Constituir una referencia didáctica para el desarrollo de un tipo específico de aplicación para la visualización de imágenes médicas DICOM.

Con ello, se asume un tono más técnico y provee contenido de utilidad para aquellos lectores que tengan afinidad por el desarrollo de software y la ingeniería biomédica.

Se abordará esto siguiendo una metodología que incluye el planteamiento de las motivaciones del proyecto, el análisis del problema, la construcción de la solución, y las consideraciones finales. Se insertarán algunas imágenes y tablas para ilustrar el proceso, así como una sección de referencias que enlaza los materiales utilizados y recomendados.


1. Motivo del proyecto

La popularización de DICOM es tal que la mayoría de los centros de salud modernos cuentan con sistemas de información que lo implementan, por lo que se suele encontrar estaciones de trabajo equipadas con aplicaciones para visualizar e imprimir estos archivos. Se trata de aplicaciones lectoras de DICOM, algunas gratuitas y otras que ameritan pago de licencia. Son útiles para apreciar detalladamente cada una de las secuencias de imágenes del DICOM y de todos los datos que las acompañan, como información del paciente, del estudio, de la visita, de la interpretación, del equipo, etc.

No obstante, estas aplicaciones suelen ser exóticas y no son forman parte habitual de la sabiduría popular dado que su uso es especializado. No todas las estaciones de trabajo de un centro clínico o computadoras domésticas incorporan por defecto una aplicación para esto. En ocasiones, un software específico para leer y visualizar estos archivos es distribuido en un disco compacto (CD-ROM), cuando se trata de entregar los resultados al paciente u otros fines. También, es frecuente que el personal de la salud que amerite involucrarse con estas aplicaciones reciba un entrenamiento para aprender a utilizarlas.

Con todo, se sabe que con los dispositivos móviles han aparecido soluciones prácticas para problemas de distintos dominios, lo que desde luego incluye la posibilidad de visualizar archivos DICOM a través de decenas de apps, muchas de las cuales son gratuitas, intuitivas y simplificadas. Un vistazo al mercado de aplicaciones de Google (Google Play Store) muestra no menos de 108 resultados asociados tan sólo con la palabra "dicom", aunque lógicamente las aplicaciones directamente relacionadas con la función de visualización resultan ser menos.

Pero además de las apps, que son aplicaciones nativas de un determinado sistema operativo, también hay otros géneros de aplicaciones que son "software como servicio"; una variedad de software difícil de subclasificar, pero que puede incluir a la gran mayoría de aplicaciones web que se usan a través del navegador y otras como los bots y chatbots de varias plataformas específicas.

Una consulta en el motor de búsqueda de Google de las palabras "online DICOM viewer" (visualizador de DICOM en línea) devolvió al menos 226 mil resultados, lo que sugiere una gran cantidad de aplicaciones web que ofrecen esta prestación.

Sin embargo, vale la pena destacar que no ocurre así con los bots. Las consultas llevadas a cabo en varios sitios web especializados en bots para distintas plataformas no arrojó -sorprendentemente- ningún resultado, lo que sugiere que los bots para estos fines no son muy populares.

Esto también incluye a Telegram, una mensajería instantánea de creciente popularidad que ofrece soporte para bots a través de su 'API de Bots'. Las tiendas y listas de bots más conocidas tampoco arrojaron resultados para Telegram en las consultas realizadas con la palabra "dicom".

Por otra parte, dependiendo de su complejidad, la creación de estas aplicaciones podría requerir todo un proceso de ingeniería de software que para el Institute of Electrical and Electronics Engineers, citado por Pressman (2010:11), es definida como:

1) La aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, operación y mantenimiento de software; es decir, la aplicación de la ingeniería al software. 2) El estudio de enfoques según el punto 1.

En este caso, podría hablarse de un desarrollo de software relacionado con la ingeniería biomédica, en el sentido de que se ocupa de la producción de técnicas y tecnologías que apoyen la gestión de recursos como arfefactos y sistemas de hospitales. Resulta ser un caso oportuno para aquellas personas que estudian estas ingenierías o ya tienen afinidad investigativa y profesional por ellas.

El recuento de estas consideraciones revela los principios que configuran el motivo de investigación y producción del presente proyecto de software, entre ellos:

  • El deseo de desarrollar una aplicación lectora de DICOM.
  • La necesidad de que la aplicación tenga un uso minimalista, pero efectivo.
  • La oportunidad de desarrollar la aplicación bajo la modalidad de bot para una plataforma como Telegram.
  • El interés de aplicar un ejercicio de ingeniería de software.

Se plantea, por tanto, formulación del motivo de investigación y producción de este proyecto: ¿Cómo desarrollar una aplicación bot de Telegram para la visualización de archivos DICOM siguiendo un enfoque de ingeniería de software?

1.1. Objetivo del proyecto

Desarrollar una aplicación bot de Telegram para la visualización de archivos DICOM siguiendo un enfoque de ingeniería de software.

2. Análisis de requerimientos

En este punto, se trata de aclarar los requisitos de la aplicación necesarios para poder implementar una solución. En primer lugar, a continuación se hace un planteamiento de requerimientos desde la perspectiva de un usuario promedio:

"Se desea poder utilizar el teléfono celular inteligente para abrir las imágenes médicas en formato DICOM y conocer los datos del estudio, del paciente y demás. Los datos a mostrar no tienen que ser todos, incluso en ocasiones sólo interesa la imagen. Se quiere que el programa sea algo muy fácil e intuitivo, no demasiado profesional aunque está orientada a personal médico y afín. Algo esencial es que la imagen y los datos puedan ser fácilmente compartidos con otros usuarios a través de Telegram e incluso postearlos en un grupo o canal."

Se procede ahora a categorizar los requerimientos en "funcionales" y "no funcionales" (del producto, organización y externos), siguiendo el juicio del autor (véase imagen 1)



⬆️ Imagen 1: análisis de requerimientos Autor: @Eniolw Licencia: CC BY


3. Construcción de la solución

Seguidamente se procede a construir una solución, que podrá ser el sistema y/o aplicación, generando una serie de artefactos dependiendo de la metodología que se siga. Para este caso, se aborda el diseño e implementación de la solución.

3.1 Diseño:

a) Infraestructura tecnológica:
-La aplicación será un software como servicio (SaaS) que se hospedará en un VPS, Hosting, Plataforma como Servicio (PaaS) o similares.
-Interactuará con la API de Bots de Telegram, que es la interfaz de programación de aplicaciones que ofrece esta organización para prestar servicios como los bots.
-Esta versión no demanda la utilización de base de datos ni mayores protocolos que HTTPS.

b) Ambientes:
-La naturaleza de la aplicación requiere que el lenguaje de programación a utilizar sea capaz de hacer peticiones HTTPS, por lo que se usará Python.
-Se utilizará una librería que hace de wrapper a la Bot de API de Telegram para facilitar el trabajo, específicamente python-telegram-bot. Este wrapper configurará parte esencial de cómo el código de la aplicación estará organizado.

c) Descomposición:
Por poca complejidad de esta versión de la aplicación, no requiere mayor modularización.

d) Especificación operacional:
A continuación se inserta el caso de uso de la aplicación. Se ha utilizado el formato de planilla para ahorrar la diagramación UML.

Tabla 1: Especificación operacional

Caso:Visualizar archivo DICOM
Precondición:El usuario ha obtenido y/o ubicado en su dispositivo con Telegram, un archivo DICOM cuyo contenido quiere visualizar.
Descripción:El bot deberá replicar el comportamiento que sigue en caso de que el usuario solicite visualizar un archivo DICOM.
Paso
Acción
1
El usuario solicita al bot iniciar el procedimiento para la visualización de un archivo DICOM.
2
El bot indica al usuario que envíe el archivo DICOM que quiere visualizar.
3
El usuario adjunta a la cuenta del bot y en función del cliente de Telegram específico, el archivo DICOM.
4
El bot envía al usuario la imagen y los datos asociados con ella, contenidos en el archivo DICOM.
Excepciones
Paso
Acción
3
Si el usuario envía un archivo no válido o que haya producido un error:
3.1
El bot indica al usuario que se ha producido un error y que reintente enviando un archivo válido.


e) Especificación funcional:
Ahora se procede a modelar las clases, especificar sus atributos y métodos. Nuevamente se utilizará el formato de planilla.

Tabla 2: Clase 'Dicom'

Atributos
Declaración:Descripción:
PatientNameCadena de caracteres con el nombre del paciente
PatientIDCadena de caracteres con el numero de identificación del paciente (cédula)
PatientBirthDateCadena de caracteres con la fecha de nacimiento del paciente
StudyDescriptionCadena de caracteres con la descripción del estudio
StudyDateCadena de caracteres con la fecha en que fue realizado el estudio
StudyTimeCadena de caracteres con la hora en que fue realizado el estudio
...

La clase Dicom se utilizará representará toda la información de un objeto DICOM. Dado que esto seguramente podrá hacerlo un objeto de una librería, se definen aquí los miembros que serán más probablemente utilizados para esta aplicación.

Tabla 3: Clase 'MensajeDicom'

Atributos
Declaración:Descripción:
textoCadena de caracteres que contiene el texto a ser enviado al usuario, el cual posee la información de los campos DICOM asociados con un objeto dicom recibido cuando instancias de esta clase han sido creadas.
nombre_imagen_jpgCadena de caracteres que contiene el nombre (y ruta) de la imagen generada a partir de un objeto dicom recibido cuando instancias de esta clase han sido creadas.
subtituloCadena de caracteres que contiene una pequeña porción de texto que describe la imagen asociada con nombre_imagen_jpg.


Los objetos definidos MensajeDicom permitirán generar los valores clave que un mensaje de un bot de Telegram puede requerir: un texto, una imagen y un subtítulo para una imagen.

Tabla 4: Clase 'DicomBot'

Atributos
Declaración:Descripción:
tokenCadena de caracteres que contiene el token de para acceder a la Telegram Bot API
Métodos
Declaración:Descripción:
ManejarArchivoDicomGestionará el evento que se desencadena cuando un usuario adjunta un archivo a la cuenta del bot.
ManejarComandoInicioGestionará el evento provocado por el envío del comando start por parte del usuario.


Finalmente, la clase DicomBot define el objeto principal de la aplicación que no hereda de la clase Bot de Telegram, sino que agrega esta última a sí misma. El objeto de que se instancie de esta clase manejará los archivos DICOM entrantes y un comando.

3.2 Codificación

En esta etapa se escriben las piezas de código según el diseño especificado, requiriendo probablemente revisión e incorporación de nuevos elementos descubiertos por ser muy específicos del proceso de implementación.

La estructura de archivos de la aplicación está organizada de esta forma:
+📁 aplicación
⁣⁣⁣⁣ -📁 tmp_dcm
⁣⁣⁣⁣ -📋 clases.py
⁣⁣⁣⁣ -📋 dicombot.py
⁣⁣⁣⁣ -📋 pydicom_PIL.py
⁣⁣⁣⁣ -📋 LICENSE.md
⁣⁣⁣⁣ -📋 README.md

Donde dicombot.py es el módulo que posee la clase DicomBot y la función principal para iniciar la ejecución del bot. clases.py contiene la clase MensajeDicom, cuyo papel es facilitar la elaboración del mensaje de respuesta al usuario analizando un objeto dicom. A su vez, pydicom_PIL.py es un fork del archivo del mismo nombre de la librería de contribuciones a pydicom, que fue necesario utilizar para poder extraer las imágenes contenidas en el archivo DICOM a manera de imágenes JPG individuales a través de la librería PIL.

El directorio tmp_dcm está pensado para almacenar temporalmente los archivos que se descarguen y las imágenes que se generen. Claro está, esto podría canalizarse usando directorios temporales del sistema operativo (como /tmp en los sistemas UNIX-like), pero puede que más adelante se desee conservar permanentemente los archivos. Finalmente, el archivo LICENSE.md contiene la licencia del proyecto que resulta ser la GNU Affero General Public License.

A continuación se explicará parcialmente el contenido del archivo dicombot.py, que empieza a insertarse a continuación (véase imagen 2).



⬆️ Imagen 2: archivo dicombot.py, parte 1: importación Autor: @Eniolw Licencia: CC BY


Como se observa, se importa el módulo logging para el registro de errores y el módulo pydicom que como se definió en el pasado artículo:

Es un paquete de Python puro para trabajar con archivos DICOM tales como imágenes médicas, reportes y objetos de radioterapia. Pydicom facilita el leer estos complejos archivos en estructuras pythónicas naturales para una sencilla manipulación. Los conjuntos de datos modificados pueden ser escritos de nuevo en archivos de formato DICOM" [1] [traducción del autor].

Este paquete será útil para procesar los archivos DICOM enviados al bot. También se importan los objetos Updater, CommandHandler, MessageHandler y Filters, que son los rudimentos de la librería python-telegram-bot para poder crear un bot.

Se importa la clase MessageDicom del módulo clases.py, explicado previamente. Se crea y configura el logging a nivel de INFO (mensajes informativos que detallan el progreso de la ejecución de la aplicación).

Ahora se presenta la clase DicomBot (véase imagen 3)



⬆️ Imagen 3: archivo dicombot.py, parte 2: clase 'DicomBot' Autor: @Eniolw Licencia: CC BY


Esta clase sigue la especificación presentada en el diseño (más arriba). Entre las líneas 25-32 se crea el objeto básico que será hilado (manejador de actualizaciones updater) y se registran los manejadores de eventos que se definen más abajo. El primer manejador invoca a la función comando_start (línea 46), la cual responde al comando "start" o "inicio" y simplemente envía un mensaje de bienvenida al usuario, explicando el propósito del bot. Para ello se usa el método reply.text que es un atajo (shortcut) para Bot.sendMessage definido en la python-telegram-bot. Las imágenes 4 y 5 continúan el desarrollo de esta clase (véase imágenes 4 y 5).



⬆️ Imágenes 4 y 5 (agrupadas): archivo dicombot.py, parte 3: método 'manejador_archivos' Autor: @Eniolw Licencia: CC BY


La función manejador_archivos es invocada cuando el bot recibe un mensaje que posea un archivo (Document). Es aquí donde se inicia la gestión del archivo DICOM enviado por el usuario. La función descarga el archivo referenciado en el directorio "tmp_dcm" y seguidamente lo intenta abrir con pydicom.read_file (línea 66). Si el proceso es exitoso, continúa. De lo contrario se asume que el archivo no está soportado o no es un DICOM, lo cual se le hace saber al usuario (línea 69).

Si el archivo recibido fue abierto correctamente por pydicom, entonces inmediatamente se intenta extraer la data de él y convertirla en objetos útiles para el bot: un texto y una imagen. Esto se hace instanciando un objeto de la clase MensajeDicom (línea 76), la cual se define en el archivo clases.py y es la encargada de crear una imagen con la librería PIL y de extraer algunas etiquetas del archivo DICOM. Si este proceso falla (sobretodo la generación de la imagen), entonces se genera una excepción, por lo que se informa al usuario que intente con otro archivo (línea 79).

Por el contrario, si el proceso fue exitoso, entonces se envía al usuario el texto y la imagen creada. Dependiendo de la longitud del texto, podrá ser un único mensaje consistiendo en la imagen (foto) y su subtítulo con los detalles deseados, o sino, un par de mensajes: primero la foto y luego un texto con los detalles (líneas 86-100).

La imagen 6 (véase), cierra el fichero con la función main que instancia un objeto dicom_bot de la clase recién creada e inicia su ejecución.



⬆️ Imagen 6: archivo dicombot.py, parte 4: función 'main' Autor: @Eniolw Licencia: CC BY


3.3 Pruebas, implantación y documentación

Continuando la construcción, ha sido necesaria la revisión del código y pruebas de su funcionamiento a fin de detectar fallos. Este proceso fue realizado ejecutando la aplicación desde la computadora del autor, sin requerir librerías especializadas en testings. Se creó una cuenta de bot interactuando con BotFather (el bot de Telegram para crear estas cuentas) y se obtuvo un token de autenticación. Con ello se llevaron a cabo las pruebas.

La implantación, se refiere más bien al despliegue de la aplicación, es decir, a ponerla en funcionamiento propiamente. Para ello se puede recurrir a cualquier proveedor de servicios como VPS, hostings, PaaS, IDEs en la nube, etc. Para este documento no está planteado servir la aplicación de manera permanente o continuada. De momento, la ejecución del bot se hace desde la estación de trabajo de desarrollo.

Para esta versión se preparó a modo de documentación, un archivo README.md proveyendo detalles para el conocimiento del bot y su despliegue. Además, se han incorporado suficientes comentarios en el código fuente de la aplicación para apoyar la documentación.

A continuación se muestran algunas capturas de pantalla (screenshots) de la aplicación en funcionamiento piloto (véase imágenes 7 y 8).



⬆️ Imagen 7: Comando '/start' Autor: @Eniolw Licencia: CC BY




⬆️ Imagen 8: Respuesta del bot al archivo DICOM subido por el usuario. Corresponde a un corte axial de una tomografía computarizada (TC) de senos paranasales (SPN). Se aprecia el maxilar inferior con sus piezas dentarias, donde no se evidencia patología Autor: @Eniolw usando un archivo DICOM de dominio público Licencia: CC BY


Según se observa, el comportamiento del bot es el esperado desde el mismo diseño del caso de uso. Mediante el comando "/start", el usuario inicia su conversación con el bot el cual inmediatamente le indica que ya puede enviar un fichero DICOM. Una vez hecho esto, el bot devuelve un mensaje con una foto (imagen del DICOM) e información básica contenida en el archivo.


4. Consideraciones finales

El desarrollo de este proyecto ha permitido cumplir con el objetivo planteado, en términos de la creación de una aplicación bot de Telegram para la visualización de archivos DICOM siguiendo un enfoque de ingeniería de software, extendiéndose sobre fases como levantamiento de requerimientos, análisis, diseño, implementación, pruebas, despliegue y documentación.

Existen facetas en las cuales se puede fortalecer el proyecto de software. Una de ellas es la accesibilidad al código fuente mediante su publicación en un repositorio público. Esto a su vez permitirá por una parte cumplir el objetivo de servir la aplicación permanentemente, lo que puede ser llevado a cabo por un tercero que disponga del interés y los medios para apropiarse y beneficiarse del bot.

En cuanto a las funcionalidades, pueden mejorarse y ampliarse las características. Por ejemplo, se puede programar la posibilidad de visualizar (a control del usuario) varias imágenes de archivos DICOM que contengan secuencias de imágenes. También se puede otorgar un mayor control sobre los datos específicos que desean ser visualizados, los cuales también podrían ser 'anonimizados'. Dado que el principio seguido en la versión analizada en este post es el minimalismo, estas características se plantean como propuestas para futuras actualizaciones.

El bot desarrollado puede ser de utilidad práctica para aquellos profesionales de la salud que requieran compartir archivos DICOM a través de mensajerías instantáneas y enseguida visualizarlos. También, como se planteó en la situación hipotética de requerimientos, puede ser de utilidad si se desean publicar archivos DICOM en un canal o grupo. Incluso, este tipo de servicio podría ser aprovechado de algún modo por los protagonistas de los estudios (los pacientes) sobretodo si cuentan con acceso a los archivos en formato DICOM, con lo cual podrían fácilmente observar los resultados de una ecografía, radiografía u otras imágenes médicas.

Es importante mencionar que este proyecto ha propiciado el aprendizaje del formato DICOM desde una perspectiva más técnica, ligada a la programación, lo que cubre la librería pydicom que resulta ser bastante satisfactoria para trabajar con estos archivos. Se incluye entre las referencias la documentación de pydicom para quienes deseen profundizar en las posibilidades que ofrece.

También se ha fomentado el aprendizaje de la metodología cascada, un clásico en el proceso de desarrollo software, todo lo cual ha sido aplicado en este proyecto. Aun cuando la complejidad de un problema como el delimitado en esta publicación no es elevada, la aplicación de un enfoque de ingeniería de software permite conocer algunas de sus técnicas desde un punto de vista práctico, además de impregnar a la solución de un mayor nivel de experticia y calidad técnica.


REFERENCIAS Y RECURSOS UTILIZADOS:


NOTAS ACLARATORIAS:

  • La imagen de pie es de @CarlosERP-2000 y @IAmPhysical y es de dominio público.
  • A menos que haya sido indicado lo contrario, las imágenes de esta publicación han sido elaboradas por el autor, lo que incluye la imagen de banner.
  • Agradecimientos a la doctora @Elvigia por su asesoría como profesional de la medicina durante la realización de este artículo.
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  



This post has been voted on by the steemstem curation team and voting trail.

There is more to SteemSTEM than just writing posts, check here for some more tips on being a community member. You can also join our discord here to get to know the rest of the community!

·

Thank you :D

Saludos

Mi estimado @eniolw con mucho placer he leído su contenido, disfrutando cada detalle aportado. Pero, en especial, la consideración de incorporar el enfoque de la ingeniería de software, que permite dar vida a la soluciones propias de la ingeniería informática.

Gracias
Seguimos en contacto

·

Así es, doctora @Delpilar. Mil gracias por leer y comentar. Saludos!

·

¡Gracias por el apoyo!

Congratulations @eniolw! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the total payout received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

·

Great!

¡Excelente @eniolw! Sería grandioso compartir con el paciente las imágenes y que tanto él como nosotros las podamos tener a mano, con un simple clic en el teléfono móvil, puesto que sería muy provechoso, dar un repaso a las imágenes antes de entrar al quirófano, por ejemplo; ahora que casi no disponemos de revelado de estudios radiológicos y tomográficos. Saludos y éxitos!

·

Gracias doctora @Elvigia y excelente idea de uso que plantea! :D

Calidad hermano!!! Buena idea la de incorporar una red social como telegram! Muchisima ayuda para nosotros y el paciente!! Deberiamos desarrollar una para poder mandar videos de ejercicios a los pacientea en su casa y que pedan repetirlo cuando se les olvide.......y le recuerde la dosificacion! Seria muy interesante!!

Saludos y un abrazo!!

·

Oye, qué buenas ideas las que planteas, quizá en el futuro pueda abordar ese problema. Gracias por leer y por tu apreciación @ErickYoussif!

Telegram tiene un nivel de uso muy amplio, aun cuando no ha logrado alcanzar la popularidad de Whatsapp, su cliente de escritorio permite estar conectado aún con el celular apagado, lo cual le da a sus bots un uso mas amplio. Una pregunta ¿el proyecto lo tienes en GitHub?

·

Gracias @UbaldoNet por leer! Sobre lo que me preguntas en las consideraciones finales menciono que está pendiente subirlo a un repositorio público. 😉

Extraordinario y detallado post, estimado @eniolw son aportes para la comprensión de estos temas, desde las voces de los expertos -como lo es tu caso- Sigue adelante !

·

Muchas gracias por su valoración estimado profesor @TomasTonyPerez! Así seguiremos. Saludos!

Hi @eniolw!

Your post was upvoted by utopian.io in cooperation with steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.

Contribute to Open Source with utopian.io

Learn how to contribute on our website and join the new open source economy.

Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV

·

All the best!

Congratulations @eniolw! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

·

Thank you!

Congratulations @eniolw! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

·

I see, thanks!

Congratulations @eniolw! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

SteemitBoard - Witness Update
SteemFest³ - SteemitBoard support the Travel Reimbursement Fund.

Support SteemitBoard's project! Vote for its witness and get one more award!