A importância do UX Design no desenvolvimento de um produto

Design vector created by stories – freepik.com

Para falar da importância do UX Design, devemos começar respondendo o maior questionamento: o que é User Experience Design?

O termo foi criado por Donald (Don) Norman, famoso engenheiro de usabilidade, e significa, em tradução livre, design da experiência do usuário. A expressão muitas vezes é utilizada erroneamente por muitos designers e programadores, mas é válido salientar que uma boa experiência do usuário não se trata apenas de criar um código bem feito, uma interface clean ou uma boa embalagem. A UX começa a partir do momento em que o usuário final passa a interagir com um produto e essa interação nem sempre precisa ser direta, ela pode iniciar no momento em que ele ouve falar sobre.

Qualquer produto/serviço, seja ele físico ou digital, causará um impacto na vida do usuário, que terá um grau de satisfação, positivo ou negativo. O trabalho do UX Designer é garantir que esse grau seja positivo e que sejam satisfeitas as necessidades do cliente e da empresa.

Ao decidir comprar um carro, e após fazer um test drive, o cliente não levará o carro mais bonito se ele não atender suas necessidades enquanto motorista. O mesmo acontece no mundo dos softwares. A aparência de uma aplicação é importante porque é como ela será apresentada ao usuário final, mas ele só continuará a utilizá-la se suas exigências como cliente forem atendidas.

Tomando como exemplo os seguintes apps e uma pessoa vegetariana que irá utilizá-los, o primeiro representa uma péssima experiência do usuário. Você consegue ver o porquê?


Não é difícil perceber que ambos são muito parecidos visualmente, ou seja, o UI (User Interface) Design é praticamente o mesmo. O que faria o usuário dar preferência ao segundo aplicativo é o fato dele entender o seu cardápio e não sugerir pratos que contenham proteína animal.

Esse é um exemplo bem simples, que fala sobre uma das áreas pelas quais o UX Designer é responsável: a arquitetura da informação. Nesse caso, durante o estudo de estratégia, uma das cinco etapas entre a ideia e o layout, o profissional responsável pela segunda aplicação levou em consideração que pratos que estão de acordo com os gostos e estilo de vida dos usuários são mais relevantes e devem ser exibidos em destaque, enquanto os outros podem manter-se em segundo plano e aparecer somente quando solicitado.

Mas se agora você acha que pode fazer uma boa experiência do usuário para o seu produto apenas organizando os elementos por graus de relevância, eu sinto ter que dizer que o processo não é tão simples assim.

Podemos partir do seguinte fato: Seja boa ou ruim, a UX não é feita pelo projetista. Depois de tudo que foi dito aqui, isso chega a parecer contraditório, mas calma! Deixa eu explicar.

Anteriormente, foi esclarecido que a UX se inicia quando o usuário interage com o produto ou serviço. Sendo assim, é impossível que o designer – ou qualquer outro membro da equipe – tenha controle sobre o que acontecerá. É muito difícil prever tudo que impactará na opinião do usuário e desenhar soluções, o que se faz é diminuir ao máximo os impactos negativos e enfatizar os positivos. Mas como isso é feito?

Através da criação de protótipos, um bom design de interações, estudo do negócio, desenvolvimento front-end, estratégia de conteúdo, pesquisas com usuários, testes de usabilidade, visual design, bom uso e conhecimento da arquitetura da informação, compreensão de aspectos comportamentais do público alvo e, principalmente, trabalho em equipe.

Falando em trabalho em equipe, se você é ou trabalha com programadores, talvez esse link seja útil para você. É um artigo que fala 5 Extensões do Visual Studio Code que facilitam o trabalho colaborativo.

É importante, também, lembrar que tudo que se cria visa resolver um problema. E o intuito de todo esse esforço e estudo é que as resoluções desses problemas estejam cada vez mais íntimas do usuário, ligadas ao seu psicológico e emocional, se tornando cada vez mais humanas.

Pra se aprofundar

“O design do dia a dia” – NORMAN, Don
“Information Architecture” – MORVILLE, Peter & ROSENFIELD, Louis

Ainda tem dúvidas?

Me manda um DM no Instagram.

Durante a pandemia de COVID-19 é viável desenvolver iniciativas através da internet?

Vender produtos e serviços através da internet ainda é difícil para muitas empresas. É preciso entender bastante de aspectos variados, desde a melhor forma de fazer campanhas em redes sociais e compras de anúncios, até como atender bem o cliente, remotamente. Estar preparado para a interação através da internet é importante e se torna mais valioso no momento atual em que as relações de consumo estão passando por mudanças.

Existem empresas e profissionais especialistas em auxiliar e orientar quem deseja adequar seus negócios para a realidade da internet. Especialistas em marketing podem auxiliar na comunicação. Empresas que desenvolvem software podem construir sites, plataformas e integrar bancos de dados a fim de garantir a consolidação dos dados e segurança da informação. Consultores de negócios podem guiar os empresários e envolvidos no processo de transformação digital.

O caminho a ser seguido se torna claro quando se tem suporte de especialistas, e pode gerar resultados expressivos em diversos indicadores, como por exemplo, em número de vendas e/ou audiência.

A forma de entrega para o cliente precisa mudar

Se você possui um restaurante de sucesso, com uma paisagem maravilhosa a ser contemplada, bom som ambiente e vários detalhes pensados para bem estar do cliente e para prover uma experiência inesquecível, como fará para que seu produto continue sendo comercializado? Como motivará as pessoas a consumirem os seus pratos? De alguma maneira será necessário prover aos clientes a satisfação de consumir sua comida, e, com toda a certeza, a maneira não será a mesma.

Mas, com a mesma certeza digo: sim. É possível satisfazê-los ainda que à distância, sem os atributos da experiência sensorial que o seu local proporciona.

A agilidade e feedbacks devem estar presentes

Agora é a hora dos empresários entenderem que é um momento propício para se testar coisas novas e por sinal necessárias. Começar a implementação de iniciativas que usam a internet como meio, para atingir os seus clientes, é um excelente caminho.

Em detrimento do isolamento social e necessidade de manutenção das portas fechadas, a possibilidade de se chegar até os consumidores através da internet existe há muito tempo, apenas se evidencia ainda mais, neste momento. Para isso, a presença digital pode se fazer através de táticas como construção/alimentação de site, redes sociais, estratégias de marketing bem calibradas para o público alvo, entre outras.

Como dito, os recursos estão disponíveis, e podem ser melhor utilizados com auxílio de especialista. Independente do modo de condução, é importante que os movimentos sejam ágeis, e que, não percam de vista a imprescindibilidade de que as ações sejam precedidas decisões bem pensadas e validações. Assim, imprescindível, por exemplo, se utilizar de estratégias como o MVP (produto viável mínimo), que, a propósito, pode e deve ser utilizado exaustivamente.

Nessa linha, os negócios devem desenvolver a capacidade de lançar soluções que atendam as demandas de mercado rapidamente e possam ser maturados com muitos feedbacks, que serão apresentados ou, devem ser provocados.

Tenha muita atenção aos sinais

Métricas e análises sempre são importantes em quaisquer segmentos e iniciativas e por agora não será diferente.

Produtos e serviços lançados no mercado precisam de observação minuciosa de cada indicador, cuja definição deve ser feita juntamente com os especialistas que estarão apoiando o empreendedor nesta jornada, de modo que todo sinal deve ser, além de observado, considerado importante.

É preciso entender que o negócio que passa por uma transformação digital precisa de acompanhamento, clareza do seu processo de desenvolvimento e constantes ajustes.

Hoje é o momento de transformar

Agora é sim um momento para inovar e reagir aos sinais que o mercado está apresentando.

A forma de consumo está sofrendo mudanças. As portas estão se abrindo para negócios digitais uma vez que consumidores que não possuíam o habito de comprar pela internet agora estão o fazendo. Essa nova desenvoltura do mercado consumidor, por si só, já é motivo mais que suficiente para ditar uma nova forma de se expor e vender.

Se o mercado muda, tudo muda. Portanto, é hora de se reinventar.

Para colaborar nesse processo de mudança, tornando-a mais leve, trazemos exercícios que podem clarear como entender e agir em meio às dificuldades e possibilidades.

  • Quais oportunidades surgiram em detrimento do que vem acontecendo no mundo?
  • O que minha empresa sofreu com esta mudança furtiva de comportamento da população?
  • Na internet, minha empresa existe?
  • Como posso usar a internet para potencializar meu negócio?
  • Os pontos fortes do meu produto ou serviço são evidentes também pela internet?

Provocações contidas nas perguntas acima trarão reflexões que são importantes independente do momento econômico, porque trazem à tona questões inerentes ao “empreender” na era atual. Mas, indiscutível que em tempos de Pandemia, em que o mundo sente fortes mudanças econômicas e empresarias, questionamentos como estes se apresentam quase que essenciais à sobrevivência de negócios.

5 Extensões essenciais do Visual Studio Code para Trabalho Colaborativo

Edição de texto. Redefinida.

Esse é o slogan da página inicial do Visual Studio Code. Na minha jordana, por IDE’s e editores de texto, nenhum deles mudou minha concepção ao que um ambiente completo e integrado pode ser. Seja pela imensidão de extensões disponibilizados pela comunidade e pela microsoft, seja pelo seu design compacto e robusto. O Visual Studio Code, mesmo no mercado a tão pouco tempo, 2015, conseguiu atrair uma grande quantidade de desenvolvedores que buscam por uma solução convidativa e simples.

Comentando sobre extensões, o editor não seria completo sem elas. Apresento aqui 5 extensões e mais algumas extras que podem auxiliar você ou sua equipe no dia a dia.

Live share

A ferramenta busca trazer um ambiente colaborativo em tempo real para editar ou debugar código no Visual Code. Trabalhar com um colega de classe ou de trabalho remotamente, seja em pair-programming, revisão de código ou para resolver um problema específico da empresa não é mais um problema. Você se engana se acredita que seja apenas isso, não é um simples editor remoto. Você consegue também, conversar via chat, compartilhar seu servidor e terminal local! Isso mesmo, além disso, você pode até convidar mais de uma pessoa para trabalhar coletivamente.

Apresentação do Live Share.

A extensão vem com um pacote: Live Share, Live Share Audio, Live Share Chat e o Peacock . Que em conjunto traz essa ferramenta incrível para trabalho remoto.

Git lens

Apresentação do Git Lens.

Eu sabia que estava passando tempo de mais no terminal para realizar os comandos para adicionar, ‘commitar’ e realizar o push. Foi quando percebi que precisava de uma ferramenta para automatizar esse processo, e no percurso saber mais informações do histórico dos meus commits. O Git Lens me acolheu e me deu o poder do Git Supercharged, grandes insights das alterações do código, um histórico de arquivo e linha, além de várias outras ferramentas. Com certeza, se você precisa avançar na utilização do git e precisa de mais dados sobre o progresso do seu codebase, essa é uma ferramenta essencial.

Live share whiteboard

Apresentação do Live Share Whiteboard.

Você já não entendeu algum conceito ou explicação, e seu professor ou mentor precisou sair do Visual Code para desenhar em outra ferramenta? A proposta da extensão é justamente essa, ter um ‘Quadro-Branco’ colaborativo dentro do Visual Code, exatamente. Você pode agora, desenhar modelagens de banco de dados relacionais, arquitetura de software, ou mesmo realizar uma apresentação para equipe.

Jira and bitbucket

Apresentação do Jira and Bitbucket.

O Atlassian criou sua própria extensão para o Visual Code Studio. Nela, você consegue ter acesso as Issues e Pull Request do Jira e Bitbucket. Além disso, por ela, você consegue criar suas próprias issues, pull requests, fazer revisão de código entre outras atividades.

CodeStream

A revisão de código ficou mais fácil com o CodeStream, ele permite que você adicione comentários do código de algum integrante da sua equipe e encaminhar diretamente para o Slack e Gitbucket.

Apresentação do Code Stream.

Você consegue discutir blocos de código com sua equipe, deixar perguntas ou comentários em formato de marcação.

Apresentação do Code Stream com integração com o Slack.

Menções honrozas

Todo tree

Crie tags de TODO ou FIXME no seu código para auxiliar outros(as) desenvolvedores(as) ao que precisa ser feito com Highlight.

Settings sync

Sincronize todas as configurações do seu Visual Studio Code, extensões, configuração do editor, cores, snippets, tudo que você precisa na nuvem.

Tem algum para compartilhar?

Essas são as que conheço, ferramentas que auxiliam bastante no trabalho remoto ou na produtividade do dia a dia. Se você conhece alguma, deixa um comentário abaixo ou manda um Tweet.

Ferramentas que auxiliam o trabalho remoto ou Home office

Neste post falarei sobre algumas ferramentas (grátis ou com um nível de uso gratuito que permite conhecer bem) importantes que propiciam gestão, controle e produtividade quando se é necessário trabalhar remotamente ou manter a sua equipe operando a distância, não tratarei sobre serviços específicos de uma empresa, mas sim de soluções que juntas podem criar uma suite que fará com que seja possível fazer negócios e gerir remotamente.

Resultado de imagem para google meet

O primeiro da lista é o Google Meet de propósito, além de propiciar a criação de salas de reunião virtual para até 250 participantes é muito simples, intuitivo e fluido, permite apresentação de tela, chat e pode ser utilizado em computadores através do navegador ou em celulares e tablets através de seu App.

https://gsuite.google.com.br/intl/pt-BR/products/meet/


Resultado de imagem para jitsi meet

O segundo é o Jitsi Meet, uma ótima ferramenta para video chamadas e possui funções muito parecidas com o Google Meet, porém ele possui um detalhe que pra nós brasileiros pode fazer bastante diferença quando necessário, pessoas podem acessar o meet via chamada telefonica também, quando uma sala é criada ele também disponibiliza um numero com DDI e DDD do Brasil, permitindo que pessoas que tenham sinal de celular e não possuam internet consigam participar!

https://jitsi.org/jitsi-meet/


Resultado de imagem para slack

O terceiro da lista ainda falando de comunicação é o Slack, ferramenta de comunicação por texto largamente difundida entre equipes de tecnologia por todo o mundo, possui versões para computadores, celulares, tablets e web, ferramenta fácil de usar que possui muitos artifícios que propiciam produtividade, criação de canais de debate, integrações com outras ferramentas, robôs, editores de texto rico, envio de arquivos, vale a pena conhecer.

https://slack.com/intl/pt-br/


Resultado de imagem para trello

O Trello é uma ferramenta que permite que possamos gerir projetos e tarefas, ele utiliza o paradigma Kanban que se tornou popular ao ser utilizado pela Toyota, é uma ferramenta fluida, flexível e simples de ser utilizada, nele é possível criar quadros por projeto, atribuir responsáveis, adicionar anexos e comentários, rótulos por cores, comentários, em resumo uma ferramenta simples, gratuita e poderosa para gestão.

https://trello.com/


Resultado de imagem para autentique

O Autentique é uma solução que propicia a assinatura de documentos digitalmente, com ele consigo negociar novos negócios e de forma simples enviar os contratos para que sejam revisados e assinados através da plataforma, nos proporcionou rapidez no fechamento de novos negócios, melhor gestão dos documentos (ainda mais por não precisar utilizar papel) e transparência no processo.

https://www.autentique.com.br


Resultado de imagem para tangerino

Por ultimo e não menos importante trago pra vocês o Tangerino, solução para controle de ponto através de aplicativos e internet, com ele é possível aos colaboradores da empresa realizar o registro de seus horários de trabalho, como também é permitido aos gestores realizar a gestão, com o Tangerino é possível identificar em qual local o ponto foi registrado, também é possível só permitir registro em locais e dispositivos específicos, por fim é uma boa alternativa para o relógio de ponto que fica na parede.

https://tangerino.com.br

Como trabalhar com Async / Await e entendendo Promises.

Entenda como trabalhar com Async/Await

Promises

Antes de falar sobre async / await é preciso entender Promises.

Promises JavaScriptPromise, ou Promessa, é um objeto usado para processamento assíncrono.
Uma Promise representa um valor que pode estar disponível agora, no futuro ou nunca.
Usando uma Promise, é assegurado que a API não será processada nem formatada até que a chamada da API seja bem sucedida.

Estados de uma Promise :

  • pending (pendente): Estado inicial, que não foi realizada nem rejeitada.
  • fulfilled (realizada): sucesso na operação.
  • rejected (rejeitado):  falha na operação.
  • settled (estabelecida): Que foi realizada ou rejeitada.

Função assíncrona com Promises.

const fetch = require('node-fetch')

function getPerson(id){
	fetch(`http://swapi.co/api/people/${id}`)
		.then(response => response.json())
		.then(person => console.log(person.name))
}

getPerson(1) //Luke Skywalker

NOTA:

As funções resolve e reject, quando chamadas, resolvem (em caso de sucesso)ou rejeitam (quando ocorre um erro)a promessa, respectivamente. O executor começa o trabalho assíncrono que, quando concluído, chama uma das funções resolve ou reject para definir o estado da promessa.

Referência: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise

Async

A declaração async function define uma função assíncrona, que retorna um objeto AsyncFunction, em JavaScript a função assíncrona é por definição um objeto do tipo AsyncFunction.

Para se obter melhor eficiência é recomendado que a função seja declarada com o async, ou seja, com a expression async functions chamado no código, desta forma as funções são tratadas com o resto do código, pois o mesmo sendo criado através do construtor AsyncFunction as funções são tratados na criada, perdendo eficiência.

Exemplo 1 : Declarando uma função async apartir da expression async functions.

async function newFunction("/*... Parametros */") {
    /*... Declarações ... */
}

Exemplo 2 : Declarando uma função async através do construtor de uma AsyncFuntion

let AsyncFunction = Object.getPrototypeOf(async function(){}).constructor

let newFunction = new AsyncFunction(/*Aqui é aplicado todo escopo da função, parâmetros, declarações, retorno.*/)

newFunction('/* Parâmetros */').then(v => {
  console.log(v); // imprime o resultado.
})
  • Observamos Claramente que o Exemplo 1 não só é mais prático, como é é simples e de aplicar e entendimento.

NOTA:

Uma função assíncrona pode conter uma expressão await, que pausa a execução da função assíncrona e espera pela resolução da Promise passada, e depois retorna o valor resolvido.

Referência: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/async_function

Await

O operador await é utilizado para esperar por uma Promise . Ele pode ser usado apenas dentro de um escopo async function.

A expressão await, como o próprio nome diz “Aguardando”, ou seja, enquanto o processo não obtiver retorno a função async fica em pausa, esperando o retorno da Promise, se a Promise for rejeitada a expressão await executa uma Exception com o valor da Rejeição.

Exemplo:

async function newFunction() {
	try{
		return await Promisefunction('/* parametros */')
	}catch(e){
		return e
	}
}
console.log(newFunction())

NOTA:

Se o valor não for uma Promise, ele converte o valor para uma Promise resolvida,  e espera por ele.

Referência: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/await

Exemplo 1: Escrevendo uma função assíncrona com async/await

const fetch = require('node-fetch')

function getPerson(id){
	const response = await fetch(`http://swapi.co/api/people/${id}`)
	const person = await response.json()
	console.log(person.name)
}

getPerson(1) //Luke Skywalker
  • Note que no exemplo acima existe duas expressões await, neste caso quando a primeira esta em execução a função entra em pausa aguardando o retorno da promise, assim que recebe o retorno a função sai da pausa passando para a próxima linha de execução, entrando novamente em pausa e assim poder finalizar todo o processo.

Exemplo 2: Com Arrow Function

const fetch = require('node-fetch')

function getPerson(id){
	const response = await fetch(`http://swapi.co/api/people/${id}`)
	return await response.json()
}

getPerson(1)
	.then(person => console.log(person.name) //Luke Skywalker
  • Neste exemplo temos o mesmo processo do exemplo anterior, mais desta vez utilizando Arrow functions, também podemos notar a notação do then, isto só é possível porque o retorno é uma Promise.

Exemplo 3: Utilizando Promise.all, Arrow function, Map

const fetch = require('node-fetch')
const ids = [1, 2, 3, 4, 5]
let person = []

function getPerson(id){
	const response = await fetch(`http://swapi.co/api/people/${id}`)
	const person = await response.json()	
	return person.name
}

function getData(){
	person.push(Promise.all(ids.map(item => getPerson(item)))
	return person[0]
}

async function result (){
	console.log(await getData())
}

result()
	/*[ 'Luke Skywalker',
		'C-3PO',
		'R2-D2',
		'Dart Vader',
		'LEia Organa' ] */

Para finalizar Deixo este código para Reflexão, Abraço e até o Próximo Post!

Trabalhando com map, filter e reduce

Entenda os comportamentos e funcionalidades, de forma Prática e direta.

Map

map é um método que executa um callback para cada valor de um array modificando os mesmos, isso faz com que o map crie um novo array com os novos valores obtidos.

Quando utilizar?

Quando você quer que o resultado seja um “array” com “o mesmo” tamanho do “array” inicial, porém com valores modificados (ou não).

Funciona da seguinte maneira:

  • recebe 1 elemento do array.
  • executa a função passada.
    • –adiciona esse elemento no array de resposta.

Aplicação Básica

const array = ['values'];

const arrayResp = array.map(function(value){
	//...Aqui é aplicado o Código de execução que retorna a interação para o arrayResp.
});

console.log(arrayResp);

Exemplo 1: Básico

let list = [1,2,3].map(function(value){
	return value * 2;
});

console.log(list); //[2, 4, 6]
  • Basicamente o método este percorrendo o array e fazendo a multiplicação de cada valor por 2, e a cada soma o resultado é adicionado a variável list, tendo por fim a impressão no console o array [2, 4, 6].

Exemplo 2: Com Arrow Functions

const list = [1,2,3];

let multipliedByTwo = list.map(x => x * 2);

console.log(multipliedByTwo); //[2, 4, 6]
  • Neste exemplo temos o mesmo processo do exemplo anterior, com algumas modificações e a utilização do Arrow functions, desta forma podemos ter um código mais curto (limpo) sem perder a essência.

Exemplo 3: Com Promises

const list = [1,2,3];
let multipliedByTwo = [];

const functionWithPromise = item => {
	return Promise.resolve(item * 2);
}

const anAsyncFunction = async item => {
	return await functionWithPromise(item);
}

const getData = async () => {
	multipliedByTwo.push(
		await Promise.all(
			list.map(item => anAsyncFunction(item))
		)
	);
	return multipliedByTwo[0];
}

async function result(){
	console.log(await getData());
}

result(); // [2 ,4, 6]
  • Agora Observamos um exemplo mais trabalhado, utilizando Promises, simplificando, o map é executado dentro do escopo da Promises.all, neste formato o map é completamente executado e retorna um array com os valor somados, depois é feito o “push” para o variável multipliedByTwo, ou seja, é obtido um array e aplicado dentro do outro, por este motivo o retorno da função getData esta “pegando” o item [0], imprimindo por fim o mesmo resultado dos exemplos anteriores.

NOTA:

O método map não modifica o array original. No entanto, a função callback invocada por ele pode fazê-lo.

Referência: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Filter

Como o nome já diz essa função server para filtrar elementos de um array para um novo. O filter assim como o map, e outros, também é um Functor logo não modificará nosso array original.

Quando utilizar?

Quando você quer que o resultado seja um “array” com o tamanho menor (ou não) que o “array” inicial, porém ”apenas” com valores que passaram por um teste lógico.

Funciona da seguinte maneira:

  • recebe 1 elemento do array.
  • executa a função passada.
    • –caso o retorno seja true.
      • adiciona esse elemento no array de resposta.
    • –caso o retorno seja false.
      • NÃO adiciona esse elemento no array de resposta.

Aplicação Básica

const array = ['values'];

const result = array.filter("//...Aqui é aplicado o Código de execução que retorna o resultado que for 'true' para o result.");

console.log(result);

Exemplos Simples utilizando Arrow Functions:

const list = [1, 5, 9, 8, 2, 10, 3, 4];

let greaterThanFive = list.filter(number => {return number > 5});

console.log(greaterThanFive) //[9, 8, 10]
  • No exemplo acima é aplicado o Arrow functions dentro do escopo do filter retornando apenas os números maiores que 5, criando um novo array na variável greaterThanFive.

Exemplos Simples utilizando Arrow Functions e If ternário:

const list = [1, 5, 9, 8, 2, 10, 3, 4];

let oddNumbers = list.filter(number => (number % 2 == 1 ? true : false));

console.log(oddNumbers) //[1, 5, 9, 3]
  • Neste exemplo junto com o Arrow functions, também esta aplicado o if ternário dentro do mesmo escopo do filter retornando apenas os números ímpares, criando um novo array na variável oddNumbers.

NOTA:

filter não altera o array a partir da qual foi invocado.

Referência: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro

Reduce

Método que executa uma função de redutor (que você fornece) em cada elemento da matriz, resultando em um único valor de saída.

Quando utilizar?

Quando você quer que o resultado seja um “array” (ou qualquer outro tipo existente) e seu(s) o(s) valor(es) pode(m) ser de qualquer tipo.
Ainda pode-se falar que quando precisa iterar o mesmo array usando filter e map, ao invés de fazê-lo duas vezes, o reduce, mesmo sendo mais complexo, é uma opção para isso. Dentro dele dá para em uma interação fazer o que é preciso de um filter e um map.

Funciona da seguinte maneira:

  • A função de redutor usa quatro argumentos: –
    • Acumulador (acc)
    • –Valor Atual (cur)
    • –Índice atual (idx)
    • –Matriz de Origem (src)
  • O valor retornado da sua função redutor é atribuído ao acumulador, cujo valor é lembrado em cada iteração em todo o array e, finalmente, torna-se o valor resultante final único.

Aplicação Básica

const array = ['values'];

const result = array.reduce(function(accumulator, currentValue){
	//... Aqui é aplicado o Código de execução que retorna o resultado para o result.
});

console.log(result);

Exemplos Simples utilizando Arrow Functions:

const list = [1, 2, 3, 4];

const totalSum = list.reduce((accumulator, currentValue) => {
	return accumulator + currentValue;
});

console.log(totalSum); //10
  • No exemplo acima o reduce executa a soma de todas as interações, retornando o valor a soma total na variável totalSum, explicado com mais detalhes no próximo exemplo.
const list = [1, 2, 3, 4];

const reducer = (accumulator, currentValue) => accumulator + currentValue;

console.log(list.reduce(reducer)); //10

console.log(list.reduce(reducer, 5)); //15
  • No exemplo acima foi criada a função reducer, com os parâmetros accumulator & currentValue, onde temos a aplicação da função interna do reduce, desta forma trabalhamos de uma forma mais abrangente.

    1 – Observamos que no primeiro console, passamos apenas como parâmetro a função reducer, isso porque no método reduce o seu primeiro parâmetro é um acumulador, desta forma a primeira interação apenas o acumulador é preenchido, ou seja, no reducer o parâmetro (variável) accumulator, recebe o valor inicial e fica aguardando os demais valores, do segundo em diante, “se existir“, os valores são colocados no parâmetro (variável) currentValue, somando o accumulator com o currentValue , até chegar a ultima interação, por fim imprimindo no console o valor final, neste caso “10”.

    2 – No Segundo Console observamos que diferente do primeiro são passados dois parâmetro no método reduce, como explicado no primeiro console, o método reduce tem como primeiro parâmetro um acumulador, certo, mais se o primeiro é um acumulador, como é que ele trabalha passando 2 parâmetro?, Isto se da por conta de sua estrutura original, na verdade, o reduce recebe valores implícitos, assim como no primeiro console ele recebe a função reducer, que sua estrutura são dois parâmetro, neste caso ele recebe a mesma função, executa por inteiro este primeiro parâmetro “reducer”, que o retorno se torna o acumulador e tem como valor corrente o próximo parâmetro “5”, por fim somando o acumulador com o valor corrente e imprimindo no console o resultado da soma “15”.

NOTA:

Se o valorInicial não tiver sido passado como argumento, então Acumulador
 será igual ao primeiro valor no array e valorAtual será igual ao segundo.

Referência: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

Atenção:

Todos os Três métodos, map, filter e reduce, só funciona com array, mais existem particularidades que deverão ser “SEMPRE” levadas em considerações.
1 – Garanta “SEMPRE” que será um array que chamará os métodos:

  • Se não for um array, será executado uma exceção de erro que por sua vez quebra todo o processo.

2 – O Array pode ser Vazio?

  • Para o map & filter se o array tiver vazio, os métodos retornarão um array vazio.
  • Para o reduce, se o array tiver vazio, o método executa uma exceção do erro, quebrando todo o processo, desta forma é de suma importância que ao ser utilizado o método reduce, que seja garantido que o array tenha no mínimo um Valor, ou seja, é necessário Sempre testar se o array origem não esta vazio, pois o reduce só funciona se o array origem tiver amenos um valor.

Exemplos Simples para o teste:

let list;
// ou
let list = [];

const result = Array.asArray(list) && list.length > 0 
	? list.reduce((accumulator, currentValue) => accumulator + currentValue)
	: 0
	
console.log(result) //0
  • O teste pode ser feito de várias formas, no exemplo acima, foi propositalmente aplicado um “if ternário” para garantir um valor de retorno, mais podemos apenas criar um “if” padrão executando (no caso do reduce) se for um array e não estiver vazio, para o map & filter não se faz necessário testar se esta vazio, como explicado acima.

Exemplos Utilizando emoji:

fonte: https://google.com.br/imghp

Exemplos Utilizando frutas:

Imagem relacionada
fonte: https://google.com/imghp

Exemplos com a aplicação dos três métodos em conjunto:

const products = [{ id: 1, nome: 'prod 1'},
				{ id: 1, nome: 'prod 1'},
				{ id: 1, nome: 'prod 1'}]
				  
const purchaseRequests = [{ id: 10, idProd: 1, value: 10},
						{ id: 11, idProd: 3, value: 20},
						{ id: 12, idProd: 2, value: 40},
						{ id: 13, idProd: 3, value: 30}]

let arrayResponse = {}

const reducer = (accumulator, currentValue) => accumulator = currentValue

const calculate = (array, value) => {
	array.push(value)
	
	let totalValue = array.reduce(reducer)
	
	let priceAverage = totalValue / array.length
	
	return ([`amount : ${array.length}, priceAverage : ${priceAverage}, totalValue : ${totalValue}`])
}

const result = () => {
	try{
		products.map(value => {
			let values = [];
			(purchaseRequests.filter(request => {
				request.idProd === value.id
					? arrayResponse[request.idProd] = calculate(values,request.value)
					: 0					
				})
			)
		})
		return arrayResponse
	}catch(e){
		return e
	}
}

console.log(result())

/* { '1': ['amount : 1, priceAverage: 10, totalValue : 10'],
	'2': ['amount : 1, priceAverage: 40, totalValue : 40'],
	'3': ['amount : 2, priceAverage: 25, totalValue : 50']} */

Para finalizar deixo o exemplo acima, analise, tire suas próprias conclusões e até o próximo Post!

Acessar instâncias no Compute Engine do Google Cloud Platform através do terminal do seu computador via SSH.

Neste post, você vai aprender a acessar instâncias de Compute Engine do Google Cloud Platform via SSH diretamente do teu console ou SSH Clients como o Putty por exemplo.

Acesse o Google Cloud Console através do seguinte link: https://console.cloud.google.com/?hl=pt-br.

1 – Na tela principal selecione o projeto no topo em sequência, no menu lateral acesse Compute Engine > Metadados

Selecionando projeto e opção no menu

2 – Quando carregada a lista com todas as chaves SSH existentes, clique em Editar.

3 – Crie um item na lista para a adição da chave SSH, cole a chave pública do seu computador e clique em Salvar.

Após o procedimento feito, basta acessar a instância através de seu terminal ou cliente SSH.