Exercício fácil: Recursão em Arrays

A recursão é uma metodologia de resolução de problemas que consiste em dividir o problema maior em subproblemas menores, até chegar em um problema pequeno o suficiente para que ele seja resolvido de forma trivial. Uma função recursiva chama a si mesma para resolver o problema proposto. As funções recursivas são soluções inteligentes e elegantes para problemas complexos. As funções recursivas devem ter um caso básico, devem mudar o seu estado e se aproximar do caso básico e devem chamar a si mesmas (recursivamente).

Fonte: https://panda.ime.usp.br/pensepy/static/pensepy/12-Recursao/recursionsimple-ptbr.html

Exercício:

No nosso exercício, teremos um caso base que deverá informar à nossa função que ela não precisará mais ser chamada. Isto significa que é um caso simples em que o valor de retorno já será conhecido. Também haverá uma chamada recursiva que executará a função com diferentes argumentos.

Você deverá criar uma função chamada contarDecrescente. Essa nossa função recursiva deverá receber um parâmetro (n). Caso esse parâmetro seja um número menor que 1, deverá retornar um array vazio. Caso atenda o requisito, crie uma constante chamada arrayDecrescente que recebe a função recursiva. Por exemplo, se o valor indicado no parâmetro for 5, o array retornado será: [5, 4, 3, 2, 1].

Não utilize laços de repetição para realizar este exercício.

Faça o download da solução aqui:

[download id=”4050″]

Versão React v17.0: Atualização sem novos recursos

Depois do silêncio, o React anunciou o primeiro candidato a lançamento do React v17. O que chama a atenção neste lançamento é a parte considerada como central de qualquer lançamento relacionado ao desenvolvimento: Os novos recursos! Na versão 17, não há novos recursos, mas sim uma ideia de facilitar o processo de migração de uma versão anterior para uma nova. Os desenvolvedores poderão atualizar os seus aplicativos gradualmente ou de uma vez, pois as novas alterações introduzidas nos mecanismos de delegação de eventos permitem a coexistência de diferentes versões de React na mesma aplicação. Ou seja, o foco principal é a atualização do próprio React!

Updates graduais:

Algumas mudanças de API, como descontinuar uma API legado, são impossíveis de fazer de forma automatizada. Mesmo sendo pouco utilizadas, ainda há suporte para elas no React. O React 17 vem com a permissão de atualizações graduais, embora seja possível usar duas versões do React, isso causava problemas com eventos. Mas no React 17 em diantes, você terá mais opções, como atualizar todo o aplicativo de uma vez, mas também tendo a opção de atualizar seu aplicativo por partes.

Isso não quer dizer que será necessário fazer atualizações graduais do sistema. Para a maioria, atualizar tudo de uma só vez é a melhor ideia. Carregar duas versões do React não e a melhor solução. Para que possam ocorrer essas atualizações graduais, terá mudanças no sistema de eventos do React,

Mudanças de Eventos:

Nos componentes React, você geralmente escrevia os manipuladores de eventos embutidos:

<button onClick={eventoClick}>

E o seu equivalente no JavaScript seria:

meuBotao.addEventListener("click", eventoClick);

Para a maioria dos eventos, o React não anexa aos Nodes do DOM em que você declara. Em vez disso, anexa um manipulador de evento direto no nó document. Isso é chamado de delegação de evento.

Quando um evento DOM é disparado no documento, o React descobre qual componente deve ser chamado e “borbulha” para cima através de seus componentes.

Se você tiver várias versões do React na página, elas registram manipuladores de eventos na parte superior. Isso gera uma quebra e.stopPropagation(). Mesmo sendo interrompida a propagação de evento, a árvore externa ainda o receberia. É por isso que será alterada no React 17: Não haverá anexo de manipuladores de eventos no nível document. Então, ele os anexará ao contêiner DOM no qual o React é renderizado:

const noRoot = document.getElementById('root');
ReactDOM.render(<App />, noRoot);

Você pode conferir mais detalhes da atualização diretamente no site do React.

Gostou desta notícia? Comente abaixo!

Referências:

Uma nova fase para o Angular

Com as constantes evoluções do framework, equipe e forte conexão com a comunidade angular, o projeto pretende compartilhar mais sobre o trabalho e futuros projetos considerados. Será adicionada uma página no angular.io com o roadmap, que será mantida em andamento pelo menos trimestralmente.

E o que é o roadmap?

O Angular recebe uma grande variedade de solicitações de recursos, tanto de dentro do Google quanto da comunidade. A lista de projetos contém tarefas de manutenção, refatoração de código, melhorias de desempenho e outras melhorias. Eles reúnem representantes de relações com desenvolvedores, gerenciamento de produtos e engenharia para priorizar a lista. Conforme novos projetos entram na fila, ocorre um posicionamento com base na prioridade relativa de outros projetos. Você pode verificar neste link quais são os projetos que serão lançados em atualizações futuras.

O Roadmap:

Você pode encontrar os projetos do backlog que já estão em andamento e também os que trabalharemos em breve.Os trabalhos serão executados conforme a lista de prioridades. Para maior transparência, foram inclusos trabalhos que afetam o próprio desenvolvimento do angular e projetos que se aplicam apenas ao desenvolvimento interno do Google.

O documento foi dividido em duas seções que representam todos os projetos em andamento em uma seção e, na outra, os projetos futuros. Você pode esperar que o trabalho chegue em versões futuras, dependendo de quando forem concluídos e de seu impacto na API pública do Angular. Como o projeto segue um controle de versão semântico, os novos recursos chegarão em versões menores ou maiores e com alterações que podem ser incompatíveis com versões anteriores na versão principal.

O que é controle de versão semântico?

Com a curva de crescimento de um software, novas dependências, novos pacotes irão ser integrados ao software. Se as especificações das dependências forem rígidas, pode ocorrer o bloqueio de versão. Se forem especificadas vagamente, você terá uma promiscuidade da versão. Como solução, cria-se um conjunto de regras e requisitos que ditam como os números de versões são atribuídos e incrementados. Para mais informações, acesse: https://semver.org/

Gostou desta notícia? Comente abaixo!

Referências:

O método Call

Neste artigo falaremos mais sobre o método call() que nos permite reaproveitar métodos em contextos (this) diferentes. No artigo tentarei explicar as coisas com a menor complexidade possível e resumirei alguns itens, então para aquele que sabem bem JavaScript por favor calma ai… rsrsrsr

Primeiro vamos entender mais sobre a chamada em si. É importante saber que ela:

  • É nativa, não precisa chamar biblioteca, framework, etc…
  • É um método das funções. Sim, se você ainda não sabia as funções são um tipo de dado que possui métodos/funções próprias;
    • Se ficou confuso, aguarde o exemplo.
  • Recebe um parâmetro que informa o seu contexto onde estarão os dados a executar;
    • Nesse caso contexto é uma função, objeto ou até o window se você estiver procurando pelo em ovo.
  • Pode receber mais parâmetros depois do this. Estes parâmetros se referem qualquer outro valor que você queira enviar para a função;

Note que eu estou usando as palavras função e método de forma alternada. Isso é porque eles são a mesma e tem mais diferença entre function e arrow function do que eles. 🙂

Exemplo básico

// Se chamar essa função do jeito que está aqui, vai exibir undefined pois this.umLocal não tem um valor atribuido a ele.
function ola(){
    console.log(`Olá ${this.umLocal}`);
}

// Agora vamos criar um objeto mais simples possível com a variavel umLocal
const teste = {
    umLocal : "MundoJS"
}

//Lembra quando eu disse que o call é um método das funções? Olhá só…
ola.call(teste);

Se você executar o código acima verá que ele exibirá Olá MundoJS no console. Vejamos o que aconteceu então:

  1. Criamos uma função chamada ola().
  2. Essa função exibe algo no console e chama o this.umLocal
  3. Sem fazer a chamada call() a função olha dentro de seu contexto (o this dela), não acha nada e exibe a mesma coisa
  4. Criamos um objeto com uma variável.
    1. Note que não precisamos dizer que é no contexto do objeto, mas está lá
  5. Invocamos o método call() da função ola passando o “teste” como novo contexto.
  6. Ao tentar executar a função, desta vez ela olha no teste e encontra a variável para usá-la no console.log()

Vejamos então mais alguns exemplos

1 – Passando os parâmetros da função:

// Desta vez ola recebe um parâmetro chamado saudacao
function ola(saudacao){
// aviso: se colocar this.saudacao ele não vai achar no call()…
// a explicação do porque sai bastante do artigo, mas se você entender bem de “this” e functions já deve ter se ligado. Caso queira saber mais, prende um comentário pedindo um tutorial sobre this
    console.log(`${saudacao} ${this.umLocal}`);
}

const teste = {
    umLocal : "Universo"
}
// O primeirpo parâmetro do call sempre é o “this”, depois disso você pode chamar todos os parâmetros da própria função.
ola.call(teste, "Olá");

2 – Usando métodos de Arrays em objetos que são listas mas não vetores.

Com o ES6 vieram diversos métodos muito uteis como o filter, forEach,reduce, etc… dai você tenta usar ele em uma lista que não é um vetor/array [] e não da certo pois eles não possuem isso.

// Erro pois é um HTMLCollection
document.getElementsByTagName("p").forEach(x => console.log(x));

// Vamos criar um objeto parecido com um vetor
let arrayLike = {
  0: "Olá",
  1: "MundoJS",
  length: 2
};

// e uma função para ser chamada no reduce()
function juntar(acc, cur){
    acc = `${acc} ${cur}`;
}

// Erro
// Motivo: O seu objeto parece um array (possui indices e length) mas não é um vetor e por isso não tem o método reduce nele
arrayLike.reduce(juntar);

// Agora se chamarmos o reduce e passarmos forçarmos ele a aceitar nosso objeto como o contextosArray.prototype.reduce.call(arrayLike, juntar);

Isso ai então pessoal, espero que o artigo ajude a matar algumas duvidas sobre o call e qualquer coisa perguntem aqui nos cometários. Até mais.

Exercício fácil: Parâmetros em Arrow Function

Explicação:

Uma Arrow Function é uma expressão de função. Foi introduzida no ES6 (que trouxe novas features, incluindo essa nova forma de criar funções, utilizando o =>)

Uma Arrow Function possui uma sintaxe curta e possuem alguns benefícios, por exemplo:

  • O this é definido à partir das funções onde foram definidas, tornando desnecessário o bind();
  • São menos verbosas que as maneiras anteriores de expressar funções.

As Arrow Functions não podem ser usadas como funções construtoras, pois não se pode aplicar o operador new a elas.

Vamos ao Exercício:

Exercício 1:

Declare uma função comum, utilizando uma declaração ou expressão de função. Essa nossa função deverá possuir dois parâmetros (name, lastName). A nossa função deve mostrar no console a seguinte frase: “Olá name lastName, eu sou uma função!”.

Realizada esta parte do exercício, você deverá:

Replicar o exercício anterior, utilizando Arrow Function. Utilize os mesmos parâmetros e retorne no console a mesma frase.

Exercício 2:

Agora, no exercício dois, criaremos uma função chamada descobreDiametro, onde receberemos um parâmetro chamado raio e um parâmetro chamado diametro. Dentro da função, retornaremos o resultado do seu diâmetro.

Realizada a primeira parte do exercício, replique o exercício 2 utilizando Arrow Function.

Não esqueça de mostrar o resultado no console!

Gostou deste exercício? Comente os seus resultados abaixo!

A diferença entre funções regulares e arrow functions:

A Arrow function é um recurso que foi introduzido no ES6. É uma maneira mais concisa de escrever expressões de função e funciona de maneira semelhante às funções regulares, mas com certas diferenças.

let somar = function(n1, n2){
    return n1 + n2;
}

// Utilizando arrow functions =>

let somar = (n1, n2) => { return n1 + n2 };

O arrow function permite ao desenvolvedor alcançar o mesmo resultado simplificando o seu código. Os colchetes se tornam desnecessários se apenas uma expressão seja realizada:

let somar = (n1, n2) => n1 + n2;

Se houver apenas um argumento na função, os parênteses tornam-se desnecessários:

let multiplicaQuadrado = x =:> x * x;

E, caso não existam argumentos:

let dizerOla = _ => console.log("Olá");

As arrow functions têm acesso ao objeto de argumentos da função pai regular mais próxima. Os parâmetros nomeados e restantes são muito utilizados para capturar argumentos passados para arrow functions:

// Em uma função regular
let minhaFuncao = {
    mostrarArgumentos(){
        console.log(argumentos);
    }
};
minhaFuncao.mostrarArgumentos(1, 2, 3, 4);

// Utilizando arrow functions:
let minhaFuncao = {
    mostrarArgumentos: () => {
        console.log(...argumentos);
    }
};
minhaFuncao.mostrarArgumentos(1, 2, 3, 4);

// Argumento is not defined

As funções de seta não tem as suas próprias THIS, sendo o contrário de uma expressão regular. O valor de this dentro de um arrow está sempre ligado ao valor de this na função pai regular que seja mais próxima.

let pessoa = {
    nome: "Fulano Ciclano",
    thisArrow: () => {
        console.log("O nome é: " + this.nome); // Não há binding para this aqui
    },
    thisRegular(){
        console.log("O nome é: " + this.nome); // O bind vai funcionar aqui
    }
};

pessoa.thisArrow();
pessoa.thisRegular();

/* Saída */
//Meu nome é
//Meu nome é Fulano Ciclano

As funções regulares criadas utilizando declarações ou expressões de função são construtivas. Como elas são funções construtoras, elas podem ser invocadas utilizando a palavra-chave new.

As arrow functions  não são construtivas, então, não podem ser chamadas utilizando a palavra-chave new:

let soma = (n1, n2) => console.log(n1 + n2);

new soma(2, 3);

/* Saída */
// soma is not a constructor

As funções de seta também não podem ter parâmetros nomeados duplicados, seja no modo estrito ou não. Isso significa que:

// Isso aqui é válido
function somar(x, x){
    //...Seu código aqui
}

Mas ao utilizar o modo estrito, não é válido:

'use strict'
function somar(x, x) {} 
// SyntaxError: duplicate formal argument x

Com as arrow functions, os argumentos duplicados serão sempre inválidos, independente de estar ou não em modo estrito:

(x, x) => {}
// SyntaxError: duplicate argument names not allowed in this context

Referência: https://medium.com/better-programming/difference-between-regular-functions-and-arrow-functions-f65639aba256

Gostou deste artigo? Comente abaixo e mostre para seus amigos!

Dicas de segurança para código JavaScript

Com a alta dos crimes cibernéticos, é extremamente importante utilizar os recursos de segurança ao nosso favor. Como desenvolvedores de software e aplicações, precisamos seguir, no mínimo, algumas das melhores práticas para poder mitigar os ataques e possivelmente evitá-los. Então, aí vão algumas dicas de como tornar o seu código mais seguro:

Confiança

Cuidado ao confiar dados à terceiros. Ao escrever código para Web, não confie em ninguém. Você pode ter uma arquitetura de validação em vigor a seu favor. Com dados provenientes do seus servidores, ou dos usuários, é muito importante sempre validar os dados antes dos mesmos entrarem no seu aplicativo. Com formulários na web, corremos o risco de termos brechas para SQL Injections, Cross-Site Scripting (XSS) e outros problemas relacionados. Por isso, é importante a existência de validação de dados.

Minimize o seu código

Existem coisas muito utilizadas por pessoas más-intencionadas: as ferramentas do navegador. Lá, eles podem ter acesso ao código JavaScript, podendo entendê-lo e utilizar as brechas de segurança para prejudicar sua aplicação.

Sempre tente minimizar e ofuscar o seu código, removendo caracteres desnecessários e modificando seu código para dificultar e legibilidade de terceiros. Você pode utilizar ferramentas para redução do seu código e também, para ofuscá-lo.

Linting:

O JavaScript é dinâmico e flexível. Isso torna-o muito suscetível a introdução de erros. O Linting é um processo de análise de código, que retorna para você alguns “erros” que pareçam suspeitos.

Utilize o strict

Se você não utilizar o modo estrito(strict), as ferramentas de linting logo o alertarão. O modo use strict adiciona algumas exceções ao seu código, não permitindo realizar algumas ações denominadas inseguras, como acessar objetos globais declarados. O modo estrito garante que o seu código seja bem pensado e consequentemente, mais seguro.

Simplicidade

Se esforce para manter sua aplicação simples. Seu design, a arquitetura do seu software, seu código. Quanto mais complexo, maior a possibilidade de vulnerabilidades e mais fácil ele pode vir a ser alvo de invasores. Sempre utilize os guias de estilo e melhores práticas de codificação.

Concluindo

Estes são alguns passos eficazes e simples de como você pode tornar o seu aplicativo menos vulnerável à ataques de invasores. Utilize as dicas e implemente-as na sua aplicação.

Referências:https://ngninja.com/posts/secure-coding-javascript

Gostou deste artigo? Comente abaixo:

Como se sair bem nas entrevistas de emprego?

Os profissionais da área de TI sofrem bastante dificuldades na hora das entrevistas de emprego. Se você está buscando sua primeira ou décima colocação no mercado de trabalho, você passará por entrevistas que as vezes o deixarão um pouco inseguro. Pensando nisso, coloquei abaixo um pequeno resumo que espero que te coloque no caminho ao sucesso.

O que o recrutador procura?

Antes de mais nada, precisamos compreender que embora as vagas no mercado de trabalho sejam as mais variadas possíveis, a grande maioria das entrevistas de emprego respondem a duas perguntas básicas:

  • O candidato tem as qualificações técnicas para a função?
  • O candidato tem o perfil que esperamos para a função?

Sabendo disso, precisamos nos preparar para responder a estas perguntas de uma maneira que sejamos claros e objetivos, passando credibilidade e confiança para os recrutadores. Conseguimos isso através de análise e treino. Pense o que responderia para as questões mais comuns nas entrevistas, buscando por uma resposta que traga à tona o melhor que tens a entregar do seu profissional e perfil pessoal.

Quais perguntas são mais comuns em uma entrevista?

Abaixo algumas das perguntas mais utilizadas em entrevistas (nosso ebook contém uma lista com mais de 30 exemplos):

  • Quais são os seus pontos fortes?
  • Quais são os seus pontos fracos?
  • Onde você se vê em 5 anos? (ou em 10 anos)
  • O que só você pode nos oferecer?
  • Qual a realização profissional que você mais se orgulha?
  • Quem são nossos concorrentes?
  • O que te motiva?
  • Quais eram os pontos fortes e fracos do seu último chefe?

O que todas estas perguntas têm em comum? Todas elas possuem um questionamento oculto que se bem respondido te darão uma vantagem bastante considerável frente aos seus concorrentes.

Apesar destas perguntas não terem cunho técnico ela são o padrão adotado pelo recrutador. Ele poderá também lhe perguntar sobre as tecnologias que você trabalha ou será o responsável por lhe encaminhar (ou não) para o entrevistador técnico. Então é muito importante que você esteja preparado!

Aprenda no Ebook Guia do Emprego Novo, como se preparar para os processos seletivos conhecendo o que se passa pela cabeça dos recrutadores. Adquira agora com pelo link: Guia do Emprego Novo e use o cupom MUNDOJS para ter 40% de desconto.

Como apresentar seus pontos fortes em uma entrevista de emprego

Uma coisa que nunca ensinam o profissional de TI é como se apresentar bem para uma entrevista de emprego. Apesar desta falta de prática acontecer de forma generalizada, para quem tem um trabalho altamente especializado o fato de não conseguir falar quais são suas habilidades chaves pode custar um emprego, uma promoção ou uma ótima oportunidade.

O que falar aos recrutadores?

Durante uma entrevista é importante que você consiga mostrar aos recrutadores o que você tem de melhor. Faça isso utilizando frases breves e contundentes. Utilize palavras chaves e realizações que tem em sua trajetória profissional.
Isso com certeza vai te ajudar a se diferenciar da maioria dos candidatos durante todo processo seletivo. Forme frases utilizando palavras-chave e realizações de acordo com os exemplos abaixo:

Palavras-chave:

  • Dinâmico
  • Busca resultados
  • Criativo
  • Produtivo
  • Motivado
  • Decisivo
  • Receptivo
  • Resiliente
  • Responsável
  • Persistente
  • Adaptável
  • Organizado
  • Solucionador de problemas
  • Etc.

Parece simples? E realmente é, mas você precisa estar com as respostas na ponta da língua para impressionar a pessoa do outro lado.

Agora veja abaixo uma forma bem eficiente de colocar e expressar a importância de suas realizações e como elas contribuíram para o local que você já trabalhou. Se você ainda não possui experiência de trabalho para isso, comece com projetos independentes e fale como você superou desafios neles, isso mostrará sua iniciativa, capacidade e potencial.

Realizações:

  • Um problema que tenha passado;
  • Como fez para superá-lo (método ou ferramentas);
  • Os resultados obtidos.

Aprenda no Ebook Guia do Emprego Novo, como se preparar para os processos seletivos conhecendo o que se passa pela cabeça dos recrutadores. Adquira agora com pelo link: Guia do Emprego Novo e use o cupom MUNDOJS para ter 40% de desconto.

Novidades: TypeScript 4.0

O TypeScript é uma linguagem baseada no JavaScript, adicionando sintaxe para tipos estáticos. Utiliza uma verificação de tipos para informá-lo de erros antes de executar o código, e então, usa-se o compilador TypeScript para remoção de tipos e deixar com um JavaScript limpo e legível.

Você pode utilizar o TypeScript obtendo-o por npm:

npm install -D typescript

O TypeScript 4.0:

Olhando para a versão 3.0 e anteriores, há um número grande de mudanças. Unificar os tipos de tuple e listas de parâmetros foi um grande destaque. Este lançamento 3.0 também apresentou referências de projeto para auxiliar o dimensionamento, organização e compartilhamento entre bases de código.

No TypeScript 3.7, foram apresentadas uma rica combinação de novos recursos de sistema de tipos com ECMAScript. Vimos referências de tipo recursiva e suporte para funções de estilo de asserção. As atualizações 3.8 e 3.9 trouxeram importações e exportações de tipo, juntamente com recursos do ECMAScript como campos privados, nível superior await em módulos e novas sintaxes.

E o que há de novo na versão 4.0?

Na versão 4.0, foram adicionados:

  • Tipos de tupla variável;
  • Elementos de tupla rotulados;
  • Classe de inferência de propriedade de construtores;
  • Operadores de atribuição de curto-circuito;
  • unknown nas cláusulas catch;
  • JSX customizado;
  • Melhorias de velocidade no build;
  • –incremental com –noEmit;
  • Algumas melhorias no Editor.

Importações automáticas mais inteligentes:

A importação automática torna a codificação mais fácil, mas sempre que ela parece não funcionar, confunde os usuários. As importações automáticas só funcionam em pacotes que seu projeto já inclui. Tudo isso leva a uma experiência de início péssima para quando você está tentando importar automaticamente algo que acabou de instalar, mas ainda não usou.

O TypeScript 4.0 faz um pouco de trabalho extra, incluindo os pacotes que você listou em seus campos. As informações desses pacotes são usadas apenas para melhorar as importações automáticas e não alteram mais nada, como a verificação de tipo.

Configurando 'incluir importações automáticas JSON de pacote'
TypeScript: Include Package JSON Auto Imports Fonte: https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/

Confira as outras novidades do TypeScript 4.0 no artigo original em: https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/

Gostou desta notícia? Comente abaixo!

Referências: https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/