Telegraph to help us converting a string of bits into morse code or human readable text.
[ES/EN]: Proximamente disponible la version en ingles de este documento.
-
Recomiendo utilizar por practicidad un gestor de versiones de Node, como nvm
-
Opcional - Docker
Se puede ver la imagen generada para produccion en el repositorio de Dockerhub.
El enunciado completo del problema puede encontrarse aca
En este documento describo la forma en que pense la solucion del problema.
En este otro documento describo la forma en que resuelvo este problema utilizando un algoritmo de clusterizacion llamado K-Means, adaptado particularmente a esta situacion.
Esta solucion esta en etapa experimental, tomar recaudos. Toda contribucion a mejorarla y estabilizarla es bienvenida y apreciada!
- Clonar el repositorio en un directorio a su eleccion.
git clone https://github.com/Lzok/telegraph .
- Instalar las dependencias
npm install
- Copiar el archivo de entorno ejemplo al que sera efectivamente usado y llenar las variables con la informacion deseada
cp .env.example .env
# Abrir el archivo .env con cualquier editor y editar las siguientes variables
# Entorno de Node. development en este caso
NODE_ENV=development
# Puerto donde se correra la API. Puede ser cualquiera a eleccion.
PORT=3000
- Correr la API
npm run dev
# O mediante Docker
# Los flags pasados a este comando son para evitar algunos inconvenientes de cache
# O que la imagen resultante no esta 100% actualizada mientras desarrollamos.
# Ademas, se usa el archivo docker-compose.dev.yml que corresponde a la version de desarrollo
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up --force-recreate --build
- Endpoints
Podes ver la documentacion para los endpoints disponibles en la ruta http://localhost:<PORT>/api/v1/docs
La misma fue generada con Swagger
- Tests
Para correr la suite de tests, se debe dejar corriendo la API y en otra terminal ejecutar alguno de los siguientes comandos:
# Correr la suite completa (unit + integration)
npm run test
# Solo unit tests
npm run test:unit
# Solo integration tests
npm run test:integration
-
Hook pre-commit
Antes de efectivizar cada commit se ejecuta el linter del codigo y se corren los test unitarios. Queda pendiente que corra la suite completa, por el momento no lo decidi de esta forma debido a que no quiero forzar a instalar Docker a quien no quiera.
Se puede probar el build de la imagen productiva que genera docker con el siguiente comando:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up --force-recreate --build
TODO:
- Mejorar el manejo de errores en las funciones, muchas no estan preparadas para recibir otra cosa que lo que esperan. Empezar al menos por las funciones que se comunican con el "mundo exterior".
- Agregar tests para las cosas nuevas que se fueron agregando.
- Correr la suite de tests completa en el pre-commit. En este momento solo corren los unitarios.
- Plantear pruebas utilizando algoritmos de clusterizacion como K-means para asi poder, en teoria, decodificar mensajes que no sean constantes dentro del mismo. (Ver documento explicatorio)
Lista de referencias utilizadas acerca del tema durante el desarrollo. Todas ellas online al dia de la fecha (05-05-2020)
- Morse Standard (ITU)
- Wikipedia - Morse Code
- Wikipedia - Dichotomic Search
- Wikipedia - Huffman Coding
- Wikipedia - Levenshtein Distance
- Post Stack Exchange
- Morse Timing
- A Robust Real-Time Automatic Recognition Prototype for Maritime Optical Morse-Based Communication Employing Modified Clustering Algorithm
- Description of RSCW's algorithms
- The Levenshtein Algorithm
- Post Stack Exchange (2)
- Unstable Morse code recognition with adaptive variable-ratio threshold prediction for physically disabled persons.
- How Efficient Is Morse Code
- Dominant Speeds Of Morse Communications
- Morse Code Binary Discussion
- Morse code recognition system with fuzzy algorithm for disabled persons
- An Automatic Decoding Method for Morse Signal based on Clustering Algorithm
- Morse Recognition Algorithm Based on K-means
GNU AFFERO GENERAL PUBLIC LICENSE
La licencia completa la podes chequear aca