GithubHelp home page GithubHelp logo

cromai's Introduction

Desafio Cromai

Como Rodar o Programa

Primeiramente é necessário ter instalado o Python e o pip.

Após essa etapa, é recomendado instalar a biblioteca pipenv para gerenciar as bibliotecas e ambientes virtuais.

pip install --user pipenv

Em seguida, com o pipenv, crie um ambiente virtual e instale as dependências do projeto encontradas no arquivo Pipfile.

  • Criar um ambiente virtual com Python 3.x(recomendado Python=3.9)

    pipenv --three

  • Instalar dependências encontradas em Pipfile

    pipenv sync

Finalmente, para iniciar a aplicação é necessário utilizar o server uvicorn no terminal DENTRO DA PASTA RAIZ("cromai/"):

  • uvicorn app.main:app

Obs:

  • Caso deseje instalar as bibliotecas a parte utilizando o pip invés do pipenv é necessário inserir manualmente os pacotes encontrados no arquivo Pipfile;

  • Caso o server seja inicializado de outro diretório, como por exemplo "cromai/app/", irá gerar um erro de importação de módulos.

Rotas da API

Caso deseje uma interface mais amigável e gráfica, é possível visualizar as rotas e consumir a API através dos swaggers padrões do framework FastAPI, localizado nas URI:

Há também o arquivo "curl_api.txt" dentro do diretório "/Documents" com as linhas de commando para consumir a API com comentários sobre cada uma das mesmas.

Se desejar, também é possível utilizar diretamente no navegador as rotas da API a partir da URI http://127.0.0.1:8000 :

  • /upload

    POST para enviar uma imagem bitmap no formato "multipart/form-data" e retorna a confirmação do upload do arquivo.

  • /get-image

    GET que envia uma variável "filename" na query contendo o nome do arquivo e retorna a imagem caso ela seja encontrada.

  • /write-message-on-image

    POST que envia um "application/json" com os campos "filename" e "message" e retorna o nome da nova imagem(igual ao nome anterior mas com prefix="new_") com a mensagem esteganografada.

  • /decode-message-from-image

    GET que envia uma variável "filename" na query contendo o nome do arquivo e retorna a mensagem caso ela seja encontrada.

Testes

O arquivo "test_app.py" localizado dentro do diretório principal da aplicação("cromai/app/") é responsável pelas funções de testar as funcionalidades e respostas das rotas da API. Foi utilizado a biblioteca pytest para desenvolver todos testes.

Para rodar os testes é necessário iniciar o server(uvicorn) antes, ou o "Client" dos testes não irá conseguir se conectar no servidor para gerar as respostas esperadas.

Com isso, basta estar localizado DENTRO da pasta da APLICAÇÃO("cromai/app/") e rodar o seguinte comando no terminal:

  • pytest

Sobre

O desafio foi realizado buscando seguir as exigências do Case localizado na pasta "/Documents". Foi extremamente desafiador realizar esse projeto, principalmente pelo fato de eu nunca ter manipulado imagens ou outros arquivos em nível de bytes e bits. O tema do desafio foi muito legal como esperado da Cromai, o que novamente me auxiliou e incentivou durante todo meu processo de desenvolvimento, assim como meus dois gatos fazendo bagunça durante o andamento da aplicação.

A esteganografia é um método relativamente simples e com um poder muito alto, fiquei impressionado com o resultado das imagens com as mensagens embutidas. Tive grande dificuldade na parte de inserir e retirar as mensagens secretas, tendo um longo tempo ai de muitos testes e "brincadeiras" com as manipulações de bytes/bits. Conforme os dias foram passando fui me familiarizando cada vez mais com o formato da proposta do desafio, tendo conseguido realizar de fato o resultado que desejava na madrugada do ultimo dia. Esse em dúvida nenhuma foi o teste mais difícil e de fé que tive desde o início de meus estudos, a persistência de continuar tentando acho que foi o que mais obtive de valor ao finalizar o teste.

Estou estudando há algum tempo o FastAPI, um framework que gostei muito do formato e proposta dele e decidi por deenvolver utilizando o mesmo pois além de suas funcionalidades serem muito eficientes e claras, ainda vem com o bônus incrível de ter duas opções de swagger e todo código implementado segundo o OpenAPI. Poderia ter explorado mais ainda o framework usando e abusando das funções async mas por conta do tempo que demorei para completar os requisitos do desafio não consegui fazer essas implementações.

As imagens foram transformadas em escala cinza para uma melhor e mais fácil decodificação das mensagens embutidas. Além disso, em todas imagens geradas com mensagens foi adicionado o prefixo "new_", facilitando e padronizando assim as imagens alteradas das originais. Todos os arquivos são salvos em um diretório temporário criado a cada vez que o server é iniciado e deletado toda vez em que é encerrado, garantindo assim que nenhuma imagem e/ou mensagem fique armazenada como a proposta do Case.

Os testes realizados não são muitos mas eles contemplam toda a aplicação na sua totalidade, com testes bem sucedidos e mal-sucedidos, inputs corretos e errados.

Muito obrigado pela oportunidade de poder participar novamente de outro processo seletivo da Cromai, e pelo mais divertido background de desafio que já existiu. Cresci e me aprimorei muito com o teste e fiquei muito feliz com o resultado obtido.

Viva a revolução contra a ditadura dos gatos!


Heroku

O projeto foi subido para o Heroku no link https://cromaistegano.herokuapp.com

Docker

Adicionado Dockerfile e publicado o container com nome cromaistegano o qual pode ser encontrado no DockerHub https://hub.docker.com/ e utilizado através do comando:

  • docker pull terrotar/cromaistegano:version1

cromai's People

Contributors

terrotar avatar

Stargazers

JinSSJ3 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.