Integrar Ramificações entre dois ou mais Projetos do GIT.

Quando estamos desenvolvendo nos deparamos com diversos problemas, e esta é a parte onde evoluímos, nem sempre sabemos o que realmente deve ser feito, nem quando temos a necessidade de migrar um projeto para outro, então, chegamos no real objetivo deste POST.

Vejamos como exemplo os seguinte projetos:

Projeto A:

Projeto B:

Projeto C:

Estória:

Os Projetos tem a mesma finalidade, mas são de clientes diferentes, houve necessidade de pegar a ramificação (brach) ‘hml’ do projeto A e colocar no projeto C, e depois pegar a ramificação (branch) ‘new-feature’ do projeto B e colocar no projeto C.
Para isto vamos utilizar o terminal e os comandos que o GIT nos forneçe.

Para iniciar-mos vamos abrir o terminal e aponta-lo para o diretório referente ao projeto C:

Suponha-se que a branch master do projeto C é a atualizada, então vamos criar uma branch a partir dela chamada sync-from-projects

Agora vamos criar a ramificação que precisamos do projeto A…

Antes, vamos entender:

Existem duas formas de criar a, ou, as ramificações:

1º Formato:git remote add [-f] <nome-do-ramo> <url>

A expressão git remote add, como a própria expressão indica, é o comando de adição remota do git.
A expressão [ -f ] significa ‘fetch’, no caso em específico é utilizado para indicar todas as ramificações existente do projeto A para serem adicionadas ao projeto C.
O <nome-do-ramo> é o nome que deseja nomear as ramificações, nome que será a identificação das branches do projeto A no projeto C.
Por último temos a <url> que nada mais é que a url do repositório git, no caso em específico, a url do repositório do projeto A.

Exemplo:

Cuidados a serem tomados:

  • Por exemplo, se o projeto A tivesse 100 ramificações teria sido criado 100 ramificações remotas, uma para cada, no projeto C.
  • Se por acaso uma ramificação tenha sido criada remotamente e você deseja retira-la do projeto C, “ESQUEÇA”, quando o processo anterior é executado, ele só pode ser desfeito por completo, e não por parte. Se por acaso uma ramificação criada no processo for deletada do projeto C, a branch original referente a ramificação será deletada do repositório original, no nosso caso, por exemplo, se por acaso a ramificação develop -> project-a/develop , for deletada do projeto C, a branch referente a mesma será deletada do projeto A.
  • Caso seja preciso desfazer o processo anterior, deve ser utilizado o comando: git remote rm <nome-do-ramo>
    Exemplo: git remote rm project-a

NOTA:
Observem que desta forma todo o processo anterior é desfeito, sendo retirada com segurança todas as ramificações criadas no projeto C sem haver nenhum dano ao projeto A.

2º Formato: “git remote add [-t] <nome-da-branch> <nome-do-ramo> <url>

A expressão [ -t ] da o significado para a branch.
A expressão <nome-da-branch> significa a branch que deseja ramificar, no nosso caso, será a branch hml do projeto A.

Para o nosso exemplo temos que utilizar uma relação entre os dois formatos.
Exemplo: git remote add -f -t hml projeto-a https://admin@bitbucket.org/projeto/project-a.git

Desta forma estaremos criando apenas uma ramificação remota no projeto C, referente a branch hml do projeto A.

Feito este processo, agora vamos fundir os projetos:


Para poder fundir a ramificação project-a/hml a branch sync-from-projects, vamos utilizar o camando: git merge <nome-do-ramo>/<nome-da-branch>

O Processo foi finalizado com sucesso, mas deve-se notar que normalmente ao fazer este processo, ‘Conflitos’ existiram, e devem ser corrigidos.

Agora basta fazer o mesmo processo para criar uma ramificação da branch ‘new-feature’ do projeto B para o projeto C.

NOTA:
Neste Caso, as branches estavam atualizadas, por isso não houve ocorrências.

Conclusão

Para se fundir dois ou mais projetos, basta ter 3 coisas importantes:

  • CUIDADO
  • PACIÊNCIA
  • MUITO CAFÉ

Espero que tenham gostado e até o próximo Post!!!

Construindo um MVP e validando soluções durante a pandemia

Qualquer que seja a ideia, precisa ser testada, validada e antes de totalmente desenvolvida, se faz necessário verificar a existência do problema que ela pretender resolver, para isto, uma pergunta bem pertinente é: “O problema que eu tenho ou penso realmente existe?”, obtendo resposta positiva para esta pergunta, podemos pensar em como evoluir com o desenvolvimento da solução, caso contrário, corremos o risco de criar algo que não será utilizado, muito menos pagarão pela sua utilização. A solução para um problema deve ser proposta com o minimo de esforço, com o intuito de identificar sua efetividade, amenizando riscos e desperdícios. Após validada a solução é sim prudente investir no desenvolvimento, mostrarei neste artigo com fiz isto durante a pandemia da COVID-19.

Falarei sobre todo o processo neste artigo, desde a ideia até a verificação dos indicadores que nos responderam que a solução resolvia um problema existente, como também, teria adesão.

Identificando a necessidade

Precisávamos colaborar no enfrentamento da COVID-19 e na resolução dos problemas que ela tem gerado na economia, com nossas expertises. Uma iniciativa nossa foi o projeto “Tenho Máscara” (https://www.tenhomascara.com.br/).

O objetivo do “Tenho Máscara” é catalogar fabricantes de máscaras e permitir para os que desejam comprar (pessoas, empresas e/ou governos) a possibilidade de obter o contato através da internet e negociar diretamente com o fabricante e/ou vendedor.

Tomando decisões a partir de métricas

Acompanhando as orientações da Organização Mundial de Saúde e do Ministério da Saúde do Brasil, falando para a população que o uso das máscaras ajudam na prevenção da disseminação do vírus e lendo as notícias pensei: “Será que os fabricantes que conseguem produzir máscaras estão vendo esta possibilidade?”, eu literalmente precisava de respostas. Transformei o meu pensamento em três perguntas, pois precisava validar se o problema existe, abaixo vou mostrar como validei minha ideia.

1ª pergunta: “Pessoas e/ou empresas estão fabricando máscaras para vender ou doar?”

Entrei em contato com máximo de empresários e associações que pude, a maioria disse estar produzindo ou se adequando para suprir a esta demanda que julgavam ser emergente no mercado, das 20 empresas que havia falado até então, 14 responderam positivamente a minha pergunta. Meu ultimo contato foi com a CDL de Santa Cruz do Capibaribe, a entidade me informou que 96 pessoas ou empresas de vários portes estavam produzindo, ou seja, corroborando com as respostas que eu já havia obtido, obtive um enorme “sim”, de posse dos dados dei por finalizada a pesquisa.

2ª pergunta: “Expor seus contatos na internet faz sentido para quem está produzindo?”

Criamos uma Landing page para o projeto agora denominado “Tenho Máscara”, foi concebida uma estratégia de marketing focada na divulgação para o máximo de pessoas ou empresas que tinham capacidade de produzir. A página possui a unica e exclusiva função de receber os cadastros, com isto, estávamos medindo a “Quantidade de cadastros realizados por dia”, estes números nos mostraria se as pessoas ou empresas estavam querendo se expor na internet para vender as máscaras.

Como se pode ver nos gráficos abaixo, na primeira semana 1045 pessoas visitaram a página, 261 se cadastraram para serem incluídos na base de dados.

Quantidade de acessos na página
Quantidade de cadastros através da página

Quando confrontamos estes números com a quantidade de possíveis fabricantes, para o publico que acessou a página definimos então que sim, expor na internet é um objetivo dos fabricantes e vendedores.

3ª pergunta: “Na internet pessoas estão buscando fornecedores para comprar máscaras?”

A ultima pergunta que eu precisava responder, não validava se os ofertantes adeririam a nossa solução, isto as perguntas anteriores já respondiam, mas sim, se existe a procura das mascaras na internet, afinal de contas, nossa solução está disponível nela, sendo respondida positivamente, mostrava que realmente existe a demanda. Recorremos ao Google Trends para confirmar se as pessoas estão buscado as máscaras na internet, mais uma vez a resposta foi muito conclusiva e positiva, observe os gráficos abaixo.

Pequisas pelo termo “máscara” tem crescido exponencialmente desde o fim de 2019 até então.
As 5 consultas mais buscadas demonstram que as pessoas estão interessadas nas máscaras de tecido, N95 e descartáveis, nos fazendo entender que a demanda pelo produto realmente existe e a internet é um meio pelo qual buscas massivas estão ocorrendo.

Você precisa definir a “Única Métrica que Importa”

Única Métrica que Importa (UMI em português, ou OMTM, Only Metric That Matters, em inglês), na prática nos faz definir através de uma única métrica a efetividade da nossa proposta de solução, no caso do “Tenho Máscara” a UMI foi: “Quantas pessoas e empresas desejam vender máscaras através da internet?“, descobrimos quantas e onde, como também conseguimos medir a evolução da adesão na plataforma.

Quando conseguimos respostas positivas para a primeira e segunda pergunta do tópico “Tomando decisões a partir de métricas“, estávamos validando o problema e a solução. Neste exato momento, o “Tenho Máscara” está em processo de evolução, lançamos o MVP (Cadastro e página para buscar os fabricantes) em 3 dias, recebemos feedbacks e estamos evoluindo a plataforma para entregar da melhor forma o valor que o projeto propõe.

Meu objetivo é melhorar negócios

Falei sobre todo o processo desde o surgimento da ideia até a solução, conseguimos realizar tudo isto em 3 dias, fico a disposição para receber suas dúvidas ou sugestões se desejar conversar sobre o assunto, como uma empresa de tecnologia, temos a possibilidade de propor uma solução escalável e adequada para variados problemas.

Carta aos empreenderores: Auxiliando negócios que precisam vender através da internet

Todo negócio pode, total ou parcialmente comercializar seus produtos e serviços através da internet, a forma de fazer negócios tem sofrido mudanças, modelos novos de negócios tem surgido e se demonstrado necessários para o dia a dia das cidades. Iniciativas espetaculares e inovadoras trouxeram um novo olhar sobre a forma com que nos locomovemos, comemos, moramos ou vestimos, setores de nossas vidas que parecem possuir pouca possibilidade de reinvenção. Dando sentido no mundo dos negócios para a palavra “disrupção”, pessoas e empresas estão mostrando como é possível fazer melhor tudo o que fazíamos ou fazemos, após termos contato com melhores formas de falar ao telefone ou nos locomovermos por exemplo, isto se torna o novo “normal”, mudando então a forma de vivermos.

Como empreendedores, temos contato ou possuímos plataformas, sistemas, serviços, iniciativas ou ideias que podem auxiliar nossos parceiros e clientes a se adequarem as mudanças que o mercado tem sofrido, mudanças estas que serão severas desde a forma de consumo até o “marketshare” que cada um possui. Olhemos ao redor e analisemos como poderemos unir necessidades com soluções.

É natural considerarmos óbvio para pessoas e empresas que conhecem seu negócio, publico e produto, a tomada de certas atitudes, como assinar uma plataforma de e-commerce, cadastrar seu restaurante numa plataforma de venda de comida online, usar o Instagram para expor seus produtos e permitir a interação com seu publico, porém os dias estão conturbados por vários motivos e a preocupação com problemas que surgiram agora podem deixar pessoas atordoadas ao ponto de não conseguir refletir com clareza, porém vamos nos unir para trazer luz para o outro e assim nos tornarmos juntos mais fortes.

Nos próximos dias estaremos criando conteúdo e trabalhando para unir problemas e soluções.

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.