Gamificação: Como tornar seu aplicativo mais atrativo

Atualmente é cada vez mais difícil capturar a atenção de uma pessoa em um aplicativo, pois existem diversos fatores que tiram a atenção do usuário quando ele está usando algum aplicativo que não o engaje, não pegue a atenção plena do usuário, alguns exemplos são as notificações de outros aplicativos, como por exemplo alguma marcação em publicação em redes sociais, se o usuário não estiver engajado no aplicativos em questão ele sairá para ver a notificação.

O que é Gamificação / Gamification?

Gamificação ou Gamification são técnicas, estratégias, designs e mecânicas de jogos utilizadas para trazer engajamento, aumento de produtividade, foco dentre outros fatores para tarefas, aulas ou até mesmo aplicativos que não são voltados para jogos.

Um bom exemplo de gamificação é o Nike Plus, onde ao atingir metas pré-estipuladas o usuário ganha troféus e status dentro da ferramenta, criando assim uma competitividade entre os usuários.

Outro termo utilizado é ludificação, onde ele tem seu uso no marketing com o significado de incentivar o envolvimento com o produto ou serviço.

Qual o ganho do uso de gamificação?

Nada melhor do que o usuário utilizado o aplicativo que lhe foi ofertado correto? Por isso a gamificação se torna algo com grande valor, pois com o uso de frameworks de gamificação, pode-se fazer sistemas de pontuações, nomeações, avatares dentre outras ferramentas que farão o usuário ficar cativado e utilizar mais vezes o aplicativo.

Um exemplo de framework é o Octalysis que foi desenvolvido por Yu-Kai Chou (foto ao lado) e lançado em 2010, onde este se tornou referência mundial, pois Chou já estava trabalhando em “gamificação” antes da mesma ser reconhecida pelo termo.

Octalysis: Conceito e Funcionalidades

O framework Octalysis trouxe como princípio 8 Cores Drives que motivam as pessoas a fazerem suas tarefas ou utilizar algo da melhor forma, usando a diversão como um mecanismo para engajá-los, são eles:

  • Significado Épico (Meaning)

Este Core tem significado de dar importância ao usuário, lhe dar título, fazendo ele se sentir como “O escolhido” se sentir especial.

  • Criatividade e Feedback (Empowerment)

O feedback dentro do octalysis diz respeito a mostrar para o usuário que ele está avançando, crescendo, um exemplo são plataformas de línguas como a Pearson, onde está presente o leveling (Nivelação).

  • Influência Social (Social Influence)

O Core Social e de afinidade fala sobre motivar as pessoas por meio do sentimento de nostalgia, competitividade e inveja, ou seja, mostrar os status de outros usuários para que se possa ter uma certa rivalidade.

  • Imprevisibilidade (Unpredictability)

Para os curiosos esse é um ponto a ser explorado, pois a vontade de saber o que irá acontecer em seguida, como por exemplo temos a vontade de assistir mais de um episódio de séries, ler mais uma página, jogar mais uma partida.

  • Perda (Avoidance)

A perda ou prevenção é o progredir com cuidado, pois há um certo risco de perder uma parte do progresso ou até perder tudo, isso causa tensão e fazendo com que o usuário fique mais preso à aquilo que está fazendo.

  • Escassez (Scarcity)

A Impaciência e Escassez é uma tática muito usada em jogos para deixar as pessoas ansiosas para poder jogar, a aplicação da mesma fora do mundo dos jogos não é diferente, um exemplo é a exclusividade, para ter funções a mais o usuário deverá pagar para ter.

  • Propriedade (Ownership)

A propriedade nada mais é do que a liberdade de ser diferente, como a criação de um avatar personalizado para cada pessoa, isso vai fazê-la se sentir única, outra é a posse, que pode ser tratada como acumulo de troféus/insígnias.

  • Realização (Accomplishment)

A realização está ligada com praticamente todos os outros Cores, onde nessa temos a questão dos desafios que darão recompensas / conquistas para o usuário, porém o desafio não pode ser algo fácil de ser conquistado, pois perderá o significado, deve ser algo desafiador onde no início será fácil, porém conforme ir avançando vá se tornando mais difícil para que o usuário crie vontade de crescer dentro da ferramenta.

Conclusão

A Gamificação está se tornando cada vez mais uma ferramenta presente no dia a dia das pessoas, pois como comprovado em pesquisas como a da TalentMS a gamificação de coisas tornou as pessoas mais produtivas (89%) e felizes (88%) no trabalho. Outro ponto é o mercado de gamificação, onde ele aumenta em cada dia, em 2018 movimentou cerca de 5,5 bilhões de dólares, sendo procurado pela maior parte das empresas mundiais.

Referências:






* https://www.youtube.com/watch?v=CK_4JfDZIjA&ab_channel=VIDDIA-Educa%C3%A7%C3%A3oOnline 



 * https://www.youtube.com/watch?v=26DaeUOijZE&ab_channel=Fant%C3%A1sticaF%C3%A1bricaCriativa  



* https://www.youtube.com/watch?v=eT5Jgt0jr1o&ab_channel=UILab



* https://www.orcestra.com.br/post/octalysis-o-framework-de-gamifica%C3%A7%C3%A3o-que-voc%C3%AA-precisa-conhecer



* https://posdigital.pucpr.br/blog/yu-kai-chou



* https://sambatech.com/blog/insights/gamification/ 



* https://neilpatel.com/br/blog/gamification-o-que-e/ 

Autor: Guilherme Oliveira Mota

Ferramentas para acelerar o desenvolvimento front-end

Com tecnologias cada vez mais visuais, o desenvolvedor front-end precisa se reinventar para sempre entregar softwares com mais qualidade e velocidade. Para isso muitas tecnologias são lançadas a todo tempo, facilitando a vida dos programadores e acelerando o processo de programação.

Editores de texto

Talvez sejam a principal ferramenta de um programador.
Características como layout, funcionalidades, atalhos e até mesmo cores podem fazer a diferença na escolha. Outro detalhe importante é a linguagem de programação que será desenvolvida, muitos dos editores são otimizados e/ou feitos para determinada linguagem.

  • VSCode

Ou Visual Studio Code, é um editor desenvolvido pela Microsoft, multiplataforma, que pode ser instalado em Windows, Linux e MacOS.
Características: extensível, suporte nativo ao git, IntelliSense, depuração direta no editor.

  • Sublime Text

É um editor que busca simplicidade e facilidade em sua utilização. Multiplataforma, funciona em em Windows, Linux e MacOS.
Características: ampla comunidade, grande gama de plugins, coloração de sintaxe personalizável.

  • Atom

Desenvolvido pelo GitHub, é um editor de código open source multiplataforma.
Caraterísticas: ampla comunidade, suporte nativo ao git, instalador de pacotes integrado, interface simples.

Frameworks

Framework são conjuntos de códigos fonte genéricos agrupados, que facilitam a criação de algum sistema.
Eles podem facilitar o desenvolvimento de uma aplicação, tanto individualmente quanto coletivamente, uma vez que em alguns casos podem fragmentar o código fonte em pequenas partes melhorando o desempenho em equipe.

  • Bootstrap

O Bootstrap é uma biblioteca que visa facilitar o desenvolvimento web, com uma série de estilos e componentes. Ele traz uma padronização de layout, com um sistema de grid que é amplamente utilizável. O framework é tão grande, que vários outros frameworks derivados são criados a partir deles.

  • React

React é um framework Javascript do Facebook para construção de interfaces de usuário. Ele tem como premissa a componentização de blocos e páginas, assim dividindo as partes lógicas e responsabilidades de cada parte, isso tem grande impacto no trabalho em equipe pois cada programador pode focar em um componente diferente de forma mais individual, com menor dependência.

  • Angular

É um framework Javascript para construir páginas web dinâmicas. Ele fornece tecnologia para construir aplicativos para web baseados em uma única página dinâmica. Também permite ao desenvolvedor fazer uso da linguagem de marcação HTML para definir dados associados, validações, e response handlers para ações do usuário.

Ferramentas e plugins

  • Sass

Sass é um compilador CSS que permite escrever os estilos web de forma mais inteligente e rápida. Ele transforma o código escrito de forma hierárquica em CSS interpretado pelos navegadores. Também funciona modularizado e contém várias funções para facilitar a escrita.

  • Emmet

É uma extensão que facilita a digitação do código em diversos editores. Ele funciona como autocomplete e também possui diversas palavras chaves que aumentam a rapidez na escrita. Também é altamente customizável, possibilitando atalhos customizáveis.

  • ESLint

O Eslint funciona como uma forma scanner no código que procura por problemas e más práticas. Também é possível indentar o código, de forma que a aplicação toda use o mesmo padrão e regras. Ele é muito customizável, isso permite que as equipes definam suas próprias regras de codificação, e se os ajustes ocorrem de forma automática ou manual.

Como pode se notar, o desenvolvimento de software está crescendo cada vez mais. Programadores e empresas precisam buscar soluções que facilitem a codificação e interações entre a equipe. Muitas ferramentas estão nascendo e é preciso escolher com sabedoria.

Autor: Leandro Santos

IDEs para desenvolvimento em Java Script

Introdução

Os IDEs vêm com muitos recursos extras, como por exemplo o preenchimento automático de texto, podendo dar mais flexibilidade ao usuário. Com a ajuda de IDEs, é possível aumentar a produtividade. Existem diversos IDEs na Internet e muitos deles são de código aberto.  

Desenvolvimento

Nesta lista de IDE Javascript, selecionei 4 de código aberto e 4 premium (pagos). Todos eles estão no top 10 da lista de IDEs para JavaScrip cujos dowloads foram mais procurados entre 2020 e 2021, conforme a pesquisa anual da Github. 

Características de uma IDE 

Muitas são as características presentes em uma IDE, as mais comuns são: 

  • Editor de código-fonte: podendo escrever comandos suportados por uma determinada linguagem de programação; 
  • Preenchimento inteligente: recurso de uma IDE no qual permite o preenchimento de trechos de códigos com a finalidade de agilizar o desenvolvimento; 
  • Compilador ou interpretador: é necessário que toda IDE possua um compilador (ou um interpretador), que transforme todo o código-fonte escrito em linguagem de máquina; 
  • Debbuger: mais utilizado para encontrar e corrigir erros no código-fonte; 
  • Geração automática de código: recurso no qual permite a criação de trechos de códigos predefinidos, trazendo agilidade aos diversos processos de desenvolvimento; 
  • Refatoração: ferramenta que, em conjunto com testes automatizados, garantam uma melhoria constante do código-fonte e erradicação de bugs. 

 Vantagens e desvantagens de uma IDE 

Apesar da facilidade de criação de aplicações, as IDEs possuem diversas vantagens e desvantagens em sua utilização. Dentre elas é possível citar: 

Vantagens de uma IDE 

 Aumento da produtividade: Por possuir diversas ferramentas que auxiliam na criação de aplicações, o desenvolvedor só utilizará esta ferramenta, aumentando assim sua produtividade; 

  • Diminuição gastos: Por ser uma solução completa, muitas vezes esta é a única ferramenta que o desenvolvedor precisa adquirir para a construção de suas aplicações; 
  • Mede desempenho: IDEs possuem ferramentas para medição de desempenho da execução de aplicações; 
  • Geração automática de códigos: é o recurso que permite a criação de trechos de códigos predefinidos; 
  • Facilidade em fazer verificações e correção de erros: Diversas IDEs possuem ferramentas que analisam o código que está sendo desenvolvido, permitindo que possíveis erros sejam corrigidos no momento do seu desenvolvimento; 
  • Completa: Com um único software o desenvolvedor consegue desenvolver, testar e corrigir uma aplicação. 

Desvantagens de uma IDE

  • Pagas: Muitas IDEs são pagas, o que dificulta sua utilização pela comunidade; 
  • Facilidade no desenvolvimento: Sendo possível prover diversas facilidades na hora do desenvolvimento (como a geração automática de códigos), mas podem também contribuir para que muitos desenvolvedores se tornem “mal acostumados” na hora de desenvolver, se tornando dependentes da IDE; 
  • Ambiente lento: Apesar de possuir uma solução completa, isso tem um custo. A maioria das IDEs consomem muito mais recursos de hardware do computador que um simples editor de texto. 

 IDE´s java script  

  • Eclipse 
  • Visual Studio Code 
  • NetBeans 
  • Atom, um IDE Javascript 

 IDE Javascript Premium 

  • Visual Studio 
  • WebStorm – IDE Javascript 
  • Sublime Text 

 Considerações Finais 

A utilização de uma IDE não é obrigatória, podendo também ser possível desenvolver aplicações sem que o desenvolver utilize a mesma. Em certas situações o desenvolvedor poderá a escolher por diversas vantagens que sua utilização prove aos usuários, nada melhor que analisar todas estas questões a fim de escolher aquela que mais se adequa a sua forma de desenvolvimento.  

 Referências 

MARIANA, Paldoam. 7 Ide´s java script. São Paulo: Geek Hunter, 2021. 

RED HAT, O que é a IDE?. São Paulo: Red Hat, 2021. 

Autora: Brenda Andrade Ribeiro

Gamificação

Em um mundo como vivemos hoje em dia, com milhares de distrações para qualquer lado que olhamos, é incontestável a dificuldade em criar uma determinada tarefa/tema que prenda a atenção e o interesse da pessoa e que faça com que se engaje a essa tarefa/tema.

O que é Gamificação?

A Gamificação é uma metodologia que adapta os conceitos, ideias e dinâmicas dos jogos para o mundo real, que tem como alguns de seus objetivos: motivar, causar interesse, curiosidade, engajamento e incentivar as pessoas a realizar determinada atividade.

Alguns dos elementos que essa metodologia busca do mundo dos jogos para implementar no mundo real e alcançar seus objetivos, são:

• Competição;

• Cooperação;

• Aplicação de fases;

• Recompensas;

Com o uso desse método é amenizado a dor que a maioria das pessoas sente ao tentar aprender algo novo.

Por que implementar a Gamificação?

Por que essa metodologia busca resolver um dos problemas da atualidade, que é a falta de interesse e motivação das pessoas.

Diversas pesquisas comprovam que as pessoas se sentem mais motivadas, felizes e produtivas quando estão trabalhando em algo que está gamificado.

Como implementar a Gamificação?

Quando estamos falando sobre a implementação da Gamificação em algum cenário, muitos buscam algo pronto, como um jogo já pronto, embora um jogo pronto possa funcionar em várias ocasiões, implementar um projeto de Gamificação que foi estudado para um determinado cenário, sempre trará mais benefícios.

Para levantar o que é preciso fazer e implementar na hora de criar um projeto de Gamificação, depende muito do seu cenário, se é para educação, se é empresarial, se é no ramo da saúde, então o ideia é sempre consultar alguém experiente e profissional.

Entretanto, alguns passos são sempre utilizados, independente da área que esteja, são eles:

• Estabelecer missões e desafios;

• Sistema de pontuação;

• Sistema de Ranking;

• Premiações

Esses sistemas/métodos estão presente em praticamente todos os projetos de Gamificação, pois sistemas de ranqueamento e recomeças são ações que incentivam a continuar até que seus objetivos sejam alcançados, pois, se sentem empolgados a realizar uma ação ou progredir com a tarefa, além de já estarmos bem habituados a esses sistemas, que estão presente em praticamente tudo que a sociedade jovem pratica.

Benefícios da Gamificação

O uso dessa metodologia traz muitos benefícios, dentre alguns dos benefícios, estão:

– Ameniza a dor do aprendizado

No método tradicional de ensino para as pessoas de hoje em dia, é comum com que associem o aprendizado a algo chato, simplesmente obrigatório, com o uso da Gamificação tornando o ensino mais atrativo e divertido, essa dor é amenizada.

– Estimula a persistência

Com a Gamificação, o aprendizado se torna interessante, alguns dos métodos utilizados dentro da Gamificação faz com que a pessoa queira seguir, continuar com o que está fazendo.

– Melhora o foco

Com as grandes distrações dos dias atuais, juntando com o método tradicional de ensino que é associado como algo chato, qualquer mínimo detalhe é o suficiente para tirar o foco da pessoa do aprendizado, portanto, a Gamificação fazendo com que o aprendizado deixe de ser algo chato, para ser algo interessante, curioso, fazendo com que a pessoa se engaje e até mesmo divertido algumas vezes, faz com que o foco dessa pessoa não seja perdido por qualquer distração.

Conclusão

A eficácia dessa metodologia não tem como ser negada, por essa razão o crescimento no uso desta metodologia está tão em alta.

Os benefícios gerados na utilização da Gamificação são muito importantes, ao gerar motivação para uma pessoa seguir, quebra uma das maiores barreiras para o aprendizado e sucesso de uma pessoa, e essa barreira é a desmotivação.

Alguns estudos sobre a Gamificação aponta que cerca de 83% das pessoas que passaram por um treinamento que havia Gamificação responderam de maneira positiva, e que 89% se sentem mais produtivas no trabalho, quando o mesmo está gamificado.

Autor: Fabrício Vanazzi

NodeJS vs Go

NodeJS vs Golang

Nos dias atuais e na era da informação, se torna cada vez mais fácil ter acesso a um bom conteúdo para estudar e se aperfeiçoar. Isso possibilitou que nós, desenvolvedores, tenhamos uma grande quantidade de tecnologias à nossa disposição para solucionar os problemas corriqueiros de nosso dia a dia. Este texto tem como objetivo comparar duas excelentes tecnologias que empoderam milhões de desenvolvedores ao redor do mundo. Durante este post, irei  abordar diversos pontos que considerei importantes para a escolha de uma stack e espero que talvez, encurte a sua jornada.

O NodeJS é um runtime JavaScript, construído sobre o V8, um motor de renderização, criado pelo Google e considerado por muitos, um dos maiores avanços na engenharia de software, depois do Linux e do Git. Foi criado por Ryan Dahl e apresentado em 2009. É open-source e se tornou o mais popular ecossistema multiplataforma para o desenvolvimento de aplicações. De uma forma sucinta, o V8 transforma o código JavaScript em C++ e realiza sua execução.

O Go ou Golang teve seu início em 2007, originalmente por uma equipe do Google. Em 2009, foi apresentada ao público e lançada como open-source. A equipe core de criação e design da linguagem, são ícones no mundo de desenvolvimento de software. Entre eles estão: Robert Griesemer, Rob Pike e Ken Thompson. A proposta da linguagem foi trazer boa performance, segurança e aumentar a produtividade, sendo uma alternativa ao C++ e ao Java.

NodeJS – Especificações

O NodeJS, como comentando anteriormente foi construído sobre o V8, porém, ele não se limita apenas a isso. Sua arquitetura é complexa, a estrutura principal é composta por 6 módulos distintos, que comunicam-se para permitir que as aplicações sejam executadas. Esses módulos são: V8, Libuv, http-parser, c-ares, OpenSSL e zlib. Podemos ver essa disposição de dependências na imagem a seguir:

Image Source: https://dev.to/khaosdoctor/node-js-under-the-hood-1-getting-to-know-our-tools-1465

Com a utilização de JavaScript, o código é dinamicamente tipado e vem recebendo evoluções conforme novas especificações do Ecmascript são lançadas.

Não podemos falar de Node, sem mencionar que o mesmo é orientado a eventos, assíncrono e não bloqueante. Para organizar isso, utiliza uma thread principal, para que todo o processo do event loop seja controlado. Esse é o motivo de ser chamado de single-threaded, mesmo utilizando worker threads em outros processos.

Ao contrário do que muitos pensam, o NodeJS não compila o código e executa posteriormente, assim como C ou o GO. Os códigos são compilados a tempo de execução, em um processo chamado de JIT (Just-in-time), trazendo grandes benefícios como otimização dos códigos durante a execução do programa.

Go – Especificações

Go ou Golang é uma linguagem de programação procedural e fortemente tipada, com uma sintaxe parecida com C. Apesar de sua tipagem, ela permite que ocorra uma inferência de tipos, no momento da declaração de uma variável, facilitando assim a vida dos programadores. Como comentado anteriormente, ela foi desenvolvida para ser altamente escalável e ter uma curva de aprendizagem menor que o C e o C++. Diferentemente do NodeJS, é uma linguagem compilada, que permite distribuir seus binários.

Por ser uma linguagem relativamente nova, ela foi criada com o intuito de utilizar todos os núcleos de processamento dos CPU’s modernos. Para tornar essa utilização de múltiplos cores mais amigável, foram criadas as Goroutines, que abstraem a necessidade de trabalhar manualmente com as threads.

Mesmo sendo uma linguagem compilada, GO possui um garbage collector, que foi casos de polêmicas em sua utilização em grande escala. Esse garbage collector recebeu muitas melhorias desde então.

Go instaurou uma cultura diferente das demais linguagens, sempre prezando pela simplicidade e procurando ao máximo trazer o máximo de ferramentas em seu core, facilitando assim a vida dos desenvolvedores. Essa abordagem divide opiniões, onde alguns acham que torna-se inflexível e outros acreditam que isso pode prevenir algumas decisões errôneas.

Aplicações das Tecnologias

O NodeJS está em praticamente todos os lugares. Ele é comumente utilizado para realizar a criação de API’s, com express, é utilizado em projetos React, é utilizado em aplicações desktop multiplataforma através do Eletron, é utilizado em aplicativos móveis através do React Native e também pode ser utilizado em aplicações embarcadas.

GO é geralmente utilizado para construir API’s, scripts e aplicações embarcadas. É bem versátil e tem diversas bibliotecas para a utilização em interfaces para aplicações desktop. Por se tratar de algo criado e desenhado para rodar em servidores, não é suportada na Web, apesar de ter iniciativas executando através do WebAssembly.

Curva de Aprendizado

Todo e qualquer desenvolvedor, nos dias atuais, precisa saber o básico de JavaScript, com isso, ao meu ver, a curva de aprendizagem do NodeJS é menor. Porém, GO é muito simples, possui uma boa documentação e desenvolvedores originalmente de linguagens como: Java, C#, C e C++, tem grandes facilidades na evolução.

Ferramental Disponível e Gerenciamento de Dependências

O gerenciamento de pacotes do Go é infinitamente superior ao do NodeJS. Golang cria uma pasta no repositório local do usuário, e mesmo que múltiplos projetos utilizem as mesmas dependências, elas são armazenadas uma única vez. Poupando muito espaço se compararmos com o node_modules, que requer que as dependências fiquem na mesma pasta do package.json.

Quanto ao ferramental de desenvolvimento, tanto um quanto o outro é possível escolher seu editor de código favorito, atualmente os principais dão suporte a linguagem. Existem também IDEs construídas por empresas como a JetBrains para ambas as tecnologias. 

Usando como base o Visual Studio Code, o GO se destaca em possuir um Linter que é instalado e configurado automaticamente ao iniciar um arquivo da respectiva extensão. Isso facilita bastante, pois tudo é baixado diretamente pelo editor e requer apenas uma extensão. No NodeJS para termos um bom linter, é necessário baixar a extensão e configurar manualmente os arquivos no projeto.

Em questão de bibliotecas, o NodeJS tem uma grande vantagem, tendo uma comunidade maior, com mais variedade e possuindo inúmeros projetos open source maduros, bem codificados e consolidados. GO tem uma comunidade em constante crescimento, e cada vez mais, novas bibliotecas são criadas e disponibilizadas no Github.

NodeJS tem frameworks muito populares e maduros, como Express, NestJS, LoopBack, etc. Enquanto o GO possui frameworks com uma popularidade menor, porém, muito eficientes, como o GIN, Fiber, etc.

Mercado

O mercado de tecnologia como um todo está bem aquecido. Para ambas as linguagens, existem bastante vagas em aberto, a diferença existe na busca de perfil, onde as vagas para GO, buscam geralmente pessoas com mais experiência na área. Isso não quer dizer que não existam vagas, para Junior, porém, se compararmos com o NodeJS, esse número é menor.

Quanto a empresas que utilizam determinada tecnologia, para o NodeJS podemos citar, Uber, Netflix, Paypal, Trello e muitas outras. O GO também está tendo uma rápida adoção e já temos casos de uso no Mercado Livre, Twitch, SendGrid, Dropbox e o próprio Google. Também vale salientar que o Docker, Kubernetes e o Terraform são construídos nesta tecnologia.

Performance

Para comparar a performance, me baseei em dados do TechEmpower, um dos mais renomados benchmarks, com os testes mais efetivos e em diversos segmentos. No atual momento que escrevo este texto, o Round é o 19.

Acredito que um dos testes mais relevantes são os de Data Updates, onde é bem perceptível que os frameworks Go, tem grande vantagem:

Desconsiderando o es4x, que é o JavaScript rodando no Vert.x, os frameworks escritos em GO dominam o ranking da posição 2 à 20, aparecendo sutilmente o Fastify.

Em outro cenário, realizando múltiplas requisições no banco de dados, podemos perceber novamente que o Go tem uma grande vantagem:

Também dominando as 20 primeiras posições do ranking, desconsiderando novamente o es4x.

Conclusão

O GO tem claramente um melhor gerenciamento de dependências, mais performance e está em um mercado ascendente, onde aqueles que se aventurarem em seu profundo entendimento, poderão colher bons frutos. Porém, é recomendado para equipes mais maduras, que tenham a capacidade de manter uma arquitetura de microsserviços e as aplicações Frontend desacopladas. 

NodeJS tem um mercado maior, com uma curva de aprendizado menor e possibilita que desenvolvedores possam atuar em diferentes partes da arquitetura, sem ter que aprender uma nova tecnologia. Tem uma performance aceitável e uma quantidade de frameworks e bibliotecas exuberante.

Ao comparar duas tecnologias, a ideia não é definir qual é a melhor e sim explanar as diferenças para que a escolha seja a mais adequada para um determinado contexto.

Autor: Francisco Felipe de Lima.

Fonte de referências:

https://productcoalition.com/reasons-why-golang-is-better-than-other-programming-languages-4714082bb1b1#:~:text=Golang%20emerged%20as%20an%20alternative,scalable%20servers%20and%20software%20systems.

https://www.geeksforgeeks.org/golang/?ref=lbp

https://www.quora.com/What-kind-of-applications-or-software-can-you-make-with-Golang

https://github.com/gofiber/fiber

https://medium.com/@blogger.ashishsharma/golang-vs-node-js-comparison-and-why-developers-prefer-node-js-9e669319df52

https://dev.to/khaosdoctor/node-js-under-the-hood-1-getting-to-know-our-tools-1465

https://blog.bitsrc.io/the-jit-in-javascript-just-in-time-compiler-798b66e44143

https://blog.gopheracademy.com/advent-2018/go-in-the-browser/

https://docs.gofiber.io/benchmarks https://www.techempower.com/benchmarks/

Autenticação

A Autenticação em sistemas computacionais consiste em confirmar a autenticidade de uma pessoa dentro de um determinado contexto e está relacionado diretamente à segurança do sistema verificando a permissão e os limites de acesso do usuário.

Há diversas formas de autenticação dentro de um sistema como por exemplo: os Smart Cards conhecidos como tokens, a biometria e a mais difundida e aceita que é o uso de senha.

Framework e Autenticação

Dentro do universo JavaScripts temos diversos frameworks e bibliotecas que utilizamos como ferramentas para desenvolvimento visando o uso das ferramentas Node.js e React.js, temos alguns frameworks que auxiliam no processo de criação dessas autenticações tais como o Passport.js, cujo download está estimado em mais de 905 mil segundo o site (openbase.io/packages/top-nodejs-authentication-libraries).

Passport.js é um framework que utiliza a teoria de middlewares e dispõe de mais de 500 estratégias de autenticação, contando com as estratégias de autenticação através da conta do Facebook, Twitter, Google e muito mais, uma das estratégias mais usadas e que também está disponível é o JWT (JSON WEB Token).

Exemplo de Autenticação com Passport.js em uma estrutura já cirada:

routes.post('/login', async (request, response, next)=>{
    passport.authenticate(
      "login",
      async(err,user,info)=>{
          try {
              if(err || user){
                  const error = new Error('Erro ao autenticar usuário');
                  return next(error);
              }

              request.login(user, {session:false}, async (err)=>{
                  if(err) return next(err);
                    const body = {id:user.id, email:user.email}

                    const token = jwt.sign({user: body}, 'top_secret');
                    
                    return response.json({ token });
              })
          } catch (e) {
              retun next(e);
          }
      });
})

Explicando o JWT

O JWT consiste em métodos abertos e padrões da indústria que representam as solicitações entre as partes com segurança utilizando objeto JSON, permitindo a codificação e decodificação de informações através de assinaturas digital usando um segredo com o algoritmo HMAC(Hash-Based Message Authentication Code, é utilizado especificamente para calcular um MAC ) ou um par de chaves pública / privada usando RSA ou ECDSA.

A estrutura do JWT consiste em:

  • Cabeçalho – formado por duas aparte: o tipo de token, que é JWT, e o algoritmo de assinatura usados, como HMAC SHA256 ou RSA.
  • Carga útil – As declarações são declarações sobre uma entidade (normalmente, o usuário) e dados adicionais. Existem três tipos de reivindicações: registradas, públicas e privadas.
    • Declarações registradas: trata-se de um conjunto de declarações predefinidas que não são obrigatórias, mas recomendadas, para fornecer um conjunto de declarações úteis e interoperáveis. Alguns deles são: iss (emissor), exp (prazo de validade), sub (assunto), aud (público) e outros.
    • Reivindicações públicas: podem ser definidas à vontade por aqueles que usam JWT. Mas, para evitar colisões, eles devem ser definidos no IANA JSON Web Token Registry ou como um URI que contém um namespace resistente a colisões.
    • Reivindicações privadas: são as reivindicações personalizadas criadas para compartilhar informações entre as partes que concordam em usá-las e não são reivindicações registradas ou públicas.
  • Assinatura – Para criar a parte da assinatura, você deve pegar o cabeçalho codificado, a carga útil codificada, um segredo, o algoritmo especificado no cabeçalho e assiná-lo.

Comparando o JWT

Em comparação do JWT com outras formas de autenticação, como o SWT (Simple Web Tokens) e o SAML (Security Assertion Markup Language Tokens), percebemos que o JSON ganha em tamanho e menor verbosidade tornando o JSON uma boa opção para transmissão de dados em HTML e HTTP.

  • SWT – somente pode ser assinado simetricamente por um segredo compartilhado usando o algoritmo HMAC.
  • SAML e o JWT – além do uso já mencionado também pode usar os pares de chaves pública / privada na forma de um certificado X.509 para assinatura.

Em comparativo do SAML que utiliza o XML nas suas estruturas e o JWT que utiliza JSON temos o JWT com a maior simplicidade e menor verbosidade dificultando a criação de brecha de segurança pela complexidade de estrutura, quanto aos analisadores JSON são comuns na maioria das linguagens de programação, mapeando diretamente para objetos já por outro lado, XML não possui um mapeamento natural de documento para objeto tornando mais simples e fácil trabalhar com JWT do que com asserções SAML.

Figura 1 – JWT utilizando o corpo JSON

VS

Referências

https://www.tecmundo.com.br/seguranca/1971-o-que-e-autenticacao-.htm

https://openbase.io/packages/top-nodejs-authentication-libraries

https://www.devmedia.com.br/como-o-jwt-funciona/40265

Autor: Alexandre de Oliveira

Arquitetura Serverless: O que você precisa saber

logo serverless framework

Você já imaginou executar suas funções de backend sem possuir um servidor? A arquitetura serverless nos permite essa facilidade.

No entanto, como o nome da arquitetura sugere (serverless, do inglês, sem servidor), existe sim um servidor executando tais funções, ele somente não é gerenciado por você, mas pela plataforma cloud  no modelo FaaS (Function as a Service) que você irá utilizar, como por exemplo Amazon Web Services (AWS), Microsoft Azure, Google Cloud, entre outras. Com isso, evita-se a configuração de servidores complexos e/ou ambientes isolados como os containers.

Surgimento

A origem da hospedagem de recursos de computação em cloud não iniciaram a partir do serverless. Inicialmente, possuia-se três formas de aplicar serviços de computação em nuvem, sendo eles:

  • IasS (Infrastructure as a Service): Permite ao usuário selecionar um conjunto de recursos específicos para sua aplicação, e a partir disso, configurá-la de acordo com sua necessidade.
  • PaaS (Platform as a Service): Conta com os recursos da IaaS – servidores, armazenamento e rede – e acrescenta o acesso a ferramentas de gerenciamento da aplicação, como por exemplo, IDE’s, SGBD’s e middlewares.
  • SaaS (Software as a Service): Proporciona o acesso a um software completo dentro de um datacenter do provedor escolhido, incluindo a camada de apresentação da aplicação.

Todas essas estruturas possuem um valor mensal de acordo com o provedor de serviços, que nos garantem alta disponibilidade e segurança dos dados, tanto para os detentores da aplicação quanto para os usuários finais, além da escalabilidade.

Mas afinal, o que é serverless?

O serverless é uma arquitetura que utiliza como padrão o modelo FaaS, que consiste em executar funções como serviço, ou seja, as funções de nossos códigos são armazenadas na nuvem e executadas individualmente, sem necessidade de um datacenter privado executando sua camada de processamento de dados. No entanto, o serverless  não possuí somente o modelo de funções como serviço, existe também o modelo BaaS (Backend as a Service) como por exemplo o Google Firebase, que possibilita a criação da infraestrutura de dados e execução de códigos, comumente utilizados para autenticação de usuários de forma simples e segura. Além deste, temos o modelo CasS (Containers as a Service) que tem como objetivo a utilização de um container de baixo custo na nuvem, sem necessidade de um datacenter.

Como funciona e quanto custa?

Cada provedor possui seu próprio recurso de execução de códigos, como por exemplo, o AWS Lambda, o Google Cloud Functions ou o Azure Automation. Suas funções são hospedadas gratuitamente nos provedores de cloud, e o valor é variado de acordo com o número de execuções e/ou tempo de execução da função, o exemplo abaixo é disponibilizado pela AWS deixando mais evidente o calculo de custo.

calculo de custo aws lambda
Exemplo de cálculo para cobranças mensais (AWS)

Onde e como utilizar?

Tendo em vista a utilização do modelo FaaS, podemos utilizar o serverless como um facilitador para nossas aplicações, sendo recomendado para execução de funções assíncronas, ou seja, funções que podem ser executadas sem impedir a navegabilidade do usuário ou que consumam muito processamento de dados no servidor comum. Por exemplo, o envio de um e-mail, o upload de uma imagem ou a geração de um relatório. O serverless possui uma ótima sinergia com a estrutura de microsserviços, onde há facilidade ao mover uma funcionalidade específica para a arquitetura serverless. Um ponto a ser considerado, antes de começar a utilizar deste modelo, é se a função possui um objetivo bem definido e não causa um grande impacto na aplicação, pois estas funções são stateless, ou seja, não armazena seu estado. A cada execução a função será reconstruída do zero, sem considerar os dados já processados anteriormente.

Serverless framework

O framework Serverless é um framework web gratuito e de código aberto, escrito em Node.js o que facilita o desenvolvimento de funções como serviço. Serverless é o primeiro primeiro framework que foi originalmente desenvolvido para construir aplicações exclusivamente na AWS Lambda. Atualmente, aplicações desenvolvidas com o framework Serverless podem ser entregues e publicadas em outros provedores de funções como serviços, conforme consta no site do framework.

Vantagens

  • Não existe a necessidade de configuração de um servidor dedicado;
  • Os valores disponibilizados pelos provedores atuais são extremamente baratos;
  • Suas funções são auto escaláveis não importando o consumo;
  • A realização do deploy é muito simples, e existem ferramentas que automatizam isso.

Desvantagens

  • Ao possuir grande intervalo de tempo entre execuções podem ocasionar perda de performance;
  • O custo pode ficar muito alto caso suas funções demorem cerca de 300 segundos, sendo este o limite de tempo de execução.
  • Execução de testes e debug é extremamente difícil;
  • A utilização em conjunto com aplicações que possuem execuções constantes pode aumentar consideravelmente o custo.

Concluindo

O cenário atual de desenvolvimento está cada vez mais suscetível à mudança das arquiteturas tradicionais para serviços em cloud, sendo necessário uma série de adaptações de códigos. Com isso, fica visível a utilidade da arquitetura serverless, levando em conta a sua facilidade de implantação utilizando o Serverless framework.

Autor: Mateus Catel.

Links Relacionados

https://blog.rocketseat.com.br/serverless-nodejs-lambda/

https://www.riuni.unisul.br/bitstream/handle/12345/8450/TCC-FINAL-COM-ASSINATURAS.pdf

https://read.acloud.guru/six-months-of-serverless-lessons-learned-f6da86a73526

https://www.youtube.com/watch?v=FaybjGx3uQI

https://www.serverless.com/

https://aws.amazon.com/pt/lambda/

Armazenamento de Imagens para Aplicativos Móveis

O Armazenamento de diversas imagens em aplicativos é uma dúvida constante, na questão de aplicativos móveis esta preocupação aumenta, pois é inevitável que a utilização de uma outra ferramenta não inclusa no próprio dispositivo deverá ser utilizada. Os métodos com que o desenvolvedor se depara para a utilização do armazenamento são dois a utilização de um campo do tipo BLOB(Binary Large Object – grande objeto binário) ou de um campo no banco de dados que referencia o caminho da imagem e armazenando ela em um servidor, sendo está podendo ser feita de diversas formas, as mais mencionadas são a utilização de um servidor para o armazenamento de imagens ou a utilização de um serviço que já faça este controle um exemplo seria o Firebase Cloud Storage.

Armazenamento com BLOB

            A utilização do armazenamento no banco de dados com o tipo de arquivo BLOB não é muito recomendada, mas é uma opção viável para utilização em softwares que não necessitam de uma grande quantidade de armazenamento de imagens ou outros tipos de arquivos. Mas este tipo de armazenamento ainda possui alguns vantagens e desvantagens, que seriam:

Vantagens:

  • Organização: Todosos dados ficam centrados em apenas um local, fazendo com que a realização de backups seja feita de forma mais fácil, necessitando apenas armazenar os dados contidos no banco de dados.

Desvantagens:

  • Banco de Dados muito grande: Com o armazenamento feito diretamente no banco de dados à consequência de deixá-lo muito grande é inevitável se existe a necessidade de guardar diversos arquivos.
  • Lentidão: Sempre que for necessário consultar a imagem no banco de dados esta consulta deverá consultar uma grande quantidade de dados.

Armazenamento da referência do arquivo

            A utilização de referencias da imagem salva é uma ótima solução para quem possui uma necessidade de armazenamento maior. Com ela deve-se armazenar o caminho da imagem no banco de dados e ao mesmo tempo salva-la em algum local que possa ser acessível posteriormente, essa utilização pode ser feita de diversas formas e maneiras, dando uma liberdade maior para o desenvolvedor escolher qual seria a melhor solução para seu caso.

            Algumas vantagens e desvantagens são listadas para a sua utilização, mas cada uma dessas deve levar em consideração onde será armazenado o arquivo, vantagens e desvantagens do armazenamento em um servidor:

Vantagens:

  • Velocidade: A velocidade é uma das grandes vantagens deste tipo de armazenamento, isso se da em consequência que a sua consulta será redirecionada diretamente ao caminho no qual a imagem está armazenada.

Desvantagens:

  • Inconsistência: Qualquer modificação de local ou de exclusão feita diretamente no local no qual está armazenado as imagens é um fator de risco para a consistência com o banco de dados, pois o caminho pode estar apontando para um local no qual  a imagem pode não estar mais localizada.

Utilização de um serviço específico para armazenamento

            Hoje existem diversos serviços que disponibilizam o armazenamento de imagens e arquivos para aplicações. Alguns deles são totalmente de graça e outros sendo pagos conforme a utilização. Este tipo de armazenamento também possui suas vantagens e desvantagens, sendo elas:

Vantagens:

  • Organização: Os arquivos ficam armazenados em outro local que não interfere diretamente com o servidor e nem o banco de dados.
  • Segurança: Os arquivos ficam seguros por serem administrados apenas no local de armazenamento que seria a ferramenta exterior.
  • Velocidade: A velocidade aumenta por ser apenas armazenada uma URL no qual está armazenada a imagem, fazendo assim com que a consulta seja feita de uma forma mais rápida e direcionada.

Desvantagens

  • Dependência: Conforme a quantidade de dados armazenados vai crescendo a dependência com o serviço utilizado fica maior, tendo assim uma maior dificuldade de desvinculação com a solução utilizada.

Firebase Cloud Storage

            O Firebase é uma plataforma que foi adquirida pela Google e desde 2014 está a crescer com o tempo, possuindo diversos serviços para a utilização em aplicações móveis e para web.

O Cloud Storage do Firebase é um destes serviços dedicados ao armazenamento de arquivos, tendo funções de upload e download de arquivos, além destas funções primitivas ele ainda conta com um controle de perda de conexão e de acesso a arquivos. Em relação a perda de conexão na hora de upload ou download a operação pode ser retornada de onde parou, poupando tempo e largura de banda. Já o controle de acesso pode ser feito diretamente no Firebase, podendo ser definido quais usuários podem acessar quais arquivos.

Armazenamento de Imagens no Firebase

            O armazenamento das imagens e seu controle pode ser feito de duas formas, sendo uma delas diretamente no console de controle do Firebase, e a outra forma por meio da aplicação que utiliza os serviços do Firebase.

            O Cloud Storage permite que o usuário crie pastas para um melhor controle das informações, além disso ao ser feito o upload da imagem para o Storage ele retorna uma URL de acesso ao arquivo, se o arquivo for do tipo imagem ela pode ser acessada diretamente pelo navegador, podendo ser feita o download por este meio. Além disso o Storage possui uma área para o controle de tokens das imagens, podendo ser adicionados novos ou excluídos conforme a necessidade, fazendo com que o caminho da imagem seja alterado.

            Além das informações armazenadas o Firebase possui gráficos que mostram a usabilidade do Storage pela aplicação, podendo ser consultado a quantidade de Bytes e objetos armazenados, mostrando essas informações por datas de quando foram utilizados.

            Algumas considerações devem ser feitas ao começar a utilizar o Firebase como uma solução para armazenar as imagens de uma aplicação, uma delas é que o Storage tem um limitador de 5GB de armazenamentos gratuitos, depois que isso é ultrapassado o valor fica de US$ 0,026/GB, mas a cobrança só é feita por utilização, então enquanto a aplicação utilize até os limites nada será cobrado a mais independente do tempo de utilização.

            Depois de analisado e pesquisado sobre o assunto a forma que traz mais vantagens e que possui uma melhor integração com uma aplicação seria a utilização de serviços para armazenar imagens como o Firebase Cloud Storage.

Autor: Matheus Bernardi

Clusterização de dados K-Means na biblioteca scikit-learn

A clusterização de dados é uma técnica que visa fazer agrupamentos automáticos de dados, levando em consideração o grau de semelhança, tem por objetivo agrupar através de aprendizado não supervisionado casos de uma base em k grupos, também denominados clusters, a classificação de dados surgiu com a necessidade de separar os dados em determinados grupos com semelhanças de atributos.

Existem diferentes formas de realizar a clusterização de dados, o scikit-learn por exemplo, é uma biblioteca para a linguagem python que disponibiliza de vários algoritmos para clusterização de dados, um dos mais conhecidos é o algoritmo K-Means.

Antes de iniciar a exemplificação do funcionamento do algoritmo, deve-se compreender alguns termos.

  • Cluster: Cluster ou grupos, são grupos de entidades com as mesmas características.
  • Centroide: Podemos definir centroide como centro de cada cluster/grupo.
  • Ponto: Ponto pode ser definido como um conjunto de dados.

Algoritmo K-Means

Este algoritmo é capaz de realizar o treinamento de um modelo para fazer o agrupamento de objetos, ele trabalha com processos de similaridade, ou seja, a principal ideia é encontrar itens semelhantes um com os outros, e mais distintos possíveis dentre os membros de outros clusters/grupos de acordo com seus atributos.

Funcionamento do algoritmo K-Means

O funcionamento do algoritmo é composto por cálculos de distância e média dos pontos até os centroides para poder definir uma posição clara entre os grupos. Vamos representar o funcionamento do algoritmo em 3 passos:

1° Passo: Inicializar os centroides de forma aleatória:

O algoritmo inicia os centroides de forma aleatória, começando de uma ponta até o centro do cluster, de acordo com que o algoritmo é executado.

Figura 1 – Inicialização dos centroides

2° Passo: Para cada ponto na base de dados, calcular a distância para cada centroide e associar ao que estiver mais perto:

Neste passo o algoritmo visa calcular para cada ponto na base de dados a distância entre todos os centroides, ao realizar o cálculo de distância, o algoritmo atribui o ponto ao centroide que possuir uma menor distância.O cálculo de distância é executado para todos os pontos mais de uma vez, em conjunto com os próximos passos, e cada ponto pode pertencer a um cluster diferente conforme o refinamento dos processos do algoritmo.

Figura 2 – Cálculo da distancia entre os centroides

3° Passo: Cálculo da média dos pontos relacionados a cada centroide, definição de um novo centroide (repetição das etapas 2 e 3):

Nesta etapa é realizado o cálculo da média dos pontos ligados aos seus respectivos centroides, o cálculo da média é feito para definir uma nova posição do centroide, em conjunto com isso é realizado um processo repetitivo entre as etapas 2 e 3 para poder fazer a nova definição dos centroides, com objetivo de direcioná-los mais ao centro do cluster, e será realocado os pontos que estiverem mais próximos de outros clusters. O algoritmo finaliza o processo quando não possuir mais elementos para fazer a atualização.

Figura 3 Cálculo da média dos pontos em cada centroide

Exemplo de utilização do K-Means

Visando um cenário em que os dados são de um grupo de pessoas com os respectivos salários e idades, temos uma base populada de dados em que os grupos/clusters estão misturados, para realizar a clusterização destes dados pode-se aplicar três os passos do algoritmo.

Primeiramente deve-se inicializar os centroides.

Figura 4 Inicialização dos centroides

Após a inicialização temos o processo de realizar o cálculo de distância e atribuir os pontos aos respectivos centroides.

Figura 5 – Cálculo de distancia e atribuição de pontos aos centroides

Por fim são calculadas as médias dos pontos relacionados a cada centroide, redefinido a posição dos centroides e executados os passos 2 e 3 até finalizar o algoritmo.

Figura 6 – Cálculo de médias e redefinição dos centroides

Assim tem-se as pessoas com mais idade e um melhor salário representadas pela cor azul, pessoas com mais idade e um baixo salário representadas na cor vermelha, e pessoas novas com um baixo salário representadas na cor verde.

K-Means na prática

Primeiramente é necessário importar a biblioteca.

from sklearn.cluster import KMeans import numpy as np

A implementação mais básica do k-means que contém um vetor [X] que contém os pontos amostrados. O objetivo é classificar os pontos amostrados em clusters indicados pela variável K.

X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]]) kmeans = KMeans(n_clusters=2, random_state=0).fit(X) kmeans.labels_
array([0, 0, 0, 1, 1, 1])
kmeans.predict([[0, 0], [4, 4]])
array([0, 1])
kmeans.cluster_centers_
array([[1., 2.], [4., 2.]])

CONCLUSÃO

Compreender o processo de um algoritmo de clusterização de dados que atua através de aprendizado não supervisionado, nos permite atingir resultados mais precisos.

O funcionamento do algoritmo foi apresentado por meio dos passos, para melhor entender a estrutura em que o algoritmo K-Means trabalha, e facilitar a visualização da modificação na estrutura dos dados.

Para implementar o algoritmo em um sistema, pode ser necessário a integração com outras bibliotecas, que possibilitam a criação e visualização de novas funcionalidades.

REFERÊNCIAS

https://lamfo-unb.github.io/2017/10/05/Introducao_basica_a_clusterizacao/

https://www.alura.com.br/artigos/agrupando-dados-com-python

https://docs.aws.amazon.com/pt_br/sagemaker/latest/dg/sagemaker-dg.pdf#algo-kmeans-tech-notes

https://www.devmedia.com.br/data-mining-na-pratica-algoritmo-k-means/4584

Autor: Guilherme Zimmer De Gasperi

Google Speech-to-text API

Google Speech-To-Text é um entre os diversos serviços oferecidos pela Google Cloud e realiza a conversão de áudios para texto utilizando modelos de redes neurais e machine learning. A medida que o Speech-to-text é utilizado, evolui com velocidade e hoje, pouco tempo depois de passar do modelo BETA em abril de 2017, já possui suporte para o reconhecimento de mais de 120 idiomas.

PRINCIPAIS RECURSOS

Dentre os principais recursos destacam-se a capacidade de transcrever áudio para texto em tempo real, identificação automática do idioma falado, seleção de modelos aprimorados para transcrição de cada caso de uso como comandos realizados via smartphone ou smart TV, vídeos, ligações telefônicas, dentre outros.

O recurso de transcrição de vídeo por exemplo, é ideal para indexar ou legendar vídeos de diversos interlocutores. Este modelo utiliza tecnologias de Machine Learning e ainda é capaz de identificar os locutores da conversa. Também capaz de reconhecer nomes próprios como nomes e lugares e aplica a formatação correta para o idioma selecionado, como em datas e números de telefone.

Outros recursos interessantes como robustez a ruído, o que permite lidar com áudios barulhentos e poluídos pelo som de ambientes, pontuação automática que permite a API pontuar as transcrições com vírgulas, pontos de interrogação e pontos finais, além do filtro de conteúdo impróprio.

CONSUMO DA API

A API pode ser consumida através do protocolo REST, realizando uma chamada no formato Json ou utilizando o protocolo gRPC, este por sua vez menos conhecido, porém se trata de protocolo desenvolvido pela Google principalmente para comunicação entre os microsserviços em seus datacenters.

A utilização pode ocorrer de forma síncrona para áudios de até 1 minuto, utilizando o protocolo REST ou gRPC. De forma assíncrona para áudios de até 480 minutos também nos protocolos REST e gRPC. Já para o para a transcrição de streaming deve ser utilizado o protocolo gRPC.

Este é um exemplo de reconhecimento de fala em streaming em um arquivo de áudio local utilizando a linguagem Python.

def transcribe_streaming(stream_file):
    """Streams transcription of the given audio file."""
    import io
    from google.cloud import speech
    from google.cloud.speech import enums
    from google.cloud.speech import types
    client = speech.SpeechClient()

    with io.open(stream_file, 'rb') as audio_file:
        content = audio_file.read()

    # In practice, stream should be a generator yielding chunks of audio data.
    stream = [content]
    requests = (types.StreamingRecognizeRequest(audio_content=chunk)
                for chunk in stream)

    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code='en-US')
    streaming_config = types.StreamingRecognitionConfig(config=config)

    # streaming_recognize returns a generator.
    responses = client.streaming_recognize(streaming_config, requests)

    for response in responses:
        # Once the transcription has settled, the first result will contain the
        # is_final result. The other results will be for subsequent portions of
        # the audio.
        for result in response.results:
            print('Finished: {}'.format(result.is_final))
            print('Stability: {}'.format(result.stability))
            alternatives = result.alternatives
            # The alternatives are ordered from most likely to least.
            for alternative in alternatives:
                print('Confidence: {}'.format(alternative.confidence))
                print(u'Transcript: {}'.format(alternative.transcript))

Quanto ao processamento, normalmente o Speech-to-Text leva metade do tempo real do áudio, ou seja, para áudios de 30 segundos, é levado em média 15 segundos para realizar a transcrição e retorno do texto.

A sua utilização é muito simples e em menos de 5 minutos é possível elaborar o tutorial básico para realizar a transcrição de um áudio em texto, conforme o tutorial disponibilizado pela Google:

Esta é uma API com recursos bastante poderosos e que já está presente em dispositivos que utilizamos em nosso dia a dia por mais que, as vezes isso passe despercebido, nos celulares que possuem sistema operacional Android por exemplo, este recurso é utilizado para realizar pesquisas por áudio.

Referências
https://cloud.google.com/speech-to-text?hl=pt-br

Autor: Jônas Guerra

Criação de chatbot com Watson Assistent

Chatbot

Chatbot, ou assistente pessoal, é um programa de inteligência artificial, que busca simular uma conversa entre dois humanos, e surgiu pela necessidade de as pessoas quererem interagir com os computadores utilizando a linguagem natural, sendo através da fala ou da escrita.

Para facilitar este processo, existem plataformas específicas para a criação de chatbots, que facilitam e automatizam este processo, muitas vezes sem tornar necessário o conhecimento de programação e técnicas de inteligência artificial, um exemplo deste formato de plataforma é o Watson Assistent da IBM.

O Watson Assistent utiliza tecnologias como a PLN para extrair informações de textos, como a intenção (intent) e entidades (entity), ele disponibiliza um dashboard web para realizar a configuração do assistente, e também possui uma API que permite o desenvolvimento de aplicações personalizadas para a interação com o usuário.

Conceitos

O foco deste artigo será apresentar os conceitos básicos para criar um chatbot, e demonstrar os passos para a criação de um fluxo de conversa pelo Watson Assistent, sendo assim este trabalho não irá se ater aos quesitos mais técnicos, envolvendo técnicas de inteligência artificial, que realizam o processamento da linguagem natural e a classificação.

Antes de começar a configurar o chat, é importante compreender alguns conceitos que serão necessários para criar o fluxo de conversa.

  • Intenções

Uma intenção é um objetivo expresso nas informações de um cliente, por exemplo, se um chatbot ajuda os usuários a lidar com despesas, as intenções seriam coisas como “visualizar x (valor devido)”, “pagar y (fatura)” e “cancelar z (conta)”. Ao reconhecer a intenção expressa na entrada de um cliente, o serviço de Assistência escolhe o fluxo de diálogo correto para responder a ele.

  • Entidades

Uma entidade representa uma classe de objeto ou um tipo de dados que é relevante para a finalidade de um usuário. Ao reconhecer as entidades mencionadas na entrada do usuário, o serviço de Assistência pode escolher as ações específicas a serem executadas para cumprir uma intenção.

As entidades são também a maneira do Watson lidar com partes significativas de uma entrada que deve ser usada para alterar a maneira como responde à intenção. Por exemplo, caso o chatbot tenha questionado ao usuário em qual cidade ele mora, seria aguardado como resposta uma entidade do tipo cidade, sendo assim a reposta poderia parecer com algo do tipo “Eu moro em São Paulo”, neste caso “São Paulo” seria a entidade reconhecida.

  • Diálogo

O diálogo é onde será configurado todo o fluxo da conversa, e permear a maneira que o chatbot irá interagir com o usuário. A caixa de diálogo existente no dashboard do Watson é configurada como uma árvore lógica com muitas condições “se houver”. Cada intenção inicia um nó à esquerda e a lógica flui de cima para baixo através de suas intenções. Se uma determinada intenção é acionada por um enunciado, seu nó é aberto e a lógica continua para as entidades.

Criando o chatbot

A seguir será apresentado os passos para a implementação do chatbot, para poder replicar esta implementação, será necessário possuir uma conta na IBM Clound,  e criar uma nova instância do Watson Assistent.

Para a configuração do chatbot será utilizado como contexto uma loja de roupas, que possui uma filial em Caxias do Sul e outra em Porto Alegre, com horários de funcionamento diferentes, e o robô irá responder o horário de funcionamento de cada uma das lojas.

Configurando as intenções

A primeira parte será criar uma Intent, neste ponto será necessário informar um nome, que posteriormente servira como uma forma de identificar a intenção, e também uma descrição, para facilitar a compreensão de seu funcionamento. Para o exemplo atual, a intent se chamara “#horarios”.

A screenshot of a social media post

Description automatically generated
Figura 1 – Configuração de intent

Agora devem ser inseridos os exemplos de frases ou palavras que podem ser inseridos pelo usuário, e que devem representar esta intent. Para o exemplo de “#horarios” pode ser “Qual o horário de funcionamento?” e também “Horário de funcionamento”, o recomendado pela IBM é de no mínimo 5 exemplos, pois com mais exemplos, é maior a probabilidade do algoritmo identificar a intenção, esses exemplos devem ser preferencialmente únicos entre as intenções, para permitir uma classificação mais especifica e precisa.

Vale ressaltar que o algoritmo utilizado não irá classificar somente frases iguais aos exemplos, e sim aquelas que possuem uma semântica parecida, tornando necessário a utilização de frases diferentes, variando as palavras e maneira de escrever.

Figura 2 – Exemplos de intent

Configurando as entidades

Para responder à questão anterior, será necessário que o robô identifique a cidade da loja em questão, para isto é necessário uma entity de cidades, permitindo identificar a qual loja o usuário está se referindo.

O primeiro passo será informar o nome da entity, que assim como a intent, servirá para identificar a entidade posteriormente, para o exemplo atual a entity se chamara “@cidade”. Também será necessário a informação dos valores para esta entidade, que neste caso será “Caxias do Sul” e “Porto Alegre”.

Figura 3 – Configuração de entity

É possível a inserção de sinônimos e padrões para a identificação da entity, para a opção de padrões ou petterns, são utilizados regex, que são comumente utilizados para obter valores numéricos ou e-mails. No exemplo atual será utilizado somente os sinônimos, e isto se torna bastante útil para cidades, pois “Caxias do Sul” por exemplo, é normalmente referenciada somente como “Caxias”, já “Porto Alegre” pode ser chamada de “POA”, e sem estes sinônimos se torna inviável para o robô identificar a entidade.

A screenshot of a cell phone

Description automatically generated
Figura 4 – Configuração de sinônimos de entity

Configurando o diálogo

Com as intenções e entidades definidas, já é possível criar o diálogo. Para esta etapa existe uma grande variedade de opções, e elas variam de acordo com a aplicação, então para não se aprofundar em cada uma destas opções, será focada apenas nas que serão utilizadas para a proposta atual.

Por padrão, já existem dois nodos, ou nós, um para as mensagens iniciais, como “Olá” ou “Boa Tarde”, e o outro para quando o robô não compreende uma das intenções do usuário, eles podem ser utilizados como base para os futuros nodos.

Para o diálogo dos horários, primeiro será necessário criar um nodo, isso pode ser feito clicando em “Add node” conforme a figura abaixo.

Figura 5 – Criação de novos nodos de diálogo

 O próximo passo é configurar o nodo, para isto basta clicar sobre ele. O primeiro campo é seu nome, que pode ser de acordo com o diálogo que ele representa, depois deve ser configurado a condição para que caia neste diálogo, para este exemplo é a intent “#horarios”.

Figura 6 – Configuração do nodo de diálogo

Para a próxima configuração deve ser acessado a opção de customização no nodo, acessível pelo botão “Customize”, conforme aparece na imagem anterior. A opção “Slots” deverá ser ativada, isto fara com que o usuário fique preso no nodo em questão, enquanto não fornecer a informação necessária, no caso, a cidade da loja.

Figura 7 – Configuração de Slot de conversa

Esta opção fara com que libere um novo campo de configuração para o nodo, que é onde deverá ser informado qual a condição de saída do nodo.

Figura 8 – Campos para checagem de slot de conversa

Para a configuração desta checagem deverá ser acessado a opção de customização do slot, acessível pelo botão com símbolo de engrenagem, conforme aparece na figura anterior. A primeira opção a ser configurada, é o valor que deverá ser checado, no caso, é a entidade de cidades, a opção “Save it as”, é o nome da variável de contexto em que o valor detectado deverá ser salvo.

Abaixo das opções anteriores deverá ser configurado uma mensagem de texto para quando a mensagem não atende a condição, que neste caso é o questionamento sobre a cidade da loja, aqui podem ser inseridas mais que uma mensagem, e elas poderão ser enviadas tanto de maneira sequencial, quanto randômica.

Figura 9 – Configuração inicial de slot de conversa

Por último deverá ser configurado a mensagem final de acordo com a cidade escolhida pelo usuário, esta configuração fica logo abaixo das configurações anteriores. Deverá ser inserido uma condição para cada cidade, conforme os campos a esquerda, e a direita deve ser informado o texto de resposta de acordo com a condição.

Figura 10 – Mensagens finais de horários de funcionamento

Testando o chatbot

Com a execução dos passos anteriores já é possível realizar o diálogo proposto, para testar o que foi implementado, é possível utilizar o chat integrado do Watson Assistent, acessível no botão “Try it”.

Figura 11 – Chat para teste da configuração

Será apresentado um chat com o input de mensagem, onde pode ser enviado mensagens, simulando a ação do cliente. A resposta será de acordo com o que foi configurado até então, além de trazer as informações detalhadas do que foi identificado. Nas figuras a seguir é possível visualizar o resultado da conversa com o chatbot recém criado.

Figura 12 – Mensagem inicial para o chatbot
Figura 13 – Resposta final do chatbot

Conclusão

Os passos para a criação de chatbots apresentados aqui são específicos para a plataforma Watson Assistent, porém conceitos como Intent e Entity, são aplicáveis para outras plataformas do mercado. Os exemplos citados são de junho de 2020, e é possível que alguns aspectos e nomenclaturas alterem com o tempo, pois a plataforma sofre constantes alterações para sua melhoria.

O fluxo de conversa utilizado como exemplo é relativamente simples, e possui um objetivo acadêmico, buscando apresentar uma visão geral da plataforma. Para aplicações reais é comum que se utilize um número maior de intent, entity, e diálogos, assim como configurações mais complexas.

Para aplicações reais pode se tornar necessário também, a integração do chatbot com outros sistemas, permitindo a criação de novas interfaces, desenvolvimento de lógicas mais complexas e consumir dados do próprio sistema.

REFERÊNCIAS

https://cloud.ibm.com/docs/assistant?topic=assistant-getting-started

https://medium.com/ibmdeveloperbr/watson-assistant-como-criar-o-seu-chatbot-usando-skills-e-assistants-755b4677984b

https://ibm.com/cloud/watson-assistant/

https://www.ibm.com/watson/how-to-build-a-chatbot

https://www.devmedia.com.br/chatbot-ibm-watson/40166

https://medium.com/ibm-garage/designing-a-chatbot-with-ibm-watson-assistant-7e11b94c2b3d

https://repositorio-aberto.up.pt/bitstream/10216/119703/2/332692.pdf

Autor: João Pedro Kaspary

Utilização de NodeMCU em projetos IoT

Desde o princípio a tecnologia vem passando por crescente transformação. O que antes eram computadores gigantes que ocupavam salas inteiras apenas para fazer simples cálculos, se transformou em dispositivos indispensáveis para o dia-a-dia. São eles: celulares, notebooks, o computador de bordo do carro, a TV smart, o aspirador de pó inteligente, entre muitos outros. Esta grande massa de dispositivos geralmente está conectada à internet. Mas você já parou para pensar como isso funciona? Quais dispositivos podem ser conectados? Eu posso montar um projeto IoT? Aí está mais uma palavra que ouvimos muito hoje em dia. IoT significa Internet of Things (Internet das Coisas), que podemos entender como coisas conectadas na internet.

Já é possível termos um sistema de aquecimento que altera a temperatura de acordo com o clima, ou um medidor que avisa quando o gás está acabando. Para você que gosta de tecnologia, assim como eu, e quer conectar seu projeto na internet, este post é para você. Vamos falar sobre uma placa chamada NodeMCU, que pode ser conectada no Wi-Fi e é de fácil usabilidade.

O que é?

Antes de falar sobre a NodeMCU precisamos entender o que é módulo ESP-8266. Este módulo é fabricado pela Espressif Systems e contém vários elementos poderosos como CPU, RAM e Wi-Fi. A parte ruim é que para utilizá-lo, você precisa programá-lo enviando comandos com instruções de máquina de baixo nível. É aí que entra a NodeMCU.

A NodeMCU (Node MicroController Unit) é uma placa, criada para facilitar o desenvolvimento com o módulo ESP-8266. Ela já possui vários componentes que facilitarão sua vida: reguladores de tensão, leds, botão de reset, interface Serial-USB. Além disso, é possível fazer upload de sketchs do Arduino.

Como a placa tem acesso à internet, é possível fazer OTA (Over the Air) Upload, o que significa que você pode utilizar a rede Wi-Fi para atualizar o firmware da NodeMCU.

Abaixo, as principais características:

  • Processador ESP8266-12E
  • Arquitetura RISC de 32 bits
  • Processador pode operar em 80MHz / 160MHz
  • 4Mb de memória flash
  • 64Kb para instruções
  • 96Kb para dados
  • Wi-Fi nativo padrão 802.11b/g/n
  • Opera em modo AP, Station ou AP + Station
  • Pode ser alimentada com 5VDC através do conector micro USB
  • Possui 11 pinos digitais
  • Possui 1 pino analógico com resolução de 10 bits
  • Pinos digitais, exceto o D0, possuem interrupção, PWM, I2C e one wire
  • Pinos operam em nível lógico de 3.3V
  • Pinos não tolerantes a 5V
  • Possui conversor USB Serial integrado
  • Programável via USB ou WiFi (OTA)
  • Compatível com a IDE do Arduino
  • Compatível com módulos e sensores utilizados no Arduino

Como utilizar?

A utilização da NodeMCU é muito simples. Neste exemplo vamos utilizar o Platform.IO, que é uma plataforma para desenvolvimento de dispositivos embarcados. Antes de utilizar, você precisará instalar o Visual Studio Code, que é uma IDE muito utilizada hoje em dia por desenvolvedores. Aqui você encontra o passo a passo para instalar em seu computador.

Utilizando como Access Point

Um access point (ponto de acesso) é um dispositivo de rede usado no qual podemos nos conectar como se fosse um roteador wi-fi. Para utilizar a NodeMCU dessa maneira, precisaremos de duas bibliotecas: ESP8266WiFi.h e ESP8266WebServer.h. Por padrão, no Platform.io estas libs já estão instaladas.

Segue um código de exemplo que comanda dois leds de cores diferentes por meio de uma página web disponibilizada pelo access point da NodeMCU:

#include "Arduino.h"
 
#include "ESP8266WiFi.h"
#include "ESP8266WebServer.h"
 
#define PIN_LED_GREEN D4
bool ledGreenIsOn = false;
 
#define PIN_LED_RED D5
bool ledRedIsOn = false;
 
// declare server with port 80
ESP8266WebServer server(80);
 
// server main page html
const char serverPage[] PROGMEM = R"=====(
  <html>
    <button onclick="toggleLed('green')">
    toggle GREEN led
    </button>
    
    <button onclick="toggleLed('red')">
    toggle RED led
    </button>
 
    <script>
        function toggleLed(led) {
        console.log(`toggle led ${led}`);
 
        fetch("/toggleLed", {
            method: 'POST',
            headers: {
            "Content-Type": "application/x-www-form-urlencoded"
            },
            body: `led=${led}`
        });
        }
    </script>
  </html>        
)=====";
 
void setup()
{
    Serial.println(115200);

    Serial.println("init wi-fi ap mode...");
 
    // init pins
    pinMode(PIN_LED_GREEN, OUTPUT);
    pinMode(PIN_LED_RED, OUTPUT);
 
    // set wifi mode
    WiFi.mode(WIFI_AP);
 
    // define wifi configs
    IPAddress ip(10, 0, 0, 1);
    IPAddress gateway(10, 0, 0, 254);
    IPAddress subnet(255, 255, 255, 0);
 
    // set wifi configs
    WiFi.softAPConfig(ip, gateway, subnet);
 
    // init access point
    bool result = WiFi.softAP("My Network", "12345678");
 
    Serial.printf(result ? "Ready" : "Failed");
    Serial.println(WiFi.softAPIP());
 
    // define server routes
    server.on("/", HTTP_GET, []() {
        server.send(200, "text/html", serverPage);
    });
 
    server.on("/toggleLed", HTTP_POST, []() {
        String led = server.arg("led");
 
        Serial.println("toggle led \"" + led + "\"");
 
        uint8_t pinLed;
        bool state = false;
        if (led == "green")
        {
            pinLed = PIN_LED_GREEN;
            ledGreenIsOn = !ledGreenIsOn;
            state = ledGreenIsOn;
        }
        else if (led == "red")
        {
            pinLed = PIN_LED_RED;
            ledRedIsOn = !ledRedIsOn;
            state = ledRedIsOn;
        }
 
        digitalWrite(pinLed, state);
 
        server.send(200, "application/json", "{\"ok\":true}");
    });
 
    // init server
    server.begin();
}
 
void loop()
{
    server.handleClient();
}

Utilizando como Station

O modo station faz com que a NodeMCU se comporte como um outro dispositivo (celular, computador etc) conectado na rede. Assim é possível, por exemplo, fazer requisições HTTP para um servidor hospedado na web.

No exemplo vamos utilizar um LDR (Light Dependent Resistor). Segue o esquema se você quiser montar com sua NodeMCU:

O código de exemplo irá, a cada segundo, fazer uma requisição enviando a intensidade de luz no local:

#include "Arduino.h"
 
#include "ESP8266WiFi.h"
#include "ESP8266WiFiMulti.h"
#include "ESP8266HTTPClient.h"
 
#define PIN_LDR A0
 
ESP8266WiFiMulti wiFiMulti;
HTTPClient http;
 
void setup()
{
    Serial.println(115200);
 
    Serial.println("init wi-fi station mode...");
 
    // init pins
    pinMode(PIN_LDR, INPUT);
 
    // set wifi mode
    WiFi.mode(WIFI_STA);
 
    // connect to wi-fi network
    wiFiMulti.addAP("<network ssid>", "<network password>");
 
    // wait for connection
    int count = 0;
    while (wiFiMulti.run() != WL_CONNECTED)
    {
        Serial.print(".");
        delay(500);
 
        if (count >= 20)
        {
            Serial.println("wi-fi connection time out");
            return;
        }
 
        count++;
    }
 
    Serial.print("\nConnected as ");
    Serial.println(WiFi.localIP());
}
 
void loop()
{
    // run every 1000 miliseconds
    if (millis() % 1000 == 0)
    {
        int ldrValue = analogRead(PIN_LDR);
        float lightPercentage = 100 / 1024 * ldrValue;
 
        if (WiFi.isConnected())
        {
            String url = "<api end-point>";
 
            // init url
            http.begin(url);
 
            Serial.println("[HTTP] begin in " + url);
 
            // add headers
            http.addHeader("Content-Type", "application/json");
 
            // define json body
            String body = "";
            body += "{";
            body += "\"lightPercentage\": " + String(lightPercentage) + ",";
            body += "}";
 
            Serial.println("[HTTP] request body: " + body);
 
            // make http post
            int httpCode = http.POST(body);
 
            if (httpCode > 0)
            {
                Serial.println("[HTTP] POST " + String(httpCode));
 
                String response = http.getString();
                Serial.println("[HTTP] response: " + response);
            }
            else
            {
                Serial.println("[HTTP] POST failed, error: (" + String(httpCode) + ") " + http.errorToString(httpCode));
            }
 
            // end http
            http.end();
        }
        else
        {
            Serial.println("wi-fi not connected");
        }
    }
}

Considerações finais

A NodeMCU é uma excelente opção para ser utilizada em um projeto que necessita acesso à internet. A utilização é muito simples, o que proporciona um desenvolvimento bastante ágil. O preço médio fica um pouco acima o que um Arduino ou outra placa semelhante, mas o valor agregado do produto supera o seu preço.

Fontes

CURVELLO, André. Apresentando o módulo ESP8266. Embarcados. Disponível em: <https://www.embarcados.com.br/modulo-esp8266>. Acesso em 20 de junho de 2020.

GARRETT, Filipe. O que é access point? Veja para que serve o ponto de acesso de Wi-Fi. Embarcados. Disponível em: <https://www.techtudo.com.br/noticias/2018/06/o-que-e-access-point-veja-para-que-serve-o-ponto-de-acesso-de-wi-fi.ghtml>. Acesso em 20 de junho de 2020.

MURTA, Gustavo. NodeMCU – ESP12: Guia completo – Introdução (Parte 1). Blog Eletrogate. Disponível em: <https://blog.eletrogate.com/nodemcu-esp12-introducao-1>. Acesso em 20 de junho de 2020.

OLIVEIRA, Greici. NodeMCU – Uma plataforma com características singulares para o seu projeto ioT. Embarcados. Disponível em: <https://blogmasterwalkershop.com.br/embarcados/nodemcu/nodemcu-uma-plataforma-com-caracteristicas-singulares-para-o-seu-projeto-iot>. Acesso em 20 de junho de 2020.

YUAN, Michael. Conhecendo o NodeMCU e sua placa DEVKIT. IBM. Disponível em: <https://www.ibm.com/developerworks/br/library/iot-nodemcu-open-why-use>. Acesso em 20 de junho de 2020.

ESP8266. Espressif. Disponível em: <https://www.espressif.com/en/products/socs/esp8266/overview>. Acesso em 20 de junho de 2020.

Sensor de Luminosidade LDR 5mm. Filipe Flop. Disponível em: <https://www.filipeflop.com/produto/sensor-de-luminosidade-ldr-5mm>. Acesso em 20 de junho de 2020.

Como a tecnologia impacta nossas vidas?. Toikos Blog. Disponível em: <http://toikos.com.br/blog/post/tecnologia>. Acesso em 20 de junho de 2020.

Casas Inteligentes: como faço minha casa mais inteligente?. Toikos Blog. Disponível em: <http://toikos.com.br/blog/post/casas-inteligentes-como-fao-minha-casa-mais-inteligente>. Acesso em 20 de junho de 2020.


Autor: Igor Wilian Faoro

Frameworks ORM para bancos não relacionais?

Existem dois tipos de bancos de dados: relacional e não relacional. Os dois bancos podem ser utilizados de formas distintas com diferentes frameworks, podendo-se utilizar o tipo de banco de dados e seu respectivo framework variando entre situações.

O banco de dados relacional trabalhará de forma que tabelas possam se relacionar e formar uma rede de tabelas com dados utilizando frameworks ORM. O banco de dados não relacional em conjunto com o framework ODM deverá ser utilizado para casos com informações menos complexas que exigem todas as informações em um único documento possibilitando uma grande massa de dados.

OBJECT RELATIONAL MAPPING

Existem frameworks conhecidos como ORM (object relational mapping) que relacionam propriedades de uma classe com colunas do banco de dados. Esse tipo de framework só pode ser utilizado com banco de dados relacional. Ele estabelece uma forte relação entre aplicativo e banco de dados.

Normalmente o banco de dados relacional é utilizado para informações mais complexas permitindo consultas segmentadas evitando gargalos quando há grandes quantidades de acesso. O uso da ORM é opcional, mas existem vantagens como facilitação joing entre as tabelas e aumento a produtividade do desenvolvimento.

OBJECT DOCUMENT MAPPING

Os frameworks ODM (object document mapping) são utilizados para criar relações entre propriedades de uma classe com campos de um documento salvo em uma collection que também podem ser gerenciadas pelo framework.

Da mesma forma que a ORM, o uso desse framework é opcional, entretanto há diversas vantagens como proporcionar forte tipagem para campos de documento de forma que o desenvolver não possa salvar um valor do tipo texto para um campo numérico, além de simplificar interpretação de códigos afim de agilizar o desenvolvimento do projeto.

Uma das maiores vantagens do uso de framework é a facilidade para a utilização de indexes (índices) que normalmente exigem certas habilidades de gerenciamento do desenvolvedor. Segue um exemplo de aplicação dessa vantagem:  

const Cat = mongoose.model('Cat', { name: String });

mongoose.index('Cat', ({'$**': 'text'})

O índice pode ser explorado a fim de facilitar o desenvolvimento de buscas, por exemplo. Ele tem função de agilizar o processo de encontro de informações específicas e segmentadas.

 O índice auxilia o desenvolvedor em diversos pontos como tratamentos complexos da informação antes de ser buscada com intuito de reduzir o tempo e a lógica escrita por ele.

O código no exemplo acima demonstra através do asterisco (wildcard) como o índice será construído. Nesse caso, será incluído tudo que é do tipo texto dentro do índice a ser criado.

A busca feita no banco de dados não relacional pelo índice pode ser feita pelo recurso de pontuação ou pela ordem padrão, ou seja, de encontro dos resultados. O esquema padrão de encontro dos resultados acarretará o aparecimento desordenado dos resultados.

Os frameworks possibilitam a indicação de ordenação por pontuação, por exemplo: se o usuário buscar as letras inicias de o nome de um médico no site de um plano de saúde, a busca entenderá e mostrará os nomes de médicos com as letras inicias exatamente iguais e após mostrará os resultados seguintes com a mesma letra inicial.

O desenvolvedor poderá distribuir diferentes pesos para cada campo do documento, como “nome” será pontuação de relevância 5, o campo “especialidade” será pontuação de relevância 4 e assim por diante. Dessa forma, a chance o usuário encontra o que procura em menos tempo é maior.

const Cat = mongoose.model('Cat', { name: String, phone: String }, { weights: { name: 4, phone: 3} });

O uso dos frameworks pode ser explorado de diversos formas e utilizados em diversas linguagens de programação. Segue um exemplo do uso de um framework ODM para a linguagem de programação Javascript:

Primeiramente há a conexão com o banco de dados MongoDB:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});

Após há a criação de uma collection:

const Cat = mongoose.model('Cat', { name: String });

Então há a criação de um novo documento e o salvamento no banco de dados:

const kitty = new Cat({ name: 'Zildjian' });

kitty.save().then(() => console.log('meow'));

Dessa forma, nesse exemplo haverá a criação de um novo documento da collection cat com a propriedade name o valor Zildjian. Assim, teremos a criação e salvamento do novo documento.

CONCLUSÃO

Conclui-se que dentro das linguagens de programação os frameworks dos tipos ODM e ORM são bastante utilizados para facilitar e reduzir o tempo do desenvolvedor dentro dos projetos.

Essa redução e facilitação impactará no desempenho do projeto bem como ampliará as funções para o usuário. O destaque fica para os índices que podem auxiliar de forma significativa em possíveis buscas ou indexações apresentadas no desenvolvimento de um projeto.

Fontes:

https://mongoosejs.com/ – Exemplos de código do framework ODM Mongoose

http://www.toikos.com.br/ – Utilização da tecnologia integrado com IOT

Autor: Felipe Panassol Zaniol

Como funciona a autenticação com Facebook e com o Google

Com tantos sites e aplicações disponíveis no mundo digital hoje, muitas vezes, para utilizar os serviços e/ou acessar seus conteúdos, é necessário possuir um cadastro. Imagine a quantidade de senhas a serem gerenciadas para cada site e aplicação, se cada vez que queira acessar algo novo, ter que criar um novo cadastro? Ou criar e gerenciar novas senhas? Até porque esse numero elevado de senhas, desgasta o usuário em questão de criatividade, e muitos acabam utilizando senhas fracas, e ou também utilizando a mesma senha para mais de uma aplicação.

Hoje, muitas dessas aplicações, dispõe da opção de realizar o login por uma conta Google ou também uma conta de Facebook. Tanto o Google quanto o Facebook, utilizam de um protocolo de autorização chamado OAuth, para liberar acesso limitado aos dados do usuário e ao acesso a suas APIS.

Mas como o OAuth funciona?  

O QUE É O OAUTH?

Primeiramente, vamos entender o que o OAuth é realmente. Ele é um protocolo de autorização para APIS WEB, e tem por objetivo permitir que aplicações Client, acessem recursos protegidos, em nome de um usuário, e sem expor suas credenciais. Ele fornece um fluxo de autorização para aplicações web e desktop e para dispositivos móveis.

Em um exemplo simples, em um site que permita Login com o Google, o Web Service dessa aplicação, solicita que o usuário, dê permissão para ler seu perfil do Google, para que o Web Service, possa acessar e copiar informações desse perfil, afim de facilitar a vida do usuário, que por sua vez não precisará informar alguns dados de cadastro, já que os mesmo foram reaproveitados do seu perfil do Google.

COMO ELE FUNCIONA?

De uma forma geral, o OAuth fornece aos clientes, um acesso seguro aos recursos do servidor, em nome do proprietário do recurso. Para isso, ele especifica um processo de autorização, que solicita ao proprietário, acesso de terceiros a seus recursos, sem compartilhar suas credenciais. Há também uma questão a se levantar, sobre segurança, pois com a utilização das contas do Google ou Facebook, ou demais, as questões de segurança são de responsabilidades dos mesmos.

Quando o proprietário autoriza o acesso, o OAuth, retorna um Token de acesso, para que o terceiro que solicitou, obtenha somente as informações e recursos liberados.

O OAuth, define quatro principais papéis:

  • Proprietário do Recurso: É o usuário que autoriza que uma aplicação terceira, tenha acesso a sua conta. Esse acesso é limitado ao “escopo” da autorização concedida, como por exemplo, o acesso liberado as informações são somente para leitura, nesse caso, a aplicação terceira só consegue buscar os dados, mas nunca modifica-los.
  • Cliente: É a aplicação de terceiros, que deseja acessar a conta do usuário. Para isso, ela deve ser autorizada pelo usuário, e essa autorização será validada pela API.
  • Servidor de Recurso: Basicamente, o servidor de recurso, é aonde ficam hospedadas as contas de usuário protegidas.
  • Servidor de Autorização: Nesse servidor, é verificado a identidade do usuário que está concedendo o acesso a sua conta, e de onde serão emitidos os Tokens de acesso, caso a validação do usuário seja efetuada.

Fluxo do OAuth

  • Primeiramente a aplicação solicita ao usuário, autorização para acessar os recursos do serviço em que ele possui conta cadastrada.
  • Caso o usuário autorize, será enviado para o provedor de serviços do usuário, Google, Facebook, ou outros, informando sua identidade, ou seja, que aplicação está solicitando o acesso, a uri de redirecionamento, para onde a aplicação será redirecionada caso haja a autorização, o tipo de resposta esperada, geralmente é um código, e o nível de acesso que a aplicação está solicitando. Veja um exemplo abaixo:
    • https://minhaaplicacao.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
  • Em seguida a aplicação solicitará ao servidor de autorização, um Token de acesso, utilizando sua própria identificação, ou seja, a aplicação deve dizer quem ela é, e utilizando a concessão recebida do usuário.
  • Na API, será verificado a identidade da aplicação que solicita o acesso, e a concessão de acesso dada pelo usuário, e se validadas as duas informações, será emitido um Token de acesso para a aplicação.
  • Agora com o Token em mãos, a aplicação solicitará o recurso ao servidor de recursos.
  • Se o Token for validado pelo servidor de recursos, o mesmo fornecerá o acesso para a aplicação.

Esse fluxo apresentado, pode variar dependendo do tipo de concessão de autorização que foi definido. Mas de maneira geral, o processo segue dessa forma. Importante salientar que o provedor dos dados, Google, Facebook, entre outros, deve confiar, conhecer o provedor OAuth, porque caso não seja de conhecimento dos provedores, o Token apresentado pelo OAuth para acessar as informações será rejeitado.

Autor: Anderson Luis Massens Ramos

Referências

https://pt.wikipedia.org/wiki/OAuth

https://www.digitalocean.com/community/tutorials/uma-introducao-ao-oauth-2-pt

https://support.google.com/a/answer/162106?hl=pt-BR

https://pt.stackoverflow.com/questions/123777/oauth-o-que-%C3%A9-qual-sua-finalidade

https://www.profissionaisti.com.br/2019/07/seguranca-introducao-ao-protocolo-de-autorizacao-oauth/