Realizando traduções em tempo real com Translator Text & Node.js

microsoft-translator.jpg

Olá meus lindos e minhas lindas! Estamos de volta com mais uma nova série de artigos! E dessa vez será sobre como podemos usar de diferentes maneiras os Serviços Cognitivos da Microsoft, visando deixar a sua aplicação mais inteligente e melhor: fazendo uso da I.A!

Nesse primeiro artigo dessa série irei falar sobre o Translator Text. Mas antes, vamos entender o que seria esse Serviço Cognitivo.

O que seria Translator Text?!

translator-api.png

Translator Text é um serviço de tradução de máquina neural que os desenvolvedores podem interagir de uma maneira muito fácil em: sites, ferramentas ou qualquer tipo de solução que precise de vários idiomas, como localização de sites, suporte ao cliente, aplicativos de mensagens e entre vários cenários.

Com a API do Translator, você pode realizar traduções para mais de 60 idiomas. Podendo realizar traduções para textos em celular, computador e aplicações Web. E o melhor disso tudo é que, API Translator é open source!

Um ponto importante a ser mencionado aqui é que, o Translator Text é um serviço baseado em nuvem.

Esse serviço possuem duas versões:

  • V2 Translator API: essa versão permite realização de uma tradução com uso de sistemas estatísticos, sem nenhum uso de um sistema neural.
  • V3 Translator API: essa versão faz uso de um sistema neural por padrão. Porém, os sistemas estatísticos estarão disponíveis somente quando não houver nenhum sistema neural.

Suporte a mais de 60 idiomas!

Sim, o Translator Text disponibiliza de mais de 60 idiomas, entre eles para mencionar aqui: Árabe, Espanhol, Italiano, Inglês, Português e tantas outras.

Caso desejam saber quais idiomas estão disponíveis para o Translator Text, podem conferir com mais detalhes AQUI.

Bom… depois de toda essa explicação, agora podemos começar a testar esse serviço e desenvolver uma aplicação em Node.js. Vamos nessa?!

Mãos à obra!

Bom… falar é bom, mas vamos codar! Para isso, vamos precisar de alguns recursos necessários. Entre eles:

Caso você seja um(a) estudante de alguma Instituição de Ensino de Faculdade ou Universidade, poderá criar sua conta no Azure for Students. Essa conta te dará o benefício em possuir crédito de USD 100,00 para usar os serviços de maneira gratuita, sem necessidade de possuir um cartão de crédito. Para ativar essa conta, bastam acessar o link ao lado: AQUI

Todo o código desenvolvido desse artigo encontra-se disponível AQUI. Depois de instalar e criar uma conta Azure aí sim poderemos prosseguir com o nosso tutorial.

Criando Recurso do Translator Text

Bom, o primeiro passo que vamos precisar é criar um Recurso do Translator Text no Portal Azure.

Para isso, basta seguir o passo a passo como no gif abaixo:

Notem que, quando concluímos em criar um Recurso do Translator Texto ele nos gera uma key e um endpoint:

01-image.png

Guardem essa key e endpoint, pois durante o desenvolvimento da aplicação, vamos precisar dessas informações!

Criando Chave de Ambiente

Agora que já temos a nossa key é importante agora criarmos uma variável de ambiente. Pois, dessa forma, poderemos armazenar a key do recurso recém criados no Portal Azure. E é justamente isso que iremos fazer agora. Para isso, abre o seu prompt de comando e execute o seguinte comando:

> setx TRANSLATOR_TEXT_SUBSCRIPTION_KEY "sua-key"

> setx TRANSLATOR_TEXT_ENDPOINT https://api.cognitive.microsofttranslator.com

Notem que, não usaremos o endpoint do Portal Azure. Mas, sim o seguinte endpoint: https://api.cognitive.microsofttranslator.com

Vejam na imagem abaixo:

Screen-Shot-10-05-19-at-12-53-AM.png

Se aparecer a mensagem como acima é porque conseguimos configurar corretamente a nossa chave e endpoint na variável de ambiente localmente. Caso deseja executar esse comando em outro S.O, basta digitar os comandos:

  • Linux
> export TRANSLATOR_TEXT_SUBSCRIPTION_KEY=sua-key

> export TRANSLATOR_TEXT_ENDPOINT https://api.cognitive.microsofttranslator.com

> source ~/.bashrc
  • MacOs
> export TRANSLATOR_TEXT_SUBSCRIPTION_KEY=sua-key

> export TRANSLATOR_TEXT_ENDPOINT https://api.cognitive.microsofttranslator.com

> source ~/.bashrc

Ao terminar, seria bom fechar o seu prompt de comando e abrir novamente! #ficaadica

Bom, agora está tudo configurado. Vamos agora criar a nossa aplicação em Node.js

Coding Time!

Abre agora o seu Visual Studio Code e digite o seguinte comando abaixo:

> npm init -y

Esse comando irá criar um arquivo chamado package.json padrão para nós! Abre ele e inclua o seguinte bloco de código abaixo:

arquivo: package.json

{
  "name": "demo-api-translator-nodejs",
  "version": "1.0.0",
  "description": "Demo responsável por ",
  "main": "src/tradutor-texto.js",
  "scripts": {
    "dev": "node src/tradutor-texto.js"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/glaucia86/translatortext-nodejs-demo.git"
  },
  "keywords": [
    "nodejs",
    "javascript",
    "azure",
    "cognitive-services",
    "translator-text"
  ],
  "author": "Glaucia Lemos",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/glaucia86/demo-api-translator-nodejs/issues"
  },
  "homepage": "https://github.com/glaucia86/demo-api-translator-nodejs#readme"
}

Criando a estrutura do projeto

Vamos montar a seguinte estrutura do projeto conforme a imagem abaixo:

Screen-Shot-10-04-19-at-06-54-PM.png

Notem que, o arquivo tradutor-texto.js dentro da pasta src. É nesse arquivo que iremos desenvolver a lógica da nossa aplicação.

Desenvolvendo o projeto

Antes de mais nada, vamos instalar alguns pacotes que precisam instalar no nosso projeto. Para isso, abram o prompt de comando e digitam o seguinte comando:

> npm install request uuidv4

Agora notem que, o nosso package.json sofrerá mudanças e incluirá no bloco dependencies os dois pacotes acima: request e uuidv4.

  • arquivo: package.json
{
  "name": "demo-api-translator-nodejs",
  "version": "1.0.0",
  "description": "Demo responsável por ",
  "main": "src/tradutor-texto.js",
  "scripts": {
    "dev": "node src/tradutor-texto.js"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/glaucia86/translatortext-nodejs-demo.git"
  },
  "keywords": [
    "nodejs",
    "javascript",
    "azure",
    "cognitive-services",
    "translator-text"
  ],
  "author": "Glaucia Lemos",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/glaucia86/demo-api-translator-nodejs/issues"
  },
  "homepage": "https://github.com/glaucia86/demo-api-translator-nodejs#readme",
  "dependencies": {
    "request": "^2.88.0",
    "uuidv4": "^5.0.1"
  }
}

Agora, abram o arquivo tradutor-texto.js e inclua o seguinte bloco de código abaixo:

/**
 * 
 * Arquivo: src/tradutor-texto.js
 * Descrição: arquivo responsável por traduzir textos usando o Translator Text API.
 * Data: 03/10/2019
 * Author: Glaucia Lemos
 * 
 */

const request = require('request');
const uuidv4 = require('uuid/v4');


Beleza, agora vamos continuar o nosso desenvolvimento. Inclua o seguinte bloco abaixo:

/**
 * 
 * Arquivo: src/tradutor-texto.js
 * Descrição: arquivo responsável por traduzir textos usando o Translator Text API.
 * Data: 03/10/2019
 * Author: Glaucia Lemos
 * 
 */

const request = require('request');
const uuidv4 = require('uuid/v4');

let chave_translator = 'TRANSLATOR_TEXT_SUBSCRIPTION_KEY';

//==> Se não encontrar uma variável de ambiente' enviar mensagem de erro!
if (!process.env[chave_translator]) {
  throw new Error('Por favor, configure a sua variável de ambiente: ' + chave_translator);
}

let subscriptionKey = process.env[chave_translator];

let endpoint_translator = 'TRANSLATOR_TEXT_ENDPOINT';

if (!process.env[endpoint_translator]) {
  throw new Error('Por favor, configure a sua variável de ambiente: ' + endpoint_translator);
}

let endpoint = process.env[endpoint_translator];


Observem a importância de configurarmos localmente as nossas variáveis de ambiente para que, quando se execute a aplicação não venha a dar erro!

Vamos dar continuidade!

Configurando as Requisições

Estamos quase chegando ao final do desenvolvimento do nosso código! Para isso, vamos configurar as requisições para realizar a chamada da API do Translator Text. Para isso, inclua o seguinte bloco de código abaixo:

  • arquivo: tradutor-texto.js
(...)

function traduzirTexto() {
  // ==> Aqui vamos configurar os requests
  let options = {
    method: 'POST',
    baseUrl: endpoint,
    url: 'translate',
    qs: {
      'api-version': '3.0',
      'to': ['en', 'es']
    },
    headers: {
      'Ocp-Apim-Subscription-Key': subscriptionKey,
      'Content-type': 'application/json',
      'X-ClientTraceId': uuidv4().toString()
    },
    body: [{
      'text': 'Olá Desenvolvedor!'
    }],
    json: true,
  }
};

Perfeito! Agora vamos fazer imprimir a nossa requisição! Para isso, inclua o seguinte bloco de código abaixo:

  • arquivo: tradutor-texto.js
(...)

function traduzirTexto() {
  // ==> Aqui vamos configurar os requests
  let options = {
    method: 'POST',
    baseUrl: endpoint,
    url: 'translate',
    qs: {
      'api-version': '3.0',
      'to': ['en', 'es']
    },
    headers: {
      'Ocp-Apim-Subscription-Key': subscriptionKey,
      'Content-type': 'application/json',
      'X-ClientTraceId': uuidv4().toString()
    },
    body: [{
      'text': 'Olá Desenvolvedor!'
    }],
    json: true,
  }

  // ==> Aqui vamos imprimir a nossa requisição
  request(options, (err, res, body) => {
    console.log(JSON.stringify(body, null, 4));
  })
};

// Aqui vamos chamar a função para que possa realizar
// a tradução via API
traduzirTexto();


Agora está tudo pronto! Vamos executar a nossa aplicação e ver se vai realmente traduzir a frase: Olá Desenvolvedor para inglês e espanhol?!

Para isso, abre o prompt e vamos executar o comando:

> npm run dev

Só para vocês verem em ação, vejam agora com uma outra frase: Oi! Como você se chama? traduzindo do português para o inglês e espanhol:

Legal, não é mesmo?!

Todo o código desenvolvido durante esse post encontra-se AQUI

Palavras Finais

Hoje aprendemos um pouco o que é o Translator Text, a grande quantidade de idiomas que podemos fazer uso para realizar traduções em aplicações e uma demonstração a qual puderam aprender como é fácil usar essa API.
Um ponto que não mencionei é que, essa API, além do Node.js/JavaScript, também está disponível para ser desenvolvido nas seguintes linguagens:

  • C#
  • Java
  • Python
  • Go
  • PHP
  • Ruby

Há mais coisas legais para fazermos aqui ainda nessa API, como por exemplo: em chinês se lê ideogramas, certo? Mas, caso queiramos entender como ler esses ideogramas? (nesse caso: o piyin ban)? Bom, tenho uma novidade para vocês! Sempre depois de sair um artigo dessa série, estarei fazendo uma série de vídeo aulas explicando passo a passo como fazer o tutorial e tirando dúvidas em tempo real.

E já temos um vídeo sobre esse projeto do Translator Text . Vejam abaixo:

Fiquem ligados porque teremos vídeos explicando esse tutorial e como podemos traduzir idiomas orientais!

E para ficarem por dentro de várias outras novidades, não deixem de me seguir lá no twitter!

Twitter

Nos vemos! Até a próxima série pessoal! 😍

Migrando uma Aplicação MEAN para Arquitetura Serverless & Azure Functions

Este artigo faz parte da coleção de conteúdos do #ServerlessSeptember. Aqui você encontrará todos os artigos publicados durante o mês de Setembro de 2019.

Durante esse artigo você aprenderá a realizar a migração de uma maneira simples, rápida e dinâmica de uma aplicação MEAN para uma arquitetura Serverless, fazendo uso do Azure Functions!

O projeto MEAN já está pronto e vocês podem fazer um git clone ou download AQUI

Vamos nessa?!

Entendendo a estrutura do Projeto MEAN

Nesse projeto vamos focar nas duas pastas: api e front. Conforme a imagem abaixo:

Se vocês executarem essa aplicação observarão que estamos persistindo essa aplicação no MongoDb e usando o Back-End, que nesse caso estamos usando o Node.js

Os dados persistidos consiste em:

Classe: Funcionario

  • idFuncionario: (number – guid gerado pelo MongoDb)
  • nomeFuncionario: string
  • cargo: string
  • numeroIdentificador: number

Caso desejam executar localmente esse projeto, bastam seguir os passos no README.md do repositório do projeto.

Bom, agora que vocês estão com o projeto MEAN em mãos, vamos começar a fazer a migração para o Azure Functions?!

Mas antes, vamos entender o que seria o Azure Functions!

O que é Azure Functions?! ⚡️

Azure Functions é um serviço de computação serverless que permite executar o facilmente pequenos trechos de código ou funções na nuvem sobre demanda sem precisar provisionar ou gerenciar a infraestrutura.

E o Azure Functions possui suporte a inúmeras linguagens, entre elas:

Já as linguagens abaixo, já possui suporte, porém estão na sua versão preview:

  • Bash
  • PHP

Se desejarem saber mais detalhes das linguagens que possuem suporte ao Azure Functions, bastam acessar o link AQUI.

Porém, para esse artigo focaremos no JavaScript! 😉

Templates Importantes no Azure Functions

Antes de começar a realizar a migração é importante mencionar que o Azure Functions dispõe de inúmeros templates já prontos e preparados só para começar a serem usados. Entre eles:

Não entrarei em detalhes de cada um, pois senão esse artigo ficará muito grande. Mas, caso desejam entender mais sobre cada template e qual o seu melhor uso numa determinada aplicação, recomendo a leitura na documentação AQUI.

Para esse post, estaremos fazendo uso do template: HTTPTrigger uma vez que esse template dispara a execução do seu código usando uma solicitação HTTP. E é justamente o que precisaremos para realizar a migração!

Caso você seja um(a) estudante de alguma Instituição de Ensino de Faculdade ou Universidade, poderá criar sua conta no Azure for Students. Essa conta te dará o benefício em possuir crédito de USD 100,00 para usar os serviços de maneira gratuita, sem necessidade de possuir um cartão de crédito. Para ativar essa conta, bastam acessar o link ao lado: AQUI. Com essa conta, você poderá fazer uso de 1.000.000 solicitações gratuitas por mês para processar eventos no Azure Functions!

Screen-Shot-09-11-19-at-12-42-PM.png

Bom, depois desse overview sobre Azure Functions, podemos enfim começar a nossa migração! Vamos que vamos!

Instalando o pacote Azure Functions Core Tools

Azure Functions Core Tools nos permitirá desenvolver e testar as funções de maneira local na nossa máquina a partir de um terminal ou prompt de comando.

Abaixo seguem os programas e o pacote que precisaremos para continuar no nosso tutorial:

Depois que você tiver o Node.js instalado na sua máquina, basta digitar o seguinte comando:

  • Windows
npm install -g azure-functions-core-tools
  • MacOs
brew tap azure/functions
brew install azure-functions-core-tools
  • Linux (Ubuntu/Debian) com APT
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

Para maiores informações para instalar de maneira correta o Azure Functions Core Tools, bastam acessar o link AQUI

E como vou saber se de fato o meu Azure Functions Core Tools está instalado de maneira correta na minha máquina?! Bastam digitar o seguinte comando no terminal:

> func

Se acontecer conforme o gif abaixo é porque o pacote foi instalado com sucesso!

gif-serverless-07.gif

Ótimo. Agora, podemos criar as nossas funções. Para isso, crie um pasta local na sua máquina e vamos começar!

Criando uma Nova Aplicação no Azure Functions

Agora que já temos instalado o pacote, vamos criar uma nova aplicação. Para isso, bastam seguir o passos conforme o gif abaixo:

gif-serverless-08.gif

Observam que, quando abrimos o Visual Studio Code, precisamos clicar no botão YES que aparece no canto inferior direito para habilitar alguns arquivos importantes no projeto.

Criando a Conexão com o MongoDb

Bom, vamos fazer agora algumas alterações necessárias no nosso projeto recém criado. Para isso, vamos instalar localmente o mongodb no nosso projeto. Digitem o seguinte comando:

npm install mongodb

Ao instalar o mongoDb no projeto, observem que houve alterações no arquivo package.json. No final o arquivo deverá ficar da seguinte maneira:

  • arquivo: package.json
{
  "name": "crud-serverless-mongodb",
  "version": "1.0.0",
  "description": "Projeto azure functions com persistencia com o mongoDb",
  "scripts": {
    "test": "echo \"No tests yet...\""
  },
  "author": "",
  "dependencies": {
    "mongodb": "^3.3.2"
  }
}

Agora, vamos criar uma pasta chamada: shared e dentro dela vamos criar o arquivo: mongo.js. A estrutura do projeto agora ficará da seguinte maneira:

Vamos agora alterar o arquivo mongo.js. Para isso, inclua o bloco de código abaixo:

  • arquivo: shared/mongo.js
/**
 * Arquivo: mongo.js
 * Data: 10/11/2019
 * Descrição: arquivo responsável por tratar a conexão da Base de Dados localmente
 * Author: Glaucia Lemos
 */

const { MongoClient } = require("mongodb");

const config = {
  url: "mongodb://localhost:27017/crud-serverless-mongodb",
  dbName: "crud-serverless-mongodb"
};

async function createConnection() {
  const connection = await MongoClient.connect(config.url, {
    useNewUrlParser: true
  });
  const db = connection.db(config.dbName);
  return {
    connection,
    db
  };
}

module.exports = createConnection;

Aqui estamos criando a nossa conexão local com o MongoDb! Muito parecido com o que já fazemos no Back-End com o Node.js, não é mesmo?!

E vamos também alterar o arquivo local.settings.json. Esse arquivo é responsável por ‘guardar’ todas as keys que não queremos que estejam expostas na hora de realizar o commit. Notem que esse arquivo está na lista de arquivos no .gitignore.

Abram o arquivo local.settings.json e façam as seguintes alterações:

  • arquivo: local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": "{AzureWebJobsStorage}"
  },
  "Host": {
    "LocalHttpPort": 7071,
    "CORS": "*"
  }
}

Notem no bloco de código acima que já estamos habilitando o CORS. Pois sem ele, não conseguimos realizar as operações de CRUD no front! Se desejarem entender um pouco mais sobre o CORS recomendo a leitura AQUI.

Bom, a primeira parte já está pronta! Agora vamos criar o nosso CRUD no Azure Functions!

Criando a função ‘CreateFuncionario’

Para criar uma nova função bastam digitar o seguinte comando:

func new

Ao digitar esse comando ele dará várias opções de templates que o Azure Functions nos disponibiliza. No nosso caso, conforme já mencionado acima, vamos escolher o template: HttpTrigger. Sigam os passos do gif abaixo:

gif-serverless-09.gif

Observem que, foi criado uma pasta CreateFuncionario e dois arquivos:

  • function.json: aqui iremos definir as rotas e os métodos do nosso endpoint.
  • index.json: aqui iremos desenvolver a lógica inerente ao endpoint.

Vamos começar a alterar esses arquivos. Começando pelo function.json

  • arquivo: CreateFuncionario/function.json
{
  "bindings": [{
          "authLevel": "anonymous",
          "type": "httpTrigger",
          "direction": "in",
          "name": "req",
          "methods": ["post"],
          "route": "funcionarios"
      },
      {
          "type": "http",
          "direction": "out",
          "name": "res"
      }
  ]
}

Agora vamos alterar o arquivo index.js:

  • arquivo: CreateFuncionario/index.js
/**
 * Arquivo: CreateFuncionario/index.js
 * Data: 10/11/2019
 * Descrição: arquivo responsável por criar um novo 'Funcionário'
 * Author: Glaucia Lemos
 */

const createMongoClient = require('../shared/mongo')

module.exports = async function (context, req) {
  const funcionario = req.body || {}

  if (funcionario) {
    context.res = {
      status: 400,
      body: 'Os dados do(a) Funcionário(a) é obrigatório!'
    }
  }

  const { db, connection } = await createMongoClient()

  const Funcionarios = db.collection('funcionarios')

  try {
    const funcionarios = await Funcionarios.insert(funcionario)
    connection.close()

    context.res = {
      status: 201,
      body: funcionarios.ops[0]
    }
  } catch (error) {
    context.res = {
      status: 500,
      body: 'Error ao criar um novo Funcionário(a)'
    }
  }
}

Aqui estamos praticamente definindo a rota do Post e desenvolvendo a lógica do Criar um novo Funcionário.

Vamos executar esse endpoint?! Para executar, bastam digitar o seguinte comando:

> func host start

E ele irá listar o nosso endpoint criado! Vejam no gif:

gif-serverless-11.gif

Ele lista para nós o seguinte endpoint: [POST] http://localhost:7071/api/funcionario

A porta 7071 é a porta default do Azure Functions. E é justamente ela que iremos precisar para colocar no nosso Front-End!

Bom, vamos agora pegar essa rota e adicionar no Front-End! Para isso, precisamos realizar algumas alterações no projeto Front. Vão até a pasta front em: front -> src -> app -> funcionario.service.ts e alterem o seguinte arquivo funcionario.service.ts

  • arquivo: funcionario.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class FuncionarioService {

  // ==> Uri da api (Back-End)
  uri = 'http://localhost:7071/api';

  constructor(private http: HttpClient) { }


(...)

Só precisamos alterar a uri definida no service do Angular.

Nesse momento, precisaremos executar o Mongo Compass e o Front-End. Observem no gif como persistirá o novo funcionário e que não precisaremos mais da pasta api do projeto!

gif serverless 12

Persistiu lindamente! 😍

Agora, vamos fazer o listar!

Criando a função ‘GetFuncionarios’

É a mesma premissa que foi feita acima, vamos criar uma nova função com o comando: func new, nomear a função de GetFuncionarios e alterar os arquivos: function.json e index.js

gif serverless 13
  • GetFuncionarios/function.json
{
    "bindings": [{
            "authLevel": "anonymous",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": ["get"],
            "route": "funcionarios"
        },
        {
            "type": "http",
            "direction": "out",
            "name": "res"
        }
    ]
}


  • GetFuncionarios/index.js
/**
 * Arquivo: GetFuncionarios/index.js
 * Data: 10/11/2019
 * Descrição: arquivo responsável por listar todos os 'Funcionários'
 * Author: Glaucia Lemos
 */

const createMongoClient = require('../shared/mongo')

module.exports = async context => {
  const { db, connection } = await createMongoClient()

  const Funcionarios = db.collection('funcionarios')
  const res = await Funcionarios.find({})
  const body = await res.toArray()

  connection.close()

  context.res = {
    status: 200,
    body
  }
}

Vamos testar novamente! Vejam novamente o gif abaixo!

gif-serverless-14.gif

Novamente está funcionando perfeitamente. Já observaram que é fácil criar um CRUD com o Azure Functions, não é mesmo?! Agora é só seguir os mesmos passos para criar as próximas funções!

Criando a função ‘GetFuncionarioById’

Agora que já ficou muito claro a todos aqui como é fácil criar um CRUD com o Azure Functions, vou começar a acelerar o processo de criação e só informar o que foi alterado nos arquivos function.json e index.js

  • GetFuncionarioById/index.js
{
    "bindings": [{
            "authLevel": "anonymous",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": ["get"],
            "route": "funcionarios/{id}"
        },
        {
            "type": "http",
            "direction": "out",
            "name": "res"
        }
    ]
}

  • GetFuncionarioById/function.json
// @ts-nocheck
/**
 * Arquivo: GetFuncionarioById/index.js
 * Data: 10/11/2019
 * Descrição: arquivo responsável por listar Funcionário pelo Id
 * Author: Glaucia Lemos
 */

const { ObjectID } = require('mongodb')
const createMongoClient = require('../shared/mongo')

module.exports = async function (context, req) {
  const { id } = req.params

  if (!id) {
    context.res = {
      status: 400,
      body: 'Por favor, passe o número correto do Id do Funcionário!'
    }

    return
  }

  const { db, connection } = await createMongoClient()

  const Funcionarios = db.collection('funcionarios')

  try {
    const body = await Funcionarios.findOne({ _id: ObjectID(id) })

    connection.close()
    context.res = {
      status: 200,
      body
    }
  } catch (error) {
    context.res = {
      status: 500,
      body: 'Erro ao listar o Funcionário pelo Id.'
    }
  }
}

Não vamos testar agora. Vamos desenvolver as duas últimas funções: Update e Delete.

Criando a função: ‘UpdateFuncionario’

Novamente, vamos criar uma nova função e alterar os arquivos function.json e index.js:

  • UpdateFuncionario/index.js
{
    "bindings": [{
            "authLevel": "anonymous",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": ["put"],
            "route": "funcionarios/{id}"
        },
        {
            "type": "http",
            "direction": "out",
            "name": "res"
        }
    ]
}

  • UpdateFuncionario/index.js
// @ts-nocheck
/**
 * Arquivo: UpdateFuncionario/index.js
 * Data: 10/11/2019
 * Descrição: arquivo responsável por atualizar 'Funcionário' por Id
 * Author: Glaucia Lemos
 */

const { ObjectID } = require('mongodb')
const createMongoClient = require('../shared/mongo')

module.exports = async function (context, req) {
  const { id } = req.params
  const funcionario = req.body || {}

  if (!id || !funcionario) {
    context.res = {
      status: 400,
      body: 'Os campos são obrigatórios'
    }

    return
  }

  const { db, connection } = await createMongoClient()
  const Funcionarios = db.collection('funcionarios')

  try {
    const funcionarios = await Funcionarios.findOneAndUpdate(
      { _id: ObjectID(id) },
      { set: funcionario }
    )

    connection.close()

    context.res = {
      status: 200,
      body: funcionarios
    }
  } catch (error) {
    context.res = {
      status: 500,
      body: 'Erro ao atualizar o Funcionário'
    }
  }
}


Show! Agora vamos desenvolver a nossa última função: Delete!

Criando a função: ‘DeleteFuncionario’

Novamente, bastam criar uma nova função, escolher a opção: HttpTrigger, nomear a função de DeleteFuncionario e alterar os arquivos function.json e index.js:

  • DeleteFuncionario/function.json
{
  "bindings": [{
          "authLevel": "anonymous",
          "type": "httpTrigger",
          "direction": "in",
          "name": "req",
          "methods": ["delete"],
          "route": "funcionarios/{id}"
      },
      {
          "type": "http",
          "direction": "out",
          "name": "res"
      }
  ]
}

  • DeleteFuncionario/index.js
// @ts-nocheck
/**
 * Arquivo: DeleteFuncionario/index.js
 * Data: 10/11/2019
 * Descrição: arquivo responsável excluir um 'Funcionário' pelo Id
 * Author: Glaucia Lemos
 */

const { ObjectID } = require('mongodb')
const createMongoClient = require('../shared/mongo')

module.exports = async function (context, req) {
  const { id } = req.params

  if (!id) {
    context.res = {
      status: 400,
      body: 'Os campos são obrigatórios!'
    }

    return
  }

  const { db, connection } = await createMongoClient()

  const Funcionarios = db.collection('funcionarios')

  try {
    await Funcionarios.findOneAndDelete({ _id: ObjectID(id) })
    connection.close()
    context.res = {
      status: 204,
      body: 'Funcionário excluído com sucesso!'
    }
  } catch (error) {
    context.res = {
      status: 500,
      body: 'Erro ao excluir Funcionário' + id
    }
  }
}

E está pronto o nosso CRUD! Vamos testar todos os endpoints?! Vejam o gif abaixo!

gif serverless 15

Coisa mais linda, não é mesmo?! Notem mais uma vez que, aquela pasta api onde há inúmeros arquivos, não terá mais necessidade! Podemos praticamente deletar aquela pasta inteira!!!

Todo o código fonte desenvolvido estão aqui:

👉 Projeto Front-End

👉 Projeto Api – Serverless

Palavras Finais

Hoje aprendemos a realizar a migração de uma aplicação MEAN para o Azure Functions, porém persistindo esses dados localmente e executando essas funções localmente. E se porventura precisarmos hospedar essa aplicação na Nuvem? E o nosso Back-end como ficaria?

No próximo post, estarei explicando a vocês como realizar a migração do MongoDb para o CosmosDb e como realizar o deploy dessas funções usando uma extensão do Azure Tools no próprio Visual Studio Code.

Se vocês desejam saber mais detalhes sobre Azure Functions recomendo a todos vocês os seguintes cursos totalmente gratuitos de Serverless & Azure Functions e alguns outros recursos importantes:

✅ Cursos Grátis – Azure Functions

✅ Azure para devs JavaScript & Node.js

✅ Documentação Azure Functions

✅ Criando a sua Primeira Função no Visual Studio Code

✅ Extensão Vs Code – Azure Functions

✅ E-Book Grátis – Azure Serverless Computing Cookbook

E, para ficarem por dentro das últimas atualizações não deixem de me seguir no Twitter! 😃

Twitter

Até a próxima pessoal! ❤️ ❤️ ❤️

Lançamentos & Novidades Build 2019

Durante os dias 06 à 08 de Maio, aconteceu um dos maiores eventos que acontece todos os anos na cidade de Seattle, USA – o Microsoft Build 2019.

Houve várias novidades e claro muitos lançamentos. Mas, vou focar nos principais lançamentos, entre eles:

  • .NET 5
  • .NET Core 3.0 Preview 5
  • Windows terminal
  • WSL 2
  • Extensão do Remote Code ao Visual Studio Code
  • React Native for Windows

Vamos nessa!

Lançamento: .NET 5

Uma dos lançamentos mais esperados e que de fato aconteceu é que após o release do .NET Core 3.0 será o .NET 5.

E segundo o blog oficial, esse será um grande lançamento da família .NET, pois haverá apenas um .NET onde o desenvolver poderá optar em usar tanto em: Windows, Linux, MacOs, Android, tvOs, watchOS e WebAssembly entre outros.


Um dos pontos altos do .NET 5 é que finalmente os desenvolvedores poderão desenvolver aplicação usando Windows Forms, WPF e o EF 6.0 – já usando o .NET Core. E esse lançamento será um grande divisor de águas uma vez que ele vem com a intenção de manter a mesma aparência e sensação independente da aplicação que esteja desenvolvendo.

Há um calendário de releases que estão previstos sair até Novembro de 2023

Caso desejam saber mais detalhes das mudanças referente ao .NET 5, bastam acessar link AQUI

.NET Core 3.0 Preview 5

Um outro lançamento feito durante o Build 2019 é com respeito ao .NET Core 3.0. O interessante dessa versão é que ele inclui um novo serializador Json com suporte para executar arquivos únicos para uma atualização em tempo de execução e alterações no BCL.

No mesmo momento, também foi lançado o ASP .NET Core 3.0 e o EF Core.

Uma das grandes novidades dessa versão é que veio com atualizações para quem deseja desenvolver com WPF e Windows Forms. Houve mudanças para o novo SqlClient, havendo mudanças significativas do provedor ao .NET Framework.

Houve muitas atualizações para essa versão, entre elas: Atualizações do Docker e AssemblyLoadContext, suporte para GC, entre outras grandes atualizações. Caso desejam ficar por dentro dessas e outras mudanças, bastam acessar o link AQUI

Windows Terminal

Dos lançamentos feitos durante o Build 2019, esse foi o que movimentou demais as redes sociais e todos durante o evento! E de fato não é para menos!

O novo Windows Terminal, veio com a proposta de ser: moderno, rápido, eficiente, poderoso e produtivo! Uma vez que, com o mesmo terminal você pode abrir inúmeras abas para: PowerShell, Cmd e WSL.

A parte que eu mais curti desse novo Windows Terminal é que ele é altamente configurável. Resumindo: você pode ir até Settings e alterar o arquivo json contido e configurar da maneira e jeito que deseja. Tudo é alterável: cor, plano de fundo, fonte e tudo mais! Você pode deixar de acordo com o seu jeito e sua cara!

Já querem testar esse novo terminal?! Se a resposta for sim, bastam acessar o link AQUI

Eu já baixei e testei e estou amando!

WSL 2

Outro grande anúncio feito é sobre o WSL 2 (Windows Subsystem for Linux). A mudança é que houve mudanças drásticos no desempenho do sistema de arquivos e compatibilidade total com as chamadas do sistema. Ou seja, a pessoa desenvolvedora poderá executar mais aplicativos Linux no WSL 2, como por exemplo o Doclker.

O gif abaixo mostra exatamente o que o WSL 2 é capaz de fazer:

Uma das coisas mais interessante disso tudo é que a Microsoft enviará um Kernel Linux com o Windows, a qual possibilitará a total compatibilidade com as chamadas do sistema. E essa será a primeira vez que um Kernel Linux é lançado no Windows – mostrando assim que a Microsoft ama o Open Source!

Uma grande mudança que com certeza, no futuro próximo, colheremos ótimos frutos mediante a tudo isso que estamos vendo. Que tempo para ser uma pessoa desenvolvedora, não é mesmo?!

Resultado de imagem para microsoft loves linux

Extensão do Remote Code ao Visual Studio Code

Essa também, foi uma das grandes novidades que tivemos no Build 2019 e que todos ficaram maravilhados!

Para aqueles que usam o Visual Studio Code foi lançado 3 novas extensões que permitem o desenvolvimento remoto em máquinas físicas ou virtuais usando o WSL.

Esse lançamento é importante, uma vez que muitas pessoas, como por exemplo, Cientistas de Dados, precisam treinar seus modelos de dados e consequentemente precisam de armazenamento massivo para analisar grandes conjuntos de dados.

Extensões remotas e locais

Se desejarem testar agora o Remote – WSL, bastam acessar o link AQUI e começar a testar agora mesmo no seu Visual Studio Code!

Caso desejam também dar uma olhada como é fácil desenvolver no WSL, assistam esse vídeo de 2 minutos e vejam como é prático e rápido!

Caso desejam ficar por dentro das atualizações e novidades em relação do Remote WSL no Visual Studio Code, bastam acessar o link AQUI.

React Native for Windows

E para fechar, vamos falar dessa outra grande novidade que foi bastante comentada durante o Build 2019!

Agora você poderá desenvolver aplicações mobile em React Native para Windows! Algo que antes era impossível fazer!

O que isso quer dizer? Isso nos mostra que, a pessoa desenvolvera, poderá desenvolver uma aplicação UWP e disponibilizar tranquilamente para o React Native. Uma vez que, o React Native for Windows estará usando o C++ e com suporte para o C#.

Outro ponto importante é que você poderá incorporar os componentes do React Native num aplicativo UWP já existente. Que grande passo não é mesmo?!

O projeto está disponibilizado no repositório oficial da Microsoft no GitHub. E melhor: código aberto, totalmente open source, só esperando a Comunidade Técnica abrir PR’s e issues!

Hero Image with Logo

Palavras Finais

Como dito acima, houve muitos anúncios e lançamentos e se eu fosse comentar aqui, esse post ficaria gigantesco demais. Porém, recomendo dois links que explicam muito bem as novidades feitas:

  • Site oficial do Build 2019: aqui eles trazem todas as novidades em forma de vídeos e tudo o que aconteceu durante o Microsoft Build 2019
  • Lambda3 Podcast 144 – Microsoft Build 2019: podcast feito pelos colaboradores da Lambda3, onde comentam também sobre os principais lançamentos e novidades que aconteceram durante o Microsoft Build 2019 – português.

Então é isso pessoal! Até a próxima!

Criando um ChatBot em menos de 5 minutos?! Sim. É possível!

Será que é possível criar um ChatBot em menos de 5 minutos?! Já vou responder que sim e é possível.

Mas, antes de mostrar o vídeo mostrando que é possível. Quero ensinar a todos vocês a desenvolver o Chatbot e no final mostrarei por vídeo que é possível criar em menos de 5 minutos. Vamos nessa?!

Recursos Necessários

Para criar o nosso ChatBot, estarei usando a nova versão do Microsoft Bot Framework: v.4. Caso queiram saber mais detalhes a respeito das novidades da versão 4 bastam acessar o link abaixo:

Para o desenvolvimento do nosso ‘echoBot’ vamos precisar instalar:

Como dito acima, estaremos fazendo uso do SDK v.4 para desenvolver o nosso echoBot.

Aqui vamos nós!

Step by Step, oh, baby! 

Vamos passo a passo para que todos vocês possam acompanhar! Primeiro, peço que vocês instalem o Node.js e depois Yeoman.

Se você for usuário Windows peço que dê uma olhada na documentação que criei no repositório demo. Pois tem que instalar o Python 2.7.x (para usuários Windows) e depois executar o comando:

> npm install -g windows-build-tools

Depois crie uma pasta com o nome do projeto. Basta seguir os passos abaixo:

> mkdir chatBot

> cd chatBot

Beleza! Pasta criada! Agora execute o seguinte comando abaixo:

> npm install -g yo generator-botbuilder

O que esse comando está fazendo? Estaremos instalando o pacote que criará um scaffolding do nosso ChatBot. Ele usa justamente o Yeoman! Por isso que precisamos instalar globalmente esse pacote. Caso queiram saber mais sobre esse pacote, bastam dar uma olhada no link abaixo:

Show! Vamos agora fazer o seguinte: dentro da pasta digitem o seguinte comando abaixo:

> yo botbuilder

Agora… segue as execução conforme o gif abaixo:

Depois, no próprio prompt comando digite o comando “code .” esse comando irá abrir o Vs Code do projeto criado. Vamos dar uma olhada em que o comando acima nos gerou!

Notem que, ele cria um scaffolding prontinho, só pedindo para ser executado. E é justamente o que iremos fazer agora. Vão até a pasta criada ‘echoBot’ e execute o seguinte comando:

> nodemon

Feito isso, executem o Bot Emulator e observem como devem proceder para executar o nosso ‘echoBot’ no gif abaixo:

Simples não é mesmo?! Notem que quando executamos o comando ‘nodemon’ ele automaticamente já executa a porta padrão do restify. E depois abriremos o Bot Framework Emulator para justamente executar o nosso echoBot, que está sinalizado com o símbolo do Bot Framework.

E vòilá! Está pronto o nosso ChatBot e desenvolvido em menos de 5 minutos. Como prova, fiz um vídeo onde mostro que é verídico criar em pouco tempo:

Sei que é um ChatBot simples. Mas, só para mostrar para todos vocês aqui que sim — é possível criar um ChatBot em menos de 5 minutos. Caso desejam criar um ChatBot mais elaborado, sugiro fazer uso dos serviços cognitivos da Microsoft. Caso queiram saber mais detalhes, bastam dar uma olhada no link abaixo:

Há 6 serviços cognitivos que vocês podem estar incluindo no ChatBot de vocês. São eles:

Dos 6 acima, eu curto mais usar o LUIS. Que é um serviço cognitivo de Processamento de Linguagem Natural. Caso queiram aprender a desenvolver um ChatBot integrado com o LUIS, segue esse curso excelente abaixo:

Cursos Grátis – Inteligência Artificial com Serviços Cognitivos & Chatbots:

Palavras Finais

O uso de ChatBots tem se tornado muito comum em nossos dias. E de fato são de grande utilidade pois nos auxiliam para responder a perguntas necessárias, a qualquer momento e a qualquer hora — 24/7, sem necessidade de um atendente de telemarketing. E se a experiencia desse ChatBot for integrada com uso de I.A com Serviços Cognitivos, podem ter certeza de que o usuário se sentirá muito feliz com essa experiência.

Fica a dica a todos. Comecem a estudar sobre o desenvolvimento de ChatBots integrados com Serviços Cognitivos com I.A.

Em breve, estarei realizando um novo treinamento de ChatBots no meu canal do Youtube, usando justamente a versão 4.

Caso queiram ficar por dentro dessa e outras novidades, me acompanhem no twitter. Pois tenho postado muitas coisas e dicas bem legais lá!

Até a próxima pessoal! 😍

14 Dicas para Turbinar o seu VS Code!

O VsCode se tornou a IDE mais querida por todas as pessoas desenvolvedoras e um dos mais usados por todos — independentemente da linguagem de programação que você está codificando!😍

Mas, o que poucos sabem é a grande quantidade de recursos e plugins que estão já disponíveis no VsCode por meio do Market Place!😎

Muitos desenvolvedores(as), quando estou realizando uma live, acabam me perguntando sobre alguns plugins e extensões que uso no meu VsCode e esse post é justamente sobre isso: como turbinar o seu VsCode para agilizar na hora de desenvolver aplicações ou até mesmo para realizar um deploy da sua aplicação direto do seuVs Code.

Vamos nessa!

Continuar lendo “14 Dicas para Turbinar o seu VS Code!”

Updates no Mundo das Comunidades e Novidades para 2019

Fala pessoal. Tudo bem? Sei que faz um tempo que não estou escrevendo, mas estarei voltando a escrever nem que seja 2x por mês, uma vez que tenho concentrado em desenvolver conteúdos através do Youtube e palestras presenciais.

Mas, vamos alguns updates que aconteceram nessas últimas semanas e o que está por vir no ano de 2019!

Vamos ao que iremos abordar durante essa postagem aqui:

  • Webinars no Canal Glaucia Lemos – 11/2018 (Loiane Gronner & Tulio Faria)
  • Próximos Webinars no Canal Glaucia Lemos – 12/2018
  • Novidades no Canal do Youtube – Glaucia Lemos – 2019
  • Novidades lançadas durante o Microsoft Connect 2018
  • Microsoft Ignite The Tour SP 2018
  • Próximos Eventos

Here we… Go!

Continuar lendo “Updates no Mundo das Comunidades e Novidades para 2019”

Novidades & Atualizações Fresquinhas! :) :)

Sei sei…. e já peço desculpas de antemão. Andei sumida por aqui. Mas, não parei e mantei a minha promessa com todos vocês: continuar gerando conteúdos.

Vamos aos tópicos a serem falados hoje aqui:

  • Participações em Eventos durante o mês de Agosto
  • Próximas Participações em Eventos durante o mês de Novembro;
  • Workshop – ASP .NET Core para Iniciantes;
  • Novas Séries no Canal do Youtube
  • Novos Webinars
  • Novidades para 2019

Vamos nessa?!

Continuar lendo “Novidades & Atualizações Fresquinhas! 🙂 :)”

Novidades sobre Typescript 3.0! O que esperar?!

Fala pessoal! Tudo certo?! Estou aqui para falar um pouco do último release que tivemos da versão 3.0 do tão aclamado e amado por tantos desenvolvedores (tanto Back-End ou Front-End): Typescript!

Bom… não vamos perder tempo e vamos as novidades dessa nova versão, uma vez que tem uma pancada de coisas legais para falar aqui!!! 😉

foto_1

Continuar lendo “Novidades sobre Typescript 3.0! O que esperar?!”