#aprendendo_a_programar: Conceitos Fundamentais

Seja bem-vindo à série #aprendendo_a_programar! Este é o primeiro de alguns posts destinados para quem está iniciando a jornada na programação. Nesta série, irei apresentar os conceitos fundamentais que são a base para compreender linguagens de programação e resolver problemas complexos. Vamos começar dando os primeiros passos nesse incrível universo da codificação.

Por que este passo é crucial?

Entender os princípios básicos da programação é crucial para estabelecer alicerces sólidos. Da mesma forma que os primeiros passos são essenciais para construir uma estrutura robusta, os fundamentos da programação são a chave para o desenvolvimento de habilidades sólidas nesse campo. Além de capacitar você a compreender qualquer linguagem de programação, esses conceitos são universais e fundamentais, aplicáveis em todas elas. Portanto, essa é a etapa inicial e crucial para a sua jornada na programação.

O que você aprenderá neste artigo?

A compreensão dos conceitos de Álgebra de Boole, Variáveis, Condicionais, Loops e Estruturas de Dados.

  • A Álgebra de Boole fornece a base lógica para o raciocínio em computação, permitindo a tomada de decisões e o controle do fluxo de programas.
  • As Variáveis são recipientes vitais para armazenar e manipular dados, enquanto as estruturas Condicionais controlam o comportamento do código, permitindo a execução de diferentes ações com base em condições lógicas.
  • Os Loops permitem a repetição eficiente de tarefas, economizando tempo e recursos.
  • As Estruturas de Dados é essencial para organizar informações de forma eficiente, facilitando a manipulação e o acesso aos dados.

Dominar esses conceitos proporciona os alicerces necessários para o desenvolvimento de programas robustos e funcionais, permitindo aos programadores a capacidade de resolver problemas de forma eficaz e criar aplicações complexas e inovadoras.

1. Álgebra de Boole:

A Álgebra de Boole é um ramo da matemática que trata de operações lógicas em valores binários, representados como verdadeiro ou falso (ou 1 e 0). Em Javascript, os operadores lógicos representam esses conceitos:

  • Operadores lógicos:
    • && (E): Retorna verdadeiro se ambas as condições forem verdadeiras.
    • || (OU): Retorna verdadeiro se pelo menos uma das condições for verdadeira.
    • ! (Negação): Inverte o valor lógico (true vira false e vice-versa).

Exemplo em Javascript:

let a = true;
let b = false;

console.log(a && b); // Saída: false
console.log(a || b); // Saída: true
console.log(!a); // Saída: false

2. Variáveis:

Variáveis são espaços de armazenamento que guardam dados ou valores. Em Javascript, você pode declarar variáveis usando var, let, ou const. Elas podem armazenar números, strings, booleanos, objetos, ou qualquer tipo de dado.

Exemplo em Javascript:

let mensagem = "Olá, mundo!";
console.log(mensagem); // Saída: Olá, mundo!

3. Condicionais:

As estruturas condicionais ajudam a controlar o fluxo do programa, executando diferentes blocos de código baseados em condições lógicas (verdadeiro ou falso). Em Javascript, usamos o if, else if e else para realizar ações condicionais.

Exemplo em Javascript:

let idade = 18;

if (idade >= 18) {
  console.log("Pode dirigir."); // Saída: Pode dirigir.
} else {
  console.log("Não pode dirigir.");
}

4. Loops:

Os loops permitem a repetição de um bloco de código várias vezes, enquanto uma condição específica for verdadeira. Em Javascript, os loops mais comuns são for, while, e do-while.

Exemplo em Javascript:

// Loop for
for (let i = 0; i < 5; i++) {
  console.log("Número: " + i); // Saída: Número: 0, Número: 1, ..., Número: 4
}

// Loop while
let count = 0;
while (count < 5) {
  console.log("Contagem: " + count); // Saída: Contagem: 0, Contagem: 1, ..., Contagem: 4
  count++;
}

5. Estruturas de Dados:

Em Javascript, as estruturas de dados incluem objetos, arrays e mapas. Os objetos são conjuntos de pares de chave-valor, os arrays são coleções de elementos e os mapas são coleções de pares chave-valor (introduzidos mais recentemente).

Exemplo em Javascript:

// Objeto
let pessoa = {
  nome: "João",
  idade: 25,
  cidade: "São Paulo"
};
console.log(pessoa.nome); // Saída: João

// Array
let frutas = ['Maçã', 'Banana', 'Laranja'];
console.log(frutas[1]); // Saída: Banana

Estes são exemplos básicos de como os conceitos de Álgebra de Boole, Variáveis, Condicionais, Loops e Estruturas de Dados podem ser aplicados usando Javascript. Ao dominar esses conceitos, é possível construir programas mais complexos e úteis.

Conclusão

Ao finalizar esta exploração sobre os princípios fundamentais da programação – Álgebra de Boole, Variáveis, Condicionais, Loops e Estruturas de Dados – você adquiriu uma base sólida para adentrar o universo da codificação. Com esses conceitos fundamentais, você está pronto para começar a aprender a construir programas e sistemas mais complexos. No entanto, para fortalecer e aprimorar esse conhecimento, é crucial se comprometer com a prática contínua.

Ao aplicar ativamente esses conceitos em exercícios práticos, você terá a oportunidade de consolidar e expandir suas habilidades. A prática constante é o caminho para a maestria, transformando a teoria em habilidades práticas e capacitando você a se tornar um programador habilidoso e confiante.

#aprendendo_a_programar: Como fazer da maneira correta?

No mundo da programação, muitas vezes somos seduzidos pela ideia de dominar múltiplas linguagens. No entanto, à medida que mergulhamos nesse vasto oceano de códigos e estruturas, torna-se claro que o verdadeiro poder reside na compreensão dos fundamentos e na prática consistente. Aprender a programar é muito mais do que apenas adquirir conhecimento superficial de várias linguagens; está intrinsecamente ligado à compreensão dos conceitos fundamentais e à aplicação prática desses princípios. Aqui está o porquê:

Construção de uma base sólida

Antes de mergulhar no universo diversificado das linguagens de programação, é crucial compreender os conceitos fundamentais que são universais em qualquer ambiente de codificação. A lógica, a estrutura de dados, as variáveis, os loops – esses alicerces são essenciais e formam a espinha dorsal de qualquer linguagem. Entender como os computadores funcionam, como processam informações e como executam instruções é crucial para se tornar um programador habilidoso.

Desta forma, terá capacidade de aprender qualquer linguagem que desejar, pois, os fundamentos são os mesmos, a semântica e estrutura de organização de cada uma é que muda.

Adaptabilidade e aprendizado contínuo

Dominar um conjunto diversificado de linguagens pode parecer uma vantagem, mas a realidade é que a tecnologia muda rapidamente. Linguagens vêm e vão, novas surgem, outras se tornam obsoletas. No entanto, a compreensão dos fundamentos capacita um programador a se adaptar facilmente a novas linguagens e paradigmas. A capacidade de aprender continuamente e aplicar princípios básicos a novos contextos é uma habilidade inestimável.

Resolução de problemas eficiente

A habilidade de resolver problemas é a essência da programação. Não se trata apenas de escrever código, mas sim de encontrar soluções para desafios complexos. Entender os fundamentos permite que os programadores abordem os problemas de maneira estruturada e lógica, simplificando a resolução de problemas que, de outra forma, poderiam parecer intimidantes.

Foco na prática

A prática consistente é o que realmente solidifica o conhecimento. Escrever código, enfrentar erros, depurar e otimizar são aspectos cruciais do aprendizado. A prática não se limita a apenas uma linguagem, mas abrange a aplicação dos fundamentos em situações do mundo real. Projetos práticos em diferentes domínios ajudam a internalizar e fortalecer o entendimento dos conceitos.

Proficiência sólida

Ao priorizar os fundamentos e a prática, os programadores adquirem uma proficiência sólida que transcende as barreiras das linguagens. Essa expertise os capacita a não apenas trabalhar em uma variedade de linguagens, mas também a serem capazes de aprender e adaptar-se rapidamente a novas tecnologias.

Em resumo, aprender a programar é mais do que apenas acumular conhecimento sobre várias linguagens. É sobre compreender os princípios básicos e aplicar esses fundamentos em contextos práticos. Ao fazê-lo, os programadores constroem uma base sólida para a adaptação e a inovação contínua no sempre dinâmico mundo da tecnologia.

Portanto, ao embarcar na jornada de aprendizado de programação, lembre-se de que os fundamentos e a prática são os verdadeiros pilares que sustentarão o seu desenvolvimento como um programador habilidoso e adaptável. Dominar várias linguagens certamente é valioso, mas é a compreensão dos alicerces que realmente o levará longe na arte da programação.

Guia Passo a Passo: Como Desenvolver um Aplicativo para Android

Em um mundo cada vez mais conectado por dispositivos móveis, a criação de um aplicativo para Android se tornou uma habilidade essencial. Neste guia completo, você aprenderá o processo detalhado de desenvolvimento de um aplicativo para a plataforma Android, desde o conceito inicial até o lançamento no mercado. Explore conosco as etapas críticas e obtenha dicas valiosas para criar um aplicativo de sucesso

1. Pesquisa e Planejamento

O processo de desenvolvimento de um aplicativo Android começa com uma pesquisa aprofundada do mercado e dos usuários-alvo. A SoftMakers se esforça para compreender as necessidades e preferências do público-alvo, identificando oportunidades e concorrentes no mercado.

2. Conceituação e Design

Com base na pesquisa inicial, a equipe da SoftMakers inicia o processo de conceituação do aplicativo. Isso envolve a criação de esboços, wireframes e protótipos que representam a estrutura e a navegação do aplicativo. O objetivo é garantir uma interface intuitiva e amigável para o usuário.

3. Desenvolvimento

Após a aprovação do design, a equipe de desenvolvimento da SoftMakers começa a escrever o código do aplicativo. Eles usam as melhores práticas de desenvolvimento Android para garantir que o aplicativo seja eficiente, rápido e seguro. Além disso, a equipe realiza testes regulares para identificar e corrigir erros e problemas de desempenho.

4. Testes de Usuário

O próximo passo crucial é o teste de usuário. A SoftMakers convida um grupo de usuários-alvo para experimentar o aplicativo e fornecer feedback. Isso ajuda a identificar problemas de usabilidade e aprimorar a experiência do usuário antes do lançamento oficial.

5. Refinamento e Melhoria

Com base no feedback dos testes de usuário, a equipe da SoftMakers faz ajustes e refinamentos no aplicativo. Eles se esforçam para garantir que o aplicativo atenda às expectativas dos usuários e ofereça uma experiência excepcional.

6. Lançamento

Após meses de trabalho árduo, o aplicativo está pronto para o lançamento. A SoftMakers prepara uma estratégia de lançamento abrangente, incluindo a criação de materiais de marketing, o envio para lojas de aplicativos e a divulgação nas redes sociais.

7. Suporte e Atualizações

O lançamento do aplicativo não marca o fim do trabalho da SoftMakers. A empresa continua a oferecer suporte aos usuários e a realizar atualizações regulares para manter o aplicativo relevante e seguro.

8. Feedback Contínuo

A SoftMakers valoriza o feedback contínuo dos usuários. Eles monitoram as análises dos aplicativos nas lojas e solicitam feedback dos usuários para identificar oportunidades de melhoria e novos recursos.

A criação de um aplicativo Android de sucesso vai muito além do desenvolvimento de código. Envolve pesquisa, design, testes, refinamento e um compromisso contínuo com a satisfação do usuário. A SoftMakers, especializada em UX Design, compreende a importância da experiência do usuário e segue um processo rigoroso para garantir que seus aplicativos atendam e superem as expectativas dos usuários. Se você está procurando uma empresa confiável para desenvolver seu próximo aplicativo Android com foco em UX Design, a SoftMakers é uma escolha sólida. Temos o conhecimento e a experiência necessários para transformar sua visão em realidade.

O Universo dos Aplicativos Híbridos e Hospedagem em Nuvem

No âmbito da inovação tecnológica, a SoftMakers tem desbravado caminhos únicos para oferecer soluções personalizadas e eficazes para seus clientes. Uma abordagem notável é a adoção de aplicativos móveis híbridos, que combinam a versatilidade do React Native e o poder do Node.js, aliados à hospedagem em nuvem na Google Cloud Console ou Amazon Web Services. Neste artigo, exploraremos como essa sinergia tecnológica está redefinindo o desenvolvimento de aplicativos e a entrega de conteúdo.

A Magia dos Aplicativos Móveis Híbridos

Aplicativos móveis híbridos representam uma resposta inteligente aos desafios da mobilidade. Eles unem características dos aplicativos nativos e das aplicações web, oferecendo uma experiência de usuário consistente em diversas plataformas, como iOS e Android. A SoftMakers tem abraçado essa abordagem, reconhecendo os benefícios de otimização de custos e eficiência de desenvolvimento.

React Native: A Fronteira da Interface do Usuário

O coração visual dos aplicativos móveis híbridos é moldado pelo React Native. Essa estrutura possibilita a criação de interfaces de usuário fluidas e ágeis, compartilhando uma parte substancial do código entre diferentes sistemas operacionais. Essa abordagem simplifica o processo de desenvolvimento, acelerando o tempo de lançamento e minimizando os recursos necessários.

Node.js: Potencializando o Backend

No centro do aplicativo móvel reside o Node.js, atuando como o cérebro do sistema. Ele gerencia a lógica do negócio, manipulação de dados e comunicação entre o aplicativo e o servidor. A natureza assíncrona e a capacidade de lidar com múltiplas conexões tornam o Node.js uma escolha apta para aplicações que exigem escalabilidade e desempenho consistentes.

Hospedagem na Nuvem: Uma Janela para a Escalabilidade

Os aplicativos móveis híbridos desenvolvidos pela SoftMakers encontram uma casa confiável na nuvem, garantindo disponibilidade e escalabilidade. As opções incluem a hospedagem na Google Cloud Console e Amazon Web Services (AWS), proporcionando uma infraestrutura sólida e flexível para a operação contínua dos aplicativos. Essa abordagem elimina as preocupações com capacidade e garante uma experiência de usuário fluida.

Benefícios Abundantes

Além de reduzir a complexidade do desenvolvimento, os aplicativos móveis híbridos associados à hospedagem em nuvem trazem benefícios notáveis. A capacidade de escalabilidade garante que os aplicativos possam acomodar o aumento da demanda de usuários sem interrupções. Além disso, as atualizações podem ser implantadas com facilidade, garantindo que os usuários sempre acessem o conteúdo mais recente.

Conclusão

A SoftMakers está na vanguarda da inovação, explorando a combinação de aplicativos móveis híbridos, React Native e Node.js, com hospedagem em nuvem. Essa abordagem não apenas reflete a dedicação da SoftMakers à excelência tecnológica, mas também ressalta a importância de fornecer soluções flexíveis e de alta qualidade aos clientes. A sinergia entre essas tecnologias está redefinindo a maneira como os aplicativos são desenvolvidos e entregues, impulsionando a eficiência e a escalabilidade. Para descobrir mais sobre as jornadas tecnológicas da SoftMakers, visite https://www.softmakers.com.br.

Como construir um aplicativo?

No mundo atual, a criação de aplicativos se tornou uma ferramenta essencial para empresas que buscam ampliar sua presença digital e oferecer experiências únicas aos usuários. No entanto, desenvolver um aplicativo de sucesso vai além da simples codificação. A abordagem de Design Thinking e a aplicação de princípios de UX Design desempenham papéis cruciais na criação de aplicativos que não apenas funcionam bem, mas também proporcionam experiências memoráveis. Neste artigo, exploraremos como combinar Design Thinking, UX Design e a tecnologia React Native para criar um aplicativo impactante.

Design Thinking: Começando com o Usuário em Mente

O Design Thinking é uma abordagem centrada no ser humano que coloca o usuário no centro do processo de desenvolvimento. Ele enfatiza a empatia, a definição precisa do problema, a geração de ideias, a prototipagem e a iteração contínua. Para criar um aplicativo significativo, é essencial entender as necessidades, desejos e dores dos usuários.

  1. Empatia e Definição: Inicie entrevistando e observando os potenciais usuários do seu aplicativo. Compreenda suas rotinas, desafios e objetivos. A partir disso, defina claramente o problema que o aplicativo resolverá.
  2. Ideação e Prototipagem: Envolve a geração de várias ideias para resolver o problema definido. Crie protótipos de baixa fidelidade para visualizar as soluções em ação e receber feedback dos usuários.
  3. Testes e Iterações: Teste os protótipos com os usuários e ajuste conforme o feedback. O Design Thinking incentiva a iteração constante para aprimorar o aplicativo com base nas experiências e opiniões reais dos usuários.

UX Design: Criando Experiências Memoráveis

A User Experience (UX) ou Experiência do Usuário é fundamental para o sucesso do aplicativo. Ela engloba todos os aspectos da interação do usuário com o aplicativo, desde a usabilidade até a estética.

  1. Arquitetura da Informação: Organize o aplicativo de forma lógica e intuitiva. O fluxo de navegação deve ser simples e direto, permitindo que os usuários alcancem suas metas sem esforço.
  2. Design Visual: Crie um design atraente e coerente, alinhado à identidade da marca. Use cores, tipografia e elementos visuais para transmitir a mensagem e criar uma atmosfera agradável.
  3. Usabilidade: Garanta que todas as funcionalidades sejam fáceis de entender e usar. Minimize a curva de aprendizado e evite obstáculos desnecessários para manter os usuários engajados.

React Native: Unindo Design e Tecnologia

React Native é uma biblioteca JavaScript amplamente usada para desenvolver aplicativos móveis nativos para iOS e Android. Ele permite a criação de interfaces de usuário responsivas e dinâmicas, enquanto compartilha grande parte do código entre as plataformas.

  1. Desenvolvimento Ágil: Aproveite a agilidade do desenvolvimento com React Native. As atualizações podem ser feitas rapidamente, permitindo correções e melhorias com eficiência.
  2. Componentes Reutilizáveis: Crie componentes reutilizáveis para manter a consistência do design e agilizar o desenvolvimento. Isso também garante uma experiência uniforme em todo o aplicativo.
  3. Testes Cruzados: Compartilhe lógica de negócios e componentes entre as plataformas, economizando tempo e recursos nos testes.

Criar um aplicativo de sucesso é uma combinação de tecnologia e design centrado no usuário. Ao adotar abordagens como Design Thinking e UX Design e aproveitar as vantagens do React Native, as empresas podem desenvolver aplicativos que não apenas atendam às necessidades dos usuários, mas também ofereçam experiências memoráveis e significativas. Lembre-se de que o desenvolvimento de aplicativos é um processo contínuo, com iterações constantes para se adaptar às mudanças nas preferências dos usuários e nas tendências tecnológicas.

Criando um App para Celular: Tornando Ideias em Realidade com Ajuda Especializada

Em um mundo onde todos estão usando smartphones, ter um aplicativo para Android e iOS pode ser uma maneira incrível de compartilhar suas ideias com muitas pessoas. Mas criar um aplicativo não é apenas escrever códigos complicados. Vamos descobrir como fazer isso passo a passo, de um jeito simples.

Passo 1: Como Saber se Sua Ideia é Boa?

Antes de começar a fazer qualquer coisa, você precisa ter certeza de que a sua ideia é interessante para as pessoas. É aí que entra o Design Thinking. Imagine que você quer fazer um aplicativo para ajudar as pessoas a aprender novas receitas de comida.

  1. Entenda as Pessoas: Pergunte para as pessoas o que elas gostam de cozinhar, o que é difícil na cozinha, etc. Isso ajuda a entender as necessidades delas.
  2. Descubra o Problema: Com as respostas das pessoas, você pode descobrir que muita gente quer receitas fáceis e rápidas.
  3. Tenha Ideias: Agora pense em maneiras de resolver o problema. Você pode criar um aplicativo com receitas simples e instruções claras.
  4. Teste suas Ideias: Mostre as suas ideias para amigos ou familiares. Se eles gostarem da ideia do aplicativo de receitas fáceis, você está no caminho certo!

Passo 2: Fazendo o Aplicativo Fácil de Usar

Agora que você sabe que as pessoas gostariam do seu aplicativo de receitas, é hora de pensar em como ele vai funcionar. A ideia é fazer com que as pessoas usem o seu aplicativo e se divirtam. Isso é chamado de Experiência do Usuário (UX).

  1. Desenho Bonito e Prático: Imagine como o seu aplicativo vai parecer. Escolha cores bonitas e organize as receitas de forma clara para que as pessoas possam encontrá-las facilmente.
  2. Botões e Coisas para Clicar: Pense em como as pessoas vão navegar pelo aplicativo. É importante que elas saibam onde clicar para ver as receitas, por exemplo.
  3. Facilidade de Uso: O aplicativo precisa ser fácil de usar, mesmo para quem não é muito bom com tecnologia. Se as pessoas não conseguirem entender como usar, elas vão desistir.
  4. Teste e Melhore: Peça para algumas pessoas usarem o aplicativo e veja se elas conseguem achar as receitas e entender as instruções. Com base no feedback delas, faça ajustes para deixar o aplicativo ainda melhor.

Passo 3: Conte com a Ajuda da SoftMakers!

A parte mais técnica de criar um aplicativo pode ser complicada, mas você não precisa fazer tudo sozinho. A SoftMakers é uma empresa que sabe muito sobre como fazer aplicativos para Android e iOS.

Eles têm ajudado muitas pessoas a transformar suas ideias em aplicativos de verdade. E o mais legal é que eles usam o Design Thinking e sabem fazer a Experiência do Usuário ser incrível! Já fizeram vários aplicativos legais que deram certo.

Criar um aplicativo para Android e iOS pode parecer difícil, mas com um pouco de planejamento e ajuda especializada, você pode fazer isso acontecer. Comece entendendo o que as pessoas gostariam, faça um aplicativo fácil de usar e, se precisar de ajuda, a SoftMakers é uma ótima escolha. Com um toque de Design Thinking e uma experiência incrível para os usuários, eles podem te ajudar a criar um aplicativo que as pessoas vão adorar usar!

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!!!

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.

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!